k8s如何管理Pod(rc、rs、deployment)
使用Replication Controller 来部署、升级Pod
Replica Set – 下一代Replication Controller
Deployment – 更加方便的管理Pod和Replica Set
先举个例子,假设我们有一个Pod在提供线上服务,现在有如下几个场景,大家想想如何应对:
节日活动,网站访问量突增
遭到攻击,网站访问量突增
运行Pod的节点发生故障
第1种情况,活动前预先多启动几个Pod,活动结束后再结束掉多余的,虽然要启动和结束的Pod有点多,但也能有条不紊按计划进行
第2种情况,正在睡觉突然手机响了说网站反应特慢卡得要死,赶紧爬起来边扩容边查找攻击模式、封IP等等……
第3种情况,正在休假突然手机又响了说网站上不去,赶紧打开电脑查看原因,启动新的Pod
Pod需要手动管理,好累……能否在Pod发生问题时自动恢复呢,我们先来看下Replication Controller(以下简称RC)
先说RC是什么。RC保证在同一时间能够运行指定数量的Pod副本,保证Pod总是可用。如果实际Pod数量比指定的多就结束掉多余的,如果实际数量比指定的少就启动缺少的。当Pod失败、被删除或被终结时RC会自动创建新的Pod来保证副本数量。所以即使只有一个Pod也应该使用RC来进行管理。
接下来我们看下如何创建RC,看这个定义文件rc.yaml
这个文件定义了RC的属性,我们先关注如下字段:
spec.replicas:副本数量3
spec.selector:RC通过spec.selector来筛选要控制的Pod
spec.template:这里写Pod的定义(但不需要apiVersion和kind)
spec.template.metadata.labels:Pod的label,可以看到这个label与spec.selector相同
这个文件的意思是定义了一个RC对象,它的名字是hello-rc(metadata.name:hello-rc),保证有3个Pod运行(spec.replicas:3),Pod的镜像是index.tenxcloud.com/tailnode/hello:v1.0(spec.template.spec.containers.image: index.tenxcloud.com/tailnode/hello:v1.0)关键在于spec.selector与spec.template.metadata.labels,这两个字段必须相同,否则下一步创建RC会失败。(也可以不写spec.selector,这样默认与spec.template.metadata.labels相同)
现在通过kubectl来创建RC:
查看结果可以看到当前RC的状态:指定了需要3个Pod、当前实际有3个Pod、3个Pod都在运行中(图片较大只截取部分):
如果使用的镜像较大查看状态可能是Waiting,这是因为正在下载镜像,等待一段时间就好。
上面说过RC会自动管理Pod保证指定数量副本运行,我们来实验一下,看下图:1.查看当前Pod,(注意NAME和AGE列)
2.删除hello-rc-5crgq
3.再次查看Pod,发现新的Pod启动了(注意NAME和AGE列)
到这里我们对RC有了基本的认识,并进行了简单的使用。
现在回到最开始的问题,如何通过RC修改Pod副本数量。其实非常简单,只需要修改yaml文件spec.replicas字段成想要的值,然后执行kubectl replace命令(或者使用kubect edit replicationcontroller hello-rc直接修改)
执行结果看下图:
当我们有新功能发布或修复BUG时使用滚动升级是不错的选择,可以使用工具kubectl rolling-update完成这个任务。对照下图我们来看下是如何进行的
使用命令kubectl rolling-update hello-rc –image=index.tenxcloud.com/tailnode/hello:v2.0在另一个窗口查看RC
对照两张截图,我们能够看出升级步骤如下:
创建一个使用新版本Pod的RC,hello-rc-4f7ed44b6db1e20aa1bc681c81d63caf
依次增加新RC的副本数量、减少旧RC的副本数量
当升级成功后,删除旧RC
重命名新RC为hello-rc
当Pod中只有一个容器时通过--image参数指定新的Tag,如果有多个容器或其他字段的修改时,需要使用kubectl rolling-update NAME -f FILE指定文件
如果在升级过程中出现问题(比如长时间无响应),可以CTRL+C结束再使用kubectl rolling-update hello-rc –-rollback进行回滚,但如果升级完成后出现问题(比如新版本程序出core),此命令无能为力,需要使用同样方法“升级”为旧版本
在时速云平台我们能够非常方便的使用弹性伸缩功能来调整Pod副本数量,还是举例说明:
启动一个能够输出Pod主机名和版本号的服务,看下图当前只有一个Pod副本运行点击弹性伸缩,修改数量为3,同时使用下面的命令测试,从输出结果可以看出提供服务的Pod数量变成了3个:
下面再来测试下灰度升级功能,修改目标版本为v2.0(之前是v1.0,为了便于查看效果新建有2个Pod的服务),然后查看Pod变化
第一个新Pod hello-v2.0-ywcc2已经启动第二个新Pod hello-v2.0-whtvh正在启动
最后一个旧Pod hello-41ee8正在停止
升级完成,只有两个新Pod提供服务
同时使用命令查看服务的响应如下:
k8s是一个高速发展的项目,在新的版本中官方推荐使用Replica Set和Deployment来代替RC。那么它们优势在哪里,我们来看一看:
RC只支持基于等式的selector(env=dev或environment!=qa)但Replica Set还支持新的基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),这对复杂的运维管理带来很大方便
使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作,虽然能够使用命令kubectl rolling-update完成升级,但它是在客户端与服务端多次交互控制RC完成的,所以REST API中并没有rolling-update的接口,这为定制自己的管理系统带来了一些麻烦。
Deployment拥有更加灵活强大的升级、回滚功能
Replica Set目前与RC的区别只是支持的selector不同,后续肯定会加入更多功能。Deployment使用了Replica Set,是更高一层的概念。除非需要自定义升级功能或根本不需要升级Pod,所以推荐使用Deployment而不直接使用Replica Set。
下面我们继续来看Deployment的定义文件,与RC的定义文件基本相同(注意apiVersion还是beta版),所以不再详细解释各字段意思与创建RC相同,使用命令kubectl create -f deployment.yaml –record创建Deployment,注意–record参数,使用此参数将记录后续对创建的对象的操作,方便管理与问题追溯
使用kubectl edit deployment hello-deployment修改spec.replicas/spec.template.spec.container.image字段来完成扩容缩容与滚动升级(比kubectl rolling-update速度快很多)
修改image字段为新版本镜像后查看Pod,在STATUS列看到正在执行升级的Pod:
使用kubectl rollout history命令查看Deployment的历史信息
上面提到过kubectl rolling-update升级成功后不能直接回滚,不是很方便,那使用Deployment可以吗,答案是肯定的。
首先在上面的命令加上–revision参数,查看改动详细信息如下:然后使用kubctl rollout undo deployment hello-deployment回滚至前一版本(使用--to-revision参数指定版本)即可。
命令kubectl describe deployment hello-deployment查看详细信息,在Message一列看到回滚如下,详细的信息记录对于问题发生后的原因查找有很大帮助:
通过对比RC、Replica Set与Deployment,可以看出新的Replica Set与Deployment比RC要强大易用很多,但因为现在还是beta版本所以不建议在生产环境使用,不过相信不久的将来我们就能使用上。
k8s如何管理Pod(rc、rs、deployment)的更多相关文章
- 管理Pod(rc,rs,deployment)
1.概述 可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在k8s中我们不会直接操作容器,而是把容器包装成Pod再进行管理. 2.管理Pod a. 使用Repl ...
- k8s几种pod的控制器
replicationcontroller 选择器 模版 副本数 如果更改选择器,则会创建新的pod 如果更改pod的标签,那么也会创建新的pod进行替换,但是老的pod不会被删除 如果更改模版, ...
- 3.k8s资源控制器rs Deployment Job
k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...
- kubernetes云平台管理实战:deployment通过标签管理pod(十)
一.kubectl run命令拓展 1.RC创建 [root@k8s-master ~]# kubectl run web --generator=run/v1 --image=10.0.128.0: ...
- [转帖] Kubernetes如何使用ReplicationController、Replica Set、Deployment管理Pod ----文章很好 但是还没具体操作实践 也还没记住.
Kubernetes如何使用ReplicationController.Replica Set.Deployment管理Pod https://blog.csdn.net/yjk13703623757 ...
- 【K8S】K8S-网络模型、POD/RC/SVC YAML 语法官方文档
K8S-网络模型.POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestration kubernetes/kub ...
- k8s管理pod资源对象(上)
一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...
- k8s 中的 Pod 细节了解
k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...
- Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring C ...
随机推荐
- 阿里云Redis外网转发访问
1.前提条件 如果您需要从本地 PC 端访问 Redis 实例进行数据操作,可以通过在 ECS 上配置端口映射或者端口转发实现.但必须符合以下前提条件: 若 Redis 实例属于专有网络(VPC),E ...
- it面试技巧
一:请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有.其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识领域 ...
- C#图片处理(转zhjzwl/archive)
基本原理: 获取每一个像素值,然后处理这些每一个像素值. 原始图片: ISINBAEVA ~~~~~~~~ 一. 底片效果 原理: GetPixel方法获得每一点像素的值, 然后再使用SetPix ...
- Ubuntu Google Chrome
Chrome安装 添加下载源 sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.l ...
- OpenGL 笔记 <2> Compiling and Linking a shader program
Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ...
- 数据库——SQL数据连接查询
连接查询 查询结果或条件涉及多个表的查询称为连接查询SQL中连接查询的主要类型 广义笛卡尔积 等值连接(含自然连接) 自身连接查询 外连接查询 一.广义笛卡尔积 不带连 ...
- Linux内核分析第五章读书笔记
第五章 系统调用 在操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色,保证系统稳定可靠,避免应用程序肆意妄行. 5.1 与内核通信 系统调用在用户空 ...
- 《Linux内核设计与实现》Chapter 5 读书笔记
<Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...
- C++:多态浅析
1.多态 在C++中由两种多态性: • 编译时的多态性:通过函数的重载和运算符的重载来实现的 • 运行时的多态性:通过类继承关系和虚函数来实现的 特别注意: a.运行时的多态性是指程序执行前,无法根据 ...
- nginx安装(转发)
Nginx("engine x")是一款轻量级的HTTP和反向代理服务器.相比于Apache.lighttpd等,它具有占有内存少.并发能力强.稳定性高等优势.它最常见的用途就是提 ...