目录

1. 什么是 Kubernetes 控制器

2. 控制器的核心工作原理

3. 控制器与 API Server 的协作方式

4. 常见的控制器类型

4.1 ReplicaSet 控制器

4.2 Deployment 控制器

4.3 StatefulSet 控制器

4.4 DaemonSet 控制器

4.5 Job控制器

4.6CronJob 控制器

5. 控制器与 Operator 的关系

6. 总结

1. 什么是 Kubernetes 控制器

Kubernetes 控制器(Controller)是集群中负责维持系统期望状态(Desired State)的核心组件。它通过持续监控集群中资源的实际状态(Actual State),并与用户声明的期望状态进行对比,一旦发现偏差,就采取相应操作进行调和,使实际状态不断趋近于期望状态。

这种「声明式 API + 控制器调和」的设计模式,是 Kubernetes 区别于传统命令式运维工具的关键所在。用户只需要告诉集群「我想要什么」,而不需要关心「具体怎么做」,控制器会负责把当前状态逐步调整到目标状态。

2. 控制器的核心工作原理

控制器的运行逻辑可以概括为一个不断循环的「控制回路」(Control Loop),主要包含以下三个步骤:

  1. 观察(Observe):通过 API Server 监听或轮询等方式,获取目标资源的当前实际状态。
  2. 对比(Compare):将实际状态与用户声明的期望状态进行比对,判断是否存在差异。
  3. 行动(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,也能为深入理解云原生架构打下坚实基础。

更多推荐