1 什么是控制器

Kubernetes控制器是集群的“自动运维大脑”,它通过一个永不停止的监控与调整循环,确保你期望的应用状态始终得到维持。它的核心逻辑可以概括为:监控实际状态 → 对比期望状态 → 执行调整操作,让现实向理想靠拢。

例如:你可以把它想象成一个智能恒温器:你设定好期望温度(期望状态),恒温器(控制器)持续测量室温(当前状态),如果太冷或太热,就会自动启动加热或制冷(执行操作),直到温度达标。

2 控制器常用的类型

3 Replicaset控制器

ReplicaSet 的职责非常纯粹和单一:确保集群中始终有指定数量的、完全相同的 Pod 副本在运行。它的工作逻辑就是一个简单的“多退少补”.,工作原理:通过“标签选择器”来管理

  • 多了:如果 Pod 数量超过了期望值(例如你期望3个,但实际有4个),它会随机终止多余的 Pod。
  • 少了:如果 Pod 数量少于期望值(例如期望3个,但实际只有2个),它会立即创建新的 Pod 来补充。

重要提示:标签选择器的设计是不可变更的。一旦 ReplicaSet 创建,你就无法修改它的 selector,如果尝试修改,Kubernetes API 会直接拒绝

3.1 replicaset参数说明

3.2 建立控制器

[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  #定义控制的种类为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

#打开一个新的会话
[root@k8s-master ~]# watch -n 1 kubectl get pods   --show-labels

Every 1.0s: kubectl get pods --show-labels                                                        k8s-master: Wed Aug 26 19:37:27 2026

NAME               READY   STATUS    RESTARTS   AGE    LABELS
webcluster-9zrln   1/1     Running   0          103s   app=webcluster
webcluster-d4xfj   1/1     Running   0          85s    app=webcluster

#拉伸————改变期望数字,ReplicaSet会根据数字来减少或增加pod数量
[root@k8s-master controler]# kubectl  scale replicaset webcluster --replicas 4

Every 1.0s: kubectl get pods --show-labels                                                        k8s-master: Wed Aug 26 19:38:11 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-9zrln   1/1     Running   0          2m27s   app=webcluster
webcluster-d4xfj   1/1     Running   0          2m9s    app=webcluster
webcluster-gp28q   1/1     Running   0          2m27s   app=webcluster
webcluster-zhkpx   1/1     Running   0          2m9s    app=webcluster

[root@k8s-master controler]#kubectl  scale replicaset webcluster --replicas 2
[root@k8s-master controler]#kubectl  scale replicaset webcluster --replicas 0
[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
webcluster-gp28q   1/1     Running   0          7m49s   app=webcluster
webcluster-kxqsr   1/1     Running   0          108s    app=webcluster
webcluster-nqhrs   1/1     Running   0          108s    app=webcluster
webcluster-qlzv7   1/1     Running   0          73s     app=webcluster

#当我将一个pod的标签删掉,Replicaset会新添加一个pod进来
[root@k8s-master controler]# kubectl label pods webcluster-gp28q app-

4 deployment 控制器

  • 保证副本数量:像 ReplicaSet 一样,确保指定数量的 Pod 始终在运行。
  • 支持声明式更新:你只需要在 YAML 文件中修改期望的状态(例如,更改镜像版本),Deployment 就会自动将集群的当前状态平滑地调整为你指定的新状态。
  • 实现滚动更新:在更新过程中,它会逐步用新版本的 Pod 替换旧版本的 Pod,确保服务在更新期间不会中断。
  • 支持版本回滚:每次更新都会被记录为一个“版本”,如果新版本有问题,你可以一键回滚到之前的任意版本。
  • 提供暂停与恢复:你可以在执行复杂的更新操作(比如同时修改多个配置)前暂停更新,等所有修改完成后再恢复,避免触发多次不必要的更新。

工作原理:通过“版本化 ReplicaSet”实现平滑更新,当deployment更新时,会新建一个replicaset控制器,根据策略,新replicaset每起一个pod,旧的replicaset就会关闭一个pod,更新结束后旧的控制器不删除

4.1 建立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@k8s-master deployment]#  kubectl expose deployment webcluster --port 80 --target-port 80
service/webcluster exposed

#监控部分显示效果
[root@k8s-master ~]# watch -n 1 " kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps"

Every 1.0s:  kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps              k8s-master: Wed Aug 26 19:53:05 2026

NAME                          READY   STATUS    RESTARTS   AGE     LABELS
webcluster-77c87d9946-g6z6g   1/1     Running   0          2m45s   app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-kz5bw   1/1     Running   0          2m45s   app=webcluster,pod-template-hash=77c87d9946
====
NAME                    DESIRED   CURRENT   READY   AGE
webcluster-77c87d9946   2         2         2       2m45s


#发布服务
[root@k8s-master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
service/webcluster exposed
[root@k8s-master controler]# kubectl describe  services webcluster
Name:                     webcluster
Namespace:                default
Labels:                   app=webcluster
Annotations:              <none>
Selector:                 app=webcluster
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.107.99.174
IPs:                      10.107.99.174
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32320/TCP
Endpoints:                10.244.2.19:80,10.244.2.20:80
Session Affinity:         None
External Traffic Policy:  Cluster
Internal Traffic Policy:  Cluster
Events:                   <none>

[root@k8s-master controler]# curl  10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4.2 升级和回滚

升级

#升级
[root@k8s-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:v2  #将版本升级为2
        name: myapp
#        resources: {}


[root@k8s-master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
 
[root@k8s-master controler]# curl  10.107.99.174
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@k8s-master controler]# 

回滚

[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
deployment.apps/webcluster configured

[root@k8s-master controler]# curl  10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4.3 版本更新管理及优化

[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

查看更新策略信息

[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy:  25% max unavailable, 25% max surge

设定更新策略

[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

[root@k8s-master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy:  0 max unavailable, 1 max surge

更新暂停和恢复

暂停

[root@k8s-master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster 
REVISION  CHANGE-CAUSE
3         <none>
4         <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@k8s-master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster 
REVISION  CHANGE-CAUSE
3         <none>
4         <none>

[root@k8s-master controler]# curl 10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

恢复

[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
4         <none>
5        <none>

5 DaemonSet控制器

5.1 建立DaemonSet控制器

[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

[root@k8s-master controler]# kubectl apply -f daemonset.yml 
daemonset.apps/daemonset created

#另外开启一个主机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的状态


[root@k8s-master deployment]# kubectl get nodes
NAME         STATUS   ROLES           AGE    VERSION
ceph         Ready    <none>          5s     v1.35.8
k8s-master   Ready    control-plane   5d8h   v1.35.8
k8s-node1    Ready    <none>          5d8h   v1.35.8
k8s-node2    Ready    <none>          5d8h   v1.35.8
[root@k8s-master deployment]# kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
daemonset-62t2b   1/1     Running   0          20s
daemonset-g67jl   1/1     Running   0          20m
daemonset-r665j   1/1     Running   0          4m30s

6 Job控制器

Job 控制器 是 Kubernetes 中的一个核心控制器,专门用于处理一次性任务(Batch Jobs)或定时任务(配合 CronJob),它确保 Pod 能够成功完成指定数量的任务后退出(Pod 状态变为 Completed),而不是像 Deployment 那样保持 Pod 长期运行。

[root@k8s-master controler]# kubectl create job job --image busybox  --dry-run=client -o yaml > job.yml
[root@k8s-master controler]# vim job.yml 
apiVersion: batch/v1
kind: Job
metadata:
  name: testjob
spec:
  completions: 6
  parallelism: 2
  backoffLimit: 4
  template:
    spec:
      containers:
      - image: busybox
        name: testjob
        command: ["/bin/sh", "-c"]
        args:
        - |
          echo this is testjob message
          sleep 10
      restartPolicy: Never

[root@master controler]# kubectl apply -f job.yml
job.batch/job created

[root@k8s-master controler]# kubectl logs pods/testjob-ks8n8
this is testjob message

7 Cronjob控制器

CronJob 控制器是用来管理定时任务的核心组件。它的主要作用是在指定的时间点或周期性地创建并执行 Job(任务),确保任务按计划运行,CronJob 本身并不直接运行 Pod,它的工作流程是一个“双层接力”

[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@k8s-master controler]# kubectl apply -f cronjob.yml
cronjob.batch/cronjob created
[root@k8s-master controler]# kubectl get cronjobs.batch
NAME      SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   * * * * *   <none>     False     0        13s             87s



[root@master controler]# kubectl logs cronjob-29795803-ks9pk
hello timinglee

更多推荐