Kubernetes 控制器
目录
1. 什么是 Kubernetes 控制器
Kubernetes 控制器(Controller)是集群中负责维持系统期望状态(Desired State)的核心组件。它通过持续监控集群中资源的实际状态(Actual State),并与用户声明的期望状态进行对比,一旦发现偏差,就采取相应操作进行调和,使实际状态不断趋近于期望状态。
这种「声明式 API + 控制器调和」的设计模式,是 Kubernetes 区别于传统命令式运维工具的关键所在。用户只需要告诉集群「我想要什么」,而不需要关心「具体怎么做」,控制器会负责把当前状态逐步调整到目标状态。
2. 控制器的核心工作原理
控制器的运行逻辑可以概括为一个不断循环的「控制回路」(Control Loop),主要包含以下三个步骤:
- 观察(Observe):通过 API Server 监听或轮询等方式,获取目标资源的当前实际状态。
- 对比(Compare):将实际状态与用户声明的期望状态进行比对,判断是否存在差异。
- 行动(Act):如果存在差异,则调用 Kubernetes API 执行创建、删除、更新等操作,使实际状态向期望状态收敛。
这一过程会不断重复执行,从而保证即使发生 Pod 崩溃、节点宕机等异常情况,系统也能自动恢复到用户期望的状态。
3. 控制器与 API Server 的协作方式
控制器本身并不直接操作节点或容器运行时,而是通过 Kubernetes API Server 进行间接管理。控制器作为 API Server 的客户端,通过 List 和 Watch 机制获取资源变化事件,再通过创建、更新、删除等 API 请求来驱动系统状态变化。
这种架构带来了两个重要好处:一是控制器与底层基础设施解耦,便于扩展新的资源类型;二是所有状态变更都经过 API Server 持久化到 etcd,保证了集群状态的一致性和可追溯性。
4. 常见的控制器类型
Kubernetes 内置了多种控制器,分别负责管理不同类型的资源对象。下面介绍几种最常用的控制器。
4.1 ReplicaSet 控制器
ReplicaSet 负责维护一组 Pod 副本的数量稳定。用户在 ReplicaSet 中声明期望的副本数,控制器会持续检查当前存活的 Pod 数量,当数量不足时创建新的 Pod,当数量超出时删除多余的 Pod。它通常不直接使用,而是作为 Deployment 的底层组件存在。

1.建立控制器
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > repset.yml
[root@master controler]# vim repset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f repset.yml
#打开一个新的shell
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:08:32 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-tbxq4 1/1 Running 0 6m49s app=webcluster
webcluster-jna23 1/1 Running 0 6m49s app=webcluster
#拉伸
kubectl scale replicaset webcluster --replicas 4
kubectl scale replicaset webcluster --replicas 2
kubectl scale replicaset webcluster --replicas 0
2.测试功能
[root@master controler]# vim repset.yml
。。。。
spec:
replicas: 4
。。。。
[root@master controler]# kubectl apply -f repset.yml
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:11:06 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-4sxz4 1/1 Running 0 13s app=webcluster
webcluster-lvtsn 1/1 Running 0 13s app=webcluster
webcluster-tbxq4 1/1 Running 0 9m23s app=webcluster
webcluster-tr5qk 1/1 Running 0 13s app=webcluster
4.2 Deployment 控制器

Deployment 是实际工作中使用最频繁的控制器之一,它在 ReplicaSet 之上增加了滚动更新、回滚、版本管理等能力。当用户更新 Deployment 的镜像版本时,控制器会按照配置的策略逐步创建新版本 Pod,并平滑下线旧版本 Pod,从而实现在不中断服务的情况下完成应用升级。
1.监控
[root@master ~]# watch -n 1 " kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"
2.建立deployment控制器
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > dep.yml
[root@master controler]# vim dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
# resources: {}
[root@master controler]# kubectl apply -f dep.yml
#监控部分显示效果
Every 1.0s: kubectl get pods --show-labels;echo ====;kubectl get replicase... master: Sat Apr 11 10:43:24 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-49kh5 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-m2x2d 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
====
NAME DESIRED CURRENT READY AGE
webcluster-77c87d9946 2 2 2 45s
#发布服务
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
[root@master controler]# kubectl describe services webcluster
Name: webcluster
Namespace: default
Labels: app=webcluster
Annotations: <none>
Selector: app=webcluster
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.107.142.60
IPs: 10.107.142.60
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.6:80,10.244.1.9:80
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
#访问:
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
3.升级和回滚
#升级
[root@master controler]# vim dep.yml
。。。。
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v2 #升级为版本2
name: myapp
。。。。
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
#回滚
[root@master controler]# vim dep.yml
。。。。
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1 #回滚为版本1
name: myapp
。。。。
[root@master controler]# kubectl apply -f dep.yml
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4.版本更新管理及优化
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 6 #把pod数量设定为6方便观察
selector:
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
4.1查看更新策略信息
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge
4.2设定更新策略
[root@master controler]# vim dep.yml
,,,,,,,
spec:
minReadySeconds: 5
replicas: 6
selector:
matchLabels:
app: webcluster
strategy:
rollingUpdate:
maxSurge: 1 #更新时pod数量最多比期望值多一个
maxUnavailable: 0 #不能使用pod数量比期望值数量多0
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f dep.yml
4.3更新暂停和恢复
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
7 <none>
8 <none>
[root@master controler]# kubectl rollout pause deployment webcluster #暂停更新
deployment.apps/webcluster paused
[root@master controler]# vim dep.yml
。。。
containers:
- image: myapp:v2
name: myapp
。。。
[root@master controler]# kubectl apply -f dep.yml #执行成功。但更新过程在监控中没出现
deployment.apps/webcluster configured
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
7 <none>
8 <none>
[root@master controler]# kubectl rollout resume deployment webcluster #开启更新
deployment.apps/webcluster resumed
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
8 <none>
9 <none>
4.3 StatefulSet 控制器
StatefulSet 专门用于管理有状态应用,例如数据库、消息队列等。与 Deployment 不同,StatefulSet 为每个 Pod 提供稳定的网络标识和持久化存储,Pod 的创建和删除顺序也是严格可控的,适合需要稳定身份和有序部署的场景。
4.4 DaemonSet 控制器

DaemonSet 确保集群中的每个节点(或指定节点)都运行一个 Pod 副本。当新节点加入集群时,DaemonSet 会自动在该节点上创建 Pod;当节点被移除时,对应的 Pod 也会被回收。它非常适合部署日志采集、监控代理、网络插件等节点级组件。
[root@master controler]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml > daemonset.yml
[root@master controler]# vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: daemonset
name: daemonset
spec:
selector:
matchLabels:
app: daemonset
template:
metadata:
labels:
app: daemonset
spec:
containers:
- image: myapp:v1
name: myapp
#另外开启一个主机node3,并设定在初始化集群时的所有设定确保所有服务的开启
#在master中重新生成集群主机注册时需要的token
[root@master controler]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927
[root@node3 ~]# kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socket unix:///var/run/cri-dockerd.sock
#当node3加入集群后会在node3中立即群星指定的pod,其原因是因为运行了daemonset
#可以在master中观察pod的状态
4.5 Job控制器

Job 控制器用于管理一次性任务,确保指定数量的 Pod 成功运行并正常退出。CronJob 则在 Job 的基础上增加了定时调度能力,可以按照 Cron 表达式周期性地创建 Job,适用于数据备份、定时报表、批量处理等场景。
[root@master ~]# docker load -i perl-5.34.tar.gz
[root@master ~]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0
[root@master ~]# docker login reg.timinglee.org -u admin
Password:
Login Succeeded
[root@master ~]# docker push reg.timinglee.org/library/perl:5.34.0
[root@master controler]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
[root@master controler]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: job
spec:
completions: 6
parallelism: 2
template:
spec:
containers:
- image: perl:5.34.0
name: job
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
[root@master controler]# kubectl apply -f job.yml
job.batch/job created
[root@master controler]# kubectl logs job-4b45g
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310
4.6CronJob 控制器

[root@master controler]# kubectl create cronjob cronjob --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[root@master controler]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob
spec:
jobTemplate:
metadata:
name: cronjob
spec:
template:
spec:
containers:
- image: busybox
name: cronjob
command:
- /bin/sh
- -c
- echo "hello timinglee"
restartPolicy: OnFailure
schedule: '* * * * *'
[root@master controler]# kubectl apply -f cronjob.yml #整分运行
[root@master controler]# kubectl get cronjobs.batch
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob * * * * * <none> False 0 17s 70s
[root@master controler]# kubectl logs cronjob-29598241-pxggh
hello timinglee
5. 控制器与 Operator 的关系
除了内置控制器,Kubernetes 还支持用户通过自定义资源(CRD)和自定义控制器来扩展集群能力,这种模式被称为 Operator 模式。Operator 本质上是针对特定应用领域编写的控制器,它将运维人员的领域知识编码到自动化逻辑中,能够处理备份、升级、故障恢复等复杂运维任务。
例如,etcd-operator、prometheus-operator 等开源项目,都是通过 Operator 模式实现对特定组件的自动化管理。理解内置控制器的工作原理,是学习和编写 Operator 的重要基础。
6. 总结
Kubernetes 控制器是集群自动化管理的核心引擎,它通过「观察、对比、行动」的控制回路,持续将系统实际状态调和到用户声明的期望状态。Deployment、StatefulSet、DaemonSet、Job 等内置控制器覆盖了绝大多数常见工作负载类型,而 Operator 模式则进一步将控制器的能力扩展到任意领域。
掌握控制器的设计思想和运行机制,不仅有助于更好地使用 Kubernetes,也能为深入理解云原生架构打下坚实基础。
更多推荐

所有评论(0)