前言

在k8s中, 使用一个对象去控制另一个对象的形式被称之为 控制器模式 , 控制器模式有很多实现, Depolyment, Job, CronJob 等, 这里针对 Deployment 进行简单说明.

Deployment 看似简单,但实际上,它实现了 Kubernetes 项目中一个非常重要的功能:Pod 的“水平扩展 / 收缩”(horizontal scaling out/in)

对于 Deployment 来说, 它说管理的 Pod 都是一样的, 相互之间没有顺序, 也无所谓运行在哪台宿主机上。需要的时候,Deployment 就可以通过 Pod 模板创建新的 Pod;不需要的时候,Deployment 就可以“杀掉”任意一个 Pod。

ReplicaSet

在k8s 中, Deployment 可以实现滚动更新的方式, 而这个能力依赖于 k8s 中的重要API对象 ReplicaSet

ReplicaSet 由一个 replicas 和 PodTemplate 组成 (Spec 中), 而 Deployment 实际操作的, 是 ReplicaSet 而非直接的 Pod 对象

这个关系如下图所示, ReplicaSet 负责通过“控制器模式”,保证系统中 Pod 的个数永远等于指定的个数(比如,3 个)。这也正是 Deployment 允许容器的 restartPolicy=Always 的主要原因:只有在容器能保证自己始终是 Running 状态的前提下,ReplicaSet 调整 Pod 的个数才有意义。

而在此基础上,Deployment 同样通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作。

执行命令 kubectl scale deployment nginx-deployment --replicas=4 即可完成水平扩张/收缩

执行命令 kubectl get rs 可以查看 ReplicaSet , 每个ReplicaSet 都会在它说管控的 Pod 下添加 key为 pod-template-hash 的 Label

就绪判断

通过设置 ReplicaSetspec.minReadySeconds 可以指定, 在启动后的多长时间内, 如果容器未发生崩溃等异常情况, 可以被视为 就绪 , 默认为0秒, 一旦就绪性探测成功, 即被认为可用.

Deployment

执行 kubectl get deployments 可以看到如下信息

其中 DESIRED 代表用户期望的Pod副本个数, CURRENT 表示当前处于 Running 状态的 Pod 个数, UP-TO-DATE 表示当前处于最新版本的 Pod 个数, AVAILABLE 表示当前已经可用的Pod个数(即既是Running状态, 又是最新版本, 并且已经处于Ready状态的Pod个数)

手动扩容