Kubernetes的资源控制器ReplicationController(RC)、ReplicaSet(RS)、Deployment(Deploy)详解与示例
主机配置规划
服务器名称(hostname) | 系统版本 | 配置 | 内网IP | 外网IP(模拟) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
什么是控制器
kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为。
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job/CronJob
- HorizontalPodAutoscaler
ReplicationController 和 ReplicaSet
ReplicationController (RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而异常多出来的容器也会自动回收。
在新版的Kubernetes中建议使用ReplicaSet (RS)来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,但ReplicaSet支持集合式selector。
虽然 ReplicaSets 可以独立使用,但如今它主要被Deployments 用作协调 Pod 的创建、删除和更新的机制。当使用 Deployment 时,你不必担心还要管理它们创建的 ReplicaSet,Deployment 会拥有并管理它们的 ReplicaSet。
ReplicaSet 是下一代的 Replication Controller。 ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持。ReplicaSet 支持新的基于集合的选择器需求,这在标签用户指南中有描述。而 Replication Controller 仅支持基于相等选择器的需求。
Deployments
Deployment 控制器为 Pods和 ReplicaSets提供描述性的更新方式。用来替代以前的ReplicationController以方便管理应用。
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
ReplicaSet示例
yaml文件
1 | [root@k8s-master controller]# pwd |
创建ReplicaSet,并查看rs状态与详情
1 | [root@k8s-master controller]# kubectl apply -f ReplicaSet-01.yaml |
查看pod状态信息
1 | [root@k8s-master controller]# kubectl get pod -o wide --show-labels |
删除一个pod,然后再次查看
1 | [root@k8s-master controller]# kubectl delete pod frontend-kltwp |
由上可见,rs又新建了一个pod,保证了pod数总是为3.
Deployment示例
创建 Deployment
yaml文件
1 | [root@k8s-master controller]# pwd |
selector 字段定义 Deployment 如何查找要管理的 Pods。 在这种情况下,会选择在 template(Pod)模板中定义的标签labels(app: nginx)。但更复杂的选择规则是可能的,只要 template (Pod) 模板本身满足规则。
启动deployment,并查看状态
1 | [root@k8s-master controller]# kubectl apply -f nginx-deployment-1.17.1.yaml --record |
参数说明:
- NAME:列出集群中 Deployments 的名称
- READY:已就绪副本数/期望副本数
- UP-TO-DATE:显示已更新和正在更新中的副本数
- AVAILABLE:显示应用程序可供用户使用的副本数
- AGE:显示运行的时间
查看ReplicaSet状态
1 | [root@k8s-master controller]# kubectl get rs -o wide |
参数说明:
- NAME:列出集群中 ReplicaSet的名称
- DESIRED:期望副本数
- CURRENT:当前副本数
- READY:已就绪副本数
- AGE:运行时间
查看pod状态
1 | [root@k8s-master controller]# kubectl get pod -o wide |
1 | [root@k8s-master controller]# kubectl get deployment -o wide --show-labels |
1、ReplicaSet 的名称始终被格式化为[DEPLOYMENT-NAME]-[RANDOM-STRING]
。随机字符串是随机生成,并使用 pod-template-hash 作为选择器和标签。
2、Deployment 控制器将 pod-template-hash 标签添加到 Deployment 创建或使用的每个 ReplicaSet 。此标签可确保 Deployment 的子 ReplicaSets 不重叠。因此不可修改。
3、注意Deployment、ReplicaSet和Pod三者的名称关系
更新 Deployment
Deployment 可确保在更新时仅关闭一定数量的 Pods。默认情况下,它确保至少 75%所需 Pods 运行(25%最大不可用)。
Deployment 更新过程中还确保仅创建一定数量的 Pods 且高于期望的 Pods 数。默认情况下,它可确保最多增加 25% 期望 Pods 数(25%最大增量)。
备注:实际操作中如果更新Deployment,那么最好通过yaml文件更新,这样回滚到任何版本都非常便捷,而且更容易追述;而不是通过命令行。
如下Deployment示例,由于只有3个副本。因此更新时不会先删除旧的pod,而是先新建一个pod。新pod运行时,才会删除对应老的pod。一切的前提都是为了满足上述的条件。
需求:更新 nginx Pods,从当前的1.17.1版本改为1.17.5版本。
1 | # 方式一 |
要查看更新状态
1 | [root@k8s-master controller]# kubectl rollout status deployment/nginx-deployment |
1 | [root@k8s-master controller]# kubectl get deployment -o wide --show-labels |
1 | [root@k8s-master controller]# kubectl get deployment -o wide --show-labels |
通过查询Deployment详情,知晓pod替换过程
1 | [root@k8s-master controller]# kubectl describe deploy nginx-deployment |
多 Deployment 动态更新
当 Deployment 正在展开进行更新时,Deployment 会为每个更新创建一个新的 ReplicaSet 并开始向上扩展,之前的 ReplicaSet 会被添加到旧 ReplicaSets 队列并开始向下扩展。
例如,假设创建一个 Deployment 以创建 nginx:1.7.9 的 5 个副本,然后更新 Deployment 以创建 5 个 nginx:1.9.1 的副本,而此时只有 3 个nginx:1.7.9 的副本已创建。在这种情况下, Deployment 会立即开始杀死3个 nginx:1.7.9 Pods,并开始创建 nginx:1.9.1 Pods。它不等待 nginx:1.7.9 的 5 个副本完成后再更新为nginx:1.9.1。
回滚 Deployment
yaml文件方式
针对应用的每个镜像版本,都有对应deploy的yaml文件。不管是升级还是回滚都已轻松应对。如下
1 | nginx-deployment-1.15.6.yaml |
yaml文件中的信息,参考上文即可。
命令行方式
假设在更新 Deployment 时犯了一个拼写错误,将镜像名称命名为了 nginx:1.1710 而不是 nginx:1.17.10
1 | [root@k8s-master controller]# kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 --record |
查看Deployment、ReplicaSet、Pod信息
1 | [root@k8s-master controller]# kubectl get deploy -o wide --show-labels |
操作步骤如下:
检查 Deployment 修改历史
1 | [root@k8s-master controller]# kubectl rollout history deployment/nginx-deployment |
查看修改历史的详细信息,运行
1 | [root@k8s-master controller]# kubectl rollout history deployment/nginx-deployment --revision=3 |
回滚到上一次修改(即版本 3)或指定版本
现在已决定撤消当前更新并回滚到以前的版本
1 | # 回滚到上一版本 |
检查回滚是否成功、 Deployment 是否正在运行
1 | [root@k8s-master controller]# kubectl get deploy -o wide --show-labels |
获取 Deployment 描述信息
1 | [root@k8s-master controller]# kubectl describe deployment |
扩容/缩容Deployment
操作过程如下
1 | [root@k8s-master controller]# kubectl scale deployment/nginx-deployment --replicas=10 |
清理策略Policy
可以在 Deployment 中设置 .spec.revisionHistoryLimit,以指定保留多少该 Deployment 的 ReplicaSets数量。其余的将在后台进行垃圾回收。默认情况下,是10。
注意:此字段设置为 0 将导致清理 Deployment 的所有历史记录,因此 Deployment 将无法通过命令行回滚。
相关阅读
1、Kubernetes K8S之kubectl命令详解及常用示例
完毕!