一 、什么是控制器
控制器也是管理pod的一种手段
自主式pod:pod退出或意外关闭后不会被重新创建
二 控制器常用类型制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod
当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复
二 、控制器常用类型
2.1 控制器的名称以及用途
Deployment #管理无状态应用的核心控制器,通过 ReplicaSet 维护 Pod 副本数,支持滚动更新、版本回滚、手动扩缩容,是最常用的无状态服务部署方式(如 Web 服务、API 服务)
ReplicaSet #确保集群中始终运行指定数量的 Pod 副本,是 Deployment 的底层依赖组件,不建议直接使用(优先通过 Deployment 管理)。
DaemonSet #在集群的每个节点(或指定节点) 上运行且仅运行一个 Pod 副本,适用于节点级组件(如日志采集 Agent、监控代理、网络插件、节点防火墙)。
StatefulSet #管理一次性任务的 Pod,任务执行完成后 Pod 自动终止,适用于数据备份、一次性数据计算、批量数据处理、应用初始化等临时任务。
Job#管理一次性任务的 Pod,任务执行完成后 Pod 自动终止,适用于数据备份、一次性数据计算、批量数据处理、应用初始化等临时任务。
CronJob#基于时间调度的 Job(类比 Linux crontab),支持定时 / 周期性触发 Job 执行,适用于定时备份、定时生成报表、定时清理日志、定时检测服务状态等场景。
三 、replicaset控制器
3.1 replicaset功能
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet
ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制
3.2 replicaset参数说明

3.3 replicaset 示例
kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml
生成配置文件

kubectl apply -f replicaset.yml 应用配置文件 创建
kubectl label pod replicaset-l4xnr app=timinglee --overwrite #replicaset是通过标签匹配pod

kubectl label pod replicaset-example-q2sq9 app- #恢复标签后
会保持副本数量是你 指定的量
#replicaset自动控制副本数量,pod可以自愈
kubectl delete pods replicaset-t2s5p
会自动生成一个
四 、deployment 控制器
4.1 deployment控制器的功能
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。
Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod
Deployment管理ReplicaSet,ReplicaSet管理Pod
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法
在Deployment中ReplicaSet相当于一个版本
4.2 deployment控制器示例
kubectl create deployment deployment --image myapp:v1 --dry-run=client -o yaml > deployment.yml 生成配置文件

可以修改这个版本来实现版本的迭代
更新的过程是重新建立一个版本的RS,新版本的RS会把pod 重建,然后把老版本的RS回收
在实际生产环境中我们做的变更可能不止一处,当修改了一处后,如果执行变更就直接触发了
我们期望的触发时当我们把所有修改都搞定后一次触发
暂停,避免触发不必要的线上更新
kubectl rollout pause deployment deployment-example暂停的时候你跟新版本然后应用配置文件不生效
kubectl rollout resume deployment deployment-example 恢复侯生效更新
五 、daemonset控制器
5.1 daemonset功能
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod ,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod
DaemonSet 的典型用法:
在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用
一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求
5.2 daemonset 示例
vim daemonset-example.yml


六、 job 控制器
6.1 job控制器功能
Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务
Job特点如下:
当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
当成功结束的pod达到指定的数量时,Job将完成执行
6.2 job 控制器示例
vim job.yml

关于重启策略设置的说明:
如果指定为OnFailure,则job会在pod出现故障时重启容器
而不是创建pod,failed次数不变
如果指定为Never,则job会在pod出现故障时创建新的pod
并且故障pod不会消失,也不会重启,failed次数加1
如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了
七 、cronjob 控制器
Cron Job 创建基于时间调度的 Jobs。
CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,
CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。
CronJob可以在特定的时间点(反复的)去运行job任务。