七 控制器配置清单
七 控制器配置清单
7.1 ReplicaSet
详见:kubectl explain replicaset
- 清单规范
7.1.1 replicaset.spec 规范
-
replicas 副本数量,指定一个数字
-
selector 标签选择器,可以使用 matchLabels、matchExpressions 两种类型的选择器来选中目标 POD
- template 模板,这里面定义的就是一个 POD 对象,这个对象只包含了 pod.metadata 和 pod.spec 两部分。
7.1.2 清单示例
7.2 Deployment
Deployment 通过控制 ReplicaSet 来实现功能,除了支持 ReplicaSet 的扩缩容意外,还支持滚动更新和回滚等,还提供了声明式的配置,这个是我们日常使用最多的控制器。它是用来管理无状态的应用。
Deployment 在滚动更新时候,通过控制多个 ReplicaSet 来实现,ReplicaSet 又控制多个 POD,多个 ReplicaSet 相当于多个应用的版本。
- 清单规范,详见:kubectl explain deployment
7.2.1 replicaset.spec 对象规范
-
replicas 副本数量,指定一个数字
-
selector 标签选择器,可以使用 matchLabels、matchExpressions 两种类型的选择器来选中目标 POD
-
template 模板,这里面定义的就是一个 POD 对象,这个对象只包含了 pod.metadata 和 pod.spec 两部分。
-
strategy 更新策略,支持滚动更新、支持滚动更新的更新方式
-
Recreate:替换更新会先删除旧的容器组,在创建新的容器组,升级过程中业务会中断
-
RollingUpdate:滚动更新将逐步用新版本的实例替代旧版本的实例,升级过程中,业务流量会同时负载到新旧两个版本的POD上,因此业务不会中断。
- revisionHistoryLimit 滚动更新后最多保存多少个更新的历史版本,值为一个数字
- paused 当更新启动后控制是否暂停
minReadySeconds
阻止出错版本的滚动更新,指定新创建的pod至少要运行多久之后,才能将其视为可用spec.template.spec.readinessProbe
配置就绪探针来阻止错误版本的滚动更新
7.2.2 清单示例
7.2.3 关于更新
- 直接修改清单文件,kubectl apply -f deployment.yaml
- 使用 kubectl patch 使用 json 格式给出更新的内容
- 仅更新镜像 kubectl set image
7.2.4 模拟金丝雀发布
- 在更新刚刚启动的时候,将更新过程暂停,那么只能更新一个,这实现了在集群中增加一个金丝雀版本
- 查看已经被更新中被暂停的控制器状态,可以看到一直处于暂停状态的 deployment
- 如果金丝雀没有问题,那么继续可以使用继续更新的命令
7.2.5 更新策略
- 最大不可用为 0 ,更新时候可以临时超出1个
7.2.6 关于回滚
- rollout undo 是回滚的命令,默认滚回上一版本
- 查看可以回滚的版本
- rollout undo 指定回滚的版本
- 查看当前的工作版本
7.3 DaemonSet
- 清单规范,详见 kubectl explain daemonset
7.3.1 DaemonSet.spec规范
此处只列举不同之处
- updateStrategy 更新策略,支持滚动更新、支持滚动更新的更新方式,默认滚动更新每个 node
7.3.2 清单示例
7.3.3 关于更新
- 更新 filebeat-daemonset 这个 daemonset 控制器下的 filebeat 容器的镜像
7.4 Job
7.4.1 Job应用场景及格式
一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod
格式:
- spec.template 格式同 Pod,是必需的字段
- RestartPolicy 仅支持 Never 或 OnFailure
- 单个 Pod 时,默认 Pod 成功运行后 Job 即结束
.spec.completions
标志 Job 结束需要成功运行的 Pod 个数,默认为 1.spec.parallelism
标志并行运行的 Pod 的个数,默认为 1.spec.activeDeadlineSeconds
标志失败 Pod 的重试最大时间,超过这个时间不会继续重试.spec.ttlSecondsAfterFinished
设置自动清理Job的时间,清理job时会删除所有依赖的对象,包括pod以及job本身
7.4.2 清单示例
7.5 CronJob
7.5.1 应用场景
CronJob 创建基于时隔重复调度的 Jobs。
CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 执行某个 Job。
7.5.2 清单示例
7.5.3 Cron 时间表语法
输入 | 描述 | 相当于 |
---|---|---|
@yearly (or @annually) | 每年 1 月 1 日的午夜运行一次 | 0 0 1 1 * |
@monthly | 每月第一天的午夜运行一次 | 0 0 1 * * |
@weekly | 每周的周日午夜运行一次 | 0 0 * * 0 |
@daily (or @midnight) | 每天午夜运行一次 | 0 0 * * * |
@hourly | 每小时的开始一次 | 0 * * * * |
例如,下面这行指出必须在每个星期五的午夜以及每个月 13 号的午夜开始任务:
要生成 CronJob 时间表表达式,你还可以使用 crontab.guru 之类的 Web 工具。
参考链接
- Kubernetes offical doc —job: https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/
- Kubernetes offical doc — CronJob: https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/
- kubernetes hanbook — job: https://www.bookstack.cn/read/feiskyer-kubernetes-handbook/concepts-job.md