一、什么是控制器
K8s 控制器是管理 Pod 的核心对象,工作模式为调谐循环(Reconciliation)。
- 控制器持续监听集群状态,对比期望状态 和集群实际状态。
- 如果实际状态和期望状态不一致,控制器自动调整,让集群达到期望状态。
- 直接创建裸 Pod,Pod 崩溃后不会自动重建;由控制器管理的 Pod,故障后控制器会自动重建 Pod,实现自愈。
- 控制器通过标签选择器 selector匹配管控对应的 Pod。
二、控制器常用类型
K8s 内置多种控制器,分别适配不同业务场景:
- ReplicaSet(RS):维护指定数量 Pod 副本,底层副本控制器。
- Deployment:生产最常用,管理无状态应用,基于 RS 实现滚动更新、版本回滚。
- DaemonSet:在集群节点运行 Pod,每个节点仅运行一个 Pod 副本。
- Job:一次性任务控制器,保证任务 Pod 成功执行完成。
- CronJob:定时任务控制器,基于 cron 表达式周期性生成 Job 执行任务。
补充:还有 StatefulSet 用于有状态应用,RC 旧版副本控制器,现已淘汰。
三、ReplicaSet (RS)
1. 作用
保证集群中始终运行指定副本数量的 Pod。如果 Pod 删除、异常退出,RS 自动新建 Pod 补齐副本。
2. 核心组成
replicas:期望 Pod 副本数量selector:标签选择器,匹配需要管理的 Podtemplate:Pod 模板,RS 创建 Pod 时使用该模板
3. 特点
- 支持集合式标签选择器,功能是 RC 的升级版。
- 实际生产环境不直接操作 RS,Deployment 会自动创建并管理 ReplicaSet。
- RS 仅负责维持副本数量,本身不支持滚动更新、版本回滚。
bash
#生成yml文件
[root@k8s-master ~]# kubectl create deployment replicaset --image myapp:v1 --
dry-run=client -o yaml > replicaset.yml
[root@k8s-master ~]# vim replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset #指定pod名称,一定小写,如果出现大写报错
spec:
replicas: 2 #指定维护pod数量为2
selector: #指定检测匹配方式
matchLabels: #指定匹配方式为匹配标签
app: myapp #指定匹配的标签为app=myapp
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: myapp
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master ~]# kubectl apply -f replicaset.yml
replicaset.apps/replicaset created
[root@k8s-master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-l4xnr 1/1 Running 0 96s app=myapp
replicaset-t2s5p 1/1 Running 0 96s app=myapp
#replicaset是通过标签匹配pod
[root@k8s-master ~]# kubectl label pod replicaset-l4xnr app=timinglee --
overwrite
pod/replicaset-l4xnr labeled
[root@k8s-master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-gd5fh 1/1 Running 0 2s app=myapp #新开启的
pod
replicaset-l4xnr 1/1 Running 0 3m19s app=timinglee
replicaset-t2s5p 1/1 Running 0 3m19s app=myapp
#恢复标签后
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app-
[root@k8s2 pod]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-example-q2sq9 1/1 Running 0 3m14s app=nginx
replicaset-example-th24v 1/1 Running 0 3m14s app=nginx
replicaset-example-w7zpw 1/1 Running 0 3m14s app=nginx
#replicaset自动控制副本数量,pod可以自愈
[root@k8s-master ~]# kubectl delete pods replicaset-t2s5p
pod "replicaset-t2s5p" deleted
[root@k8s-master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-l4xnr 1/1 Running 0 5m43s app=myapp
replicaset-nxmr9 1/1 Running 0 15s app=myapp
四、Deployment(生产最常用,管理无状态应用)
Deployment 构建在 ReplicaSet 之上,专门管理无状态应用,业务各个 Pod 完全等价,可以随意销毁重建。
核心能力
- 副本扩缩容:修改 replicas,增加 / 减少 Pod 数量。
- 滚动更新:升级镜像版本,逐步新建新版本 Pod,销毁旧 Pod,业务不中断。
- 版本回滚:升级出现故障,快速回退到之前历史版本。
- 自动维护多套 ReplicaSet 历史记录,用于回滚操作。
更新策略
RollingUpdate:默认,滚动更新,业务不停机。Recreate:先全部删除旧 Pod,再创建新 Pod,业务会中断。
bash
#生成yaml文件
[root@k8s-master ~]# kubectl create deployment deployment --image myapp:v1 --
dry-run=client -o yaml > deployment.yml
[root@k8s-master ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 4
selector:
4.2.1 版本迭代
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: myapp:v1
name: myapp
#建立pod
root@k8s-master ~]# kubectl apply -f deployment.yml
deployment.apps/deployment created
#查看pod信息
[root@k8s-master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
deployment-5d886954d4-2ckqw 1/1 Running 0 23s app=myapp,podtemplate-hash=5d886954d4
deployment-5d886954d4-m8gpd 1/1 Running 0 23s app=myapp,podtemplate-hash=5d886954d4
deployment-5d886954d4-s7pws 1/1 Running 0 23s app=myapp,podtemplate-hash=5d886954d4
deployment-5d886954d4-wqnvv 1/1 Running 0 23s app=myapp,podtemplate-hash=5d886954d4
常用kubectl命令
# 创建deployment
kubectl apply -f deploy.yaml
# 扩缩容副本
kubectl scale deployment nginx-deploy --replicas=5
# 查看滚动更新进度
kubectl rollout status deployment nginx-deploy
# 查看版本历史
kubectl rollout history deployment nginx-deploy
# 回滚到上一个版本
kubectl rollout undo deployment nginx-deploy
五、DaemonSet
DaemonSet 保证集群每一个(符合标签条件)节点上运行且仅运行一个 Pod。
使用场景
- 节点日志采集:filebeat
- 节点监控、代理组件
特点
- 新节点加入集群,DaemonSet 自动在新节点创建 Pod。
- 节点删除,该节点上 DaemonSet 管理的 Pod 随之销毁。
- 不需要配置 replicas 副本数,副本数量等于匹配节点数量。
bash
[root@k8s2 pod]# cat daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations: #对于污点节点的容忍
- effect: NoSchedule
operator: Exists
containers:
- name: nginx
image: nginx
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
NOMINATED NODE READINESS GATES
daemonset-87h6s 1/1 Running 0 47s 10.244.0.8 k8s-master
<none> <none>
daemonset-n4vs4 1/1 Running 0 47s 10.244.2.38 k8s-node2
<none> <none>
daemonset-vhxmq 1/1 Running 0 47s 10.244.1.40 k8s-node1
<none> <none>
六、job控制器
Job 控制器用于一次性批处理任务,保证任务最终成功执行完成。
特点
- Pod 运行异常失败退出,Job 会自动重启 Pod 重试。
- Pod 执行成功正常退出(返回码 0),任务视为完成,不会再重启。
- 关键字段:
completions:总共需要成功完成的 Pod 数量parallelism:最大并发运行 Pod 数量backoffLimit:任务失败最大重试次数
bash
[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
completions: 6 #一共完成任务数为6
parallelism: 2 #每次并行完成2个
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] 计算Π的后
2000位
restartPolicy: Never #关闭后不自动重启
backoffLimit: 4 #运行失败后尝试4重新运行
[root@k8s2 pod]# kubectl apply -f job.yml
七、CronJob控制器
CronJob 在 Job 基础上增加定时调度能力,执行周期性定时任务。
特点
-
使用 Linux cron 表达式:
分 时 日 月 周 -
到触发时间,自动创建 Job 对象,由 Job 去运行 Pod。
-
适用场景:定时备份数据库、定时日志清理。
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup-cronjob
spec:
schedule: "0 2 * * *" # 每天凌晨2点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: busybox
command: ["echo","执行定时备份"]
restartPolicy: OnFailure
总结
- ReplicaSet 负责维持 Pod 副本数,Deployment 底层依赖 RS,不直接使用 RS。
- 无状态 Web 业务优先使用 Deployment,支持滚动更新回滚。
- 节点代理、日志采集组件使用 DaemonSet。
- 一次性脚本任务使用 Job;周期性定时任务使用 CronJob。
- 控制器依靠标签选择器管理 Pod,不要随意修改控制器创建 Pod 的标签。