什么是 Pod 控制器?

Pod 是 Kubernetes 中最小的部署单元,但 Pod 本身是 “临时性” 的(比如节点故障会导致 Pod 消失)。Pod 控制器的作用是:管理 Pod 的生命周期,确保 Pod 始终按照预期状态运行(比如维持指定数量的副本、处理故障重启等)。

一、ReplicaSet(副本集)

作用

保证集群中始终运行指定数量的 Pod 副本,通过 “标签选择器” 关联 Pod,当 Pod 故障时会自动重建。

适用场景

一般不直接使用,主要作为 Deployment 的底层组件(Deployment 通过管理 ReplicaSet 实现更复杂的功能)。

实操步骤
1. 编写 YAML 配置(replicaset-demo.yaml
# API 版本:apps/v1(ReplicaSet 属于 apps 组,版本 v1)
apiVersion: apps/v1
# 资源类型:ReplicaSet
kind: ReplicaSet
metadata:
  # ReplicaSet 的名称(自定义,需唯一)
  name: rs-demo
  # 可选:给控制器打标签(用于分类或筛选)
  labels:
    controller: replicaset
spec:
  # 核心配置:期望的 Pod 副本数(这里指定 2 个)
  replicas: 2
  # 标签选择器:控制器只管理带有这些标签的 Pod(必须与 Pod 模板的标签匹配)
  selector:
    matchLabels:
      app: nginx  # 匹配 Pod 的标签(关键:类似“身份证”)
  # Pod 模板:定义要创建的 Pod 的规格
  template:
    metadata:
      # Pod 的标签(必须与 selector.matchLabels 一致,否则控制器不识别)
      labels:
        app: nginx
    spec:
      # 容器配置(Pod 中运行的容器)
      containers:
      - name: nginx-container  # 容器名称(自定义)
        image: nginx:1.25      # 容器镜像(nginx 官方镜像,版本 1.25)
        ports:
        - containerPort: 80    # 容器内暴露的端口(nginx 默认监听 80 端口)
2. 创建 ReplicaSet

执行命令:

kubectl apply -f replicaset-demo.yaml
3. 验证创建结果
  • 查看 ReplicaSet:

    kubectl get replicaset
    -----------------------------------------------------------------------------------------------------
    # 输出示例:
    [root@k8s-master Pod-controller]# kubectl get replicasets
    NAME      DESIRED   CURRENT   READY   AGE
    rs-demo   2         2         2       37s
    
  • 查看由 ReplicaSet 管理的 Pod:

    kubectl get pods --show-labels
    -----------------------------------------------------------------------------------------------------
    # 输出示例:
    [root@k8s-master Pod-controller]# kubectl get pods --show-labels 
    NAME            READY   STATUS    RESTARTS   AGE   LABELS
    rs-demo-h2rrx   1/1     Running   0          85s   app=nginx
    rs-demo-pck6t   1/1     Running   0          85s   app=nginx
    
4. 测试故障自愈能力

手动删除一个 Pod,观察是否会自动重建:

# 删除其中一个 Pod(替换为实际 Pod 名称)
kubectl delete pod rs-demo-h2rrx
# 再次查看 Pod,会发现新的 Pod 被创建(名称不同,但标签相同)
kubectl get pods
------------------------------------------------------------------------------------------------------------
#验证
[root@k8s-master Pod-controller]# kubectl get pods -o wide 
NAME            READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
rs-demo-h2rrx   1/1     Running   0          2m6s   10.244.36.76     k8s-node1   <none>           <none>
rs-demo-pck6t   1/1     Running   0          2m6s   10.244.169.139   k8s-node2   <none>           <none>
[root@k8s-master Pod-controller]# kubectl delete pod rs-demo-h2rrx 
pod "rs-demo-h2rrx" deleted
[root@k8s-master Pod-controller]# kubectl get pods --show-labels 
NAME            READY   STATUS              RESTARTS   AGE     LABELS
rs-demo-kc7xk   0/1     ContainerCreating   0          21s     app=nginx
rs-demo-pck6t   1/1     Running             0          3m21s   app=nginx
[root@k8s-master Pod-controller]# kubectl get pods -o wide 
NAME            READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
rs-demo-kc7xk   1/1     Running   0          45s     10.244.107.204   k8s-node3   <none>           <none>
rs-demo-pck6t   1/1     Running   0          3m45s   10.244.169.139   k8s-node2   <none>           <none>
5. 清理资源(重要!避免环境混乱)
kubectl delete -f replicaset-demo.yaml
# 验证是否删除:kubectl get replicaset 和 kubectl get pods 应无相关资源

二、Deployment(部署)

作用

基于 ReplicaSet 实现,除了维持 Pod 副本数,还支持滚动更新(不中断服务更新 Pod)、版本回滚(更新出错时恢复旧版本),是无状态应用的首选控制器。

适用场景

无状态服务(如 Web 服务器、API 服务等,多个副本完全相同,无依赖关系)。

实操步骤
1. 编写 YAML 配置(deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-demo  # Deployment 名称
  labels:
    controller: deployment
spec:
  replicas: 3  # 期望 3 个 Pod 副本
  # 标签选择器:匹配 Pod 的标签(与 Pod 模板标签一致)
  selector:
    matchLabels:
      app: nginx-deploy
  # 更新策略(核心配置:控制如何更新 Pod)
  strategy:
    type: RollingUpdate  # 滚动更新(默认,逐步替换旧 Pod,不中断服务)
    rollingUpdate:
      maxSurge: 1        # 更新时最多可超出期望副本数的数量(1 个或 25%)
      maxUnavailable: 0  # 更新时最多不可用的副本数(0 表示不允许服务中断)
  # Pod 模板(与 ReplicaSet 类似)
  template:
    metadata:
      labels:
        app: nginx-deploy  # 必须与 selector.matchLabels 一致
    spec:
      containers:
      - name: nginx
        image: nginx:1.25  # 初始镜像版本
        ports:
        - containerPort: 80
2. 创建 Deployment
kubectl apply -f deployment-demo.yaml
3. 验证创建结果
  • 查看 Deployment:

    kubectl get deployment
    -----------------------------------------------------------------------------------------------------
    # 输出示例:
    [root@k8s-master Pod-controller]# kubectl get deployment
    NAME          READY   UP-TO-DATE   AVAILABLE   AGE
    deploy-demo   3/3     3            3           18s
    [root@k8s-master Pod-controller]# kubectl get deployment deploy-demo
    NAME          READY   UP-TO-DATE   AVAILABLE   AGE
    deploy-demo   3/3     3            3           31s
    [root@k8s-master Pod-controller]# kubectl get pods --show-labels 
    NAME                           READY   STATUS    RESTARTS   AGE   LABELS
    deploy-demo-847bcc67cf-62wdw   1/1     Running   0          51s   app=nginx-deploy,pod-template-hash=847bcc67cf
    deploy-demo-847bcc67cf-l2gw2   1/1     Running   0          51s   app=nginx-deploy,pod-template-hash=847bcc67cf
    deploy-demo-847bcc67cf-nsbp2   1/1     Running   0          51s   app=nginx-deploy,pod-template-hash=847bcc67cf
    
  • 查看底层 ReplicaSet(Deployment 会自动创建 ReplicaSet):

    kubectl get replicaset
    -----------------------------------------------------------------------------------------------------
    #验证
    [root@k8s-master Pod-controller]# kubectl get replicasets.apps 
    NAME                     DESIRED   CURRENT   READY   AGE
    deploy-demo-847bcc67cf   3         3         3       2m7s
    
4. 测试滚动更新

更新 Pod 镜像版本(模拟应用升级):

  • 编辑 YAML 文件,将 image: nginx:1.25 改为 image: nginx:1.26

  • 执行更新:

    kubectl apply -f deployment-demo.yaml
    
  • 观察更新过程(旧 Pod 逐步删除,新 Pod 逐步创建):

    kubectl get pods -w  # -w 表示实时监控
    -----------------------------------------------------------------------------------------------------
    #验证
    [root@k8s-master Pod-controller]# kubectl get pod -w
    NAME                           READY   STATUS              RESTARTS   AGE
    deploy-demo-5577f674f8-z6pfw   0/1     ContainerCreating   0          18s
    deploy-demo-847bcc67cf-62wdw   1/1     Running             0          3m54s
    deploy-demo-847bcc67cf-g7cqm   1/1     Running             0          18s
    deploy-demo-847bcc67cf-l2gw2   1/1     Running             0          3m54s
    deploy-demo-847bcc67cf-nsbp2   1/1     Running             0          3m54s
    deploy-demo-847bcc67cf-xqs64   1/1     Running             0          18s
    deploy-demo-847bcc67cf-xsxmv   1/1     Running             0          18s
    deploy-demo-5577f674f8-z6pfw   1/1     Running             0          56s
    deploy-demo-847bcc67cf-xqs64   1/1     Terminating         0          56s
    deploy-demo-5577f674f8-bs2tn   0/1     Pending             0          0s
    deploy-demo-5577f674f8-bs2tn   0/1     Pending             0          0s
    deploy-demo-5577f674f8-bs2tn   0/1     ContainerCreating   0          0s
    deploy-demo-847bcc67cf-xqs64   1/1     Terminating         0          57s
    deploy-demo-5577f674f8-bs2tn   0/1     ContainerCreating   0          1s
    deploy-demo-847bcc67cf-xqs64   0/1     Terminating         0          57s
    deploy-demo-847bcc67cf-xqs64   0/1     Terminating         0          57s
    deploy-demo-847bcc67cf-xqs64   0/1     Terminating         0          57s
    
    [root@k8s-master Pod-controller]# kubectl get pods
    NAME                           READY   STATUS    RESTARTS   AGE
    deploy-demo-5577f674f8-5f889   1/1     Running   0          76s
    deploy-demo-5577f674f8-bs2tn   1/1     Running   0          3m
    deploy-demo-5577f674f8-kh4fj   1/1     Running   0          75s
    deploy-demo-5577f674f8-n28ws   1/1     Running   0          78s
    deploy-demo-5577f674f8-tz8vk   1/1     Running   0          2m21s
    deploy-demo-5577f674f8-z6pfw   1/1     Running   0          3m56s
    
    [root@k8s-master Pod-controller]# kubectl get pods -o wide 
    NAME                           READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
    deploy-demo-5577f674f8-5f889   1/1     Running   0          95s     10.244.107.208   k8s-node3   <none>           <none>
    deploy-demo-5577f674f8-bs2tn   1/1     Running   0          3m19s   10.244.36.79     k8s-node1   <none>           <none>
    deploy-demo-5577f674f8-kh4fj   1/1     Running   0          94s     10.244.169.143   k8s-node2   <none>           <none>
    deploy-demo-5577f674f8-n28ws   1/1     Running   0          97s     10.244.36.80     k8s-node1   <none>           <none>
    deploy-demo-5577f674f8-tz8vk   1/1     Running   0          2m40s   10.244.169.142   k8s-node2   <none>           <none>
    deploy-demo-5577f674f8-z6pfw   1/1     Running   0          4m15s   10.244.107.207   k8s-node3   <none>           <none>
    
    [root@k8s-master Pod-controller]# curl 10.244.107.208
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    [root@k8s-master Pod-controller]# 
    
    
    
5. 测试版本回滚

如果更新后出现问题,回滚到上一版本:

# 查看 Deployment 历史版本
kubectl rollout history deployment/deploy-demo
------------------------------------------------------------------------------------------------------------
#验证
[root@k8s-master Pod-controller]# kubectl get deployments
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   6/6     6            6           10m
[root@k8s-master Pod-controller]# kubectl get deployments deploy-demo 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   6/6     6            6           10m
[root@k8s-master Pod-controller]# kubectl rollout history deployment deploy-demo 
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
#<none> 原因是升级时未加注释
------------------------------------------------------------------------------------------------------------

# 回滚到上一版本
kubectl rollout undo deployment/deploy-demo
# 验证回滚结果(Pod 镜像应变回 nginx:1.25)
kubectl describe pod <pod 名称> | grep Image:
------------------------------------------------------------------------------------------------------------
#验证版本
[root@k8s-master Pod-controller]# kubectl describe pod deploy-demo-847bcc67cf | grep Image:
    Image:          nginx:1.25
    Image:          nginx:1.25
    Image:          nginx:1.25
    Image:          nginx:1.25
    Image:          nginx:1.25
    Image:          nginx:1.25
------------------------------------------------------------------------------------------------------------
6. 清理资源
kubectl delete -f deployment-demo.yaml
# 验证:kubectl get deployment、replicaset、pods 均无相关资源

三、DaemonSet(守护进程集)

作用

确保集群中所有节点(或指定节点)上都运行且只运行一个相同的 Pod,节点新增时会自动在新节点创建 Pod,节点删除时 Pod 也会被删除。

适用场景

节点级服务(如日志收集器、监控代理、网络插件等,需要在每个节点运行)。

实操步骤
1. 编写 YAML 配置(daemonset-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-demo  # DaemonSet 名称
  labels:
    controller: daemonset
spec:
  selector:
    matchLabels:
      app: log-collector  # 匹配 Pod 的标签
  template:
    metadata:
      labels:
        app: log-collector
    spec:
      # 容忍度(可选:允许 Pod 调度到有污点的节点,如 master 节点)
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
        operator: Exists
      containers:
      - name: log-collector
        image: busybox:1.36  # 用 busybox 模拟日志收集器
        # 容器启动命令:循环打印日志到文件(模拟收集日志)
        command: ["/bin/sh", "-c", "while true; do echo '收集节点日志...' >> /var/log/ds-demo.log; sleep 10; done"]
        # 挂载节点的日志目录到容器(让容器能访问节点的日志文件)
        volumeMounts:
        - name: node-log-dir  # 挂载名称(与下面 volumes.name 对应)
          mountPath: /var/log  # 容器内的挂载路径
      # 定义存储卷(关联节点的实际目录)
      volumes:
      - name: node-log-dir
        hostPath:
          path: /var/log  # 节点上的日志目录(容器会读取这里的文件)
2. 创建 DaemonSet
kubectl apply -f daemonset-demo.yaml
3. 验证创建结果
  • 查看 DaemonSet:

    kubectl get daemonset
    # 输出示例:NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   AGE
    #          ds-demo   2         2        2       2            2           30s
    # DESIRED:节点总数(每个节点 1 个 Pod)
    
  • 查看 Pod(每个节点 1 个):

kubectl get pods -o wide # -o wide 显示 Pod 所在节点

输出示例:

[root@k8s-master Pod-controller]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-demo-6phjm 1/1 Running 0 40s 10.244.36.83 k8s-node1
ds-demo-9x6c5 1/1 Running 0 40s 10.244.235.199 k8s-master
ds-demo-p79qn 1/1 Running 0 40s 10.244.169.146 k8s-node2
ds-demo-zgdfv 1/1 Running 0 40s 10.244.107.211 k8s-node3



##### 4. 验证节点日志收集(可选)

登录其中一个节点,查看容器写入的日志文件:

```bash
# 在节点上执行(需有节点访问权限)
cat /var/log/ds-demo.log
------------------------------------------------------------------------------------------------------------
# 应看到类似 "收集节点日志..." 的内容
[root@k8s-master Pod-controller]# cat /var/log/ds-demo.log 
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
收集节点日志...
5. 清理资源
kubectl delete -f daemonset-demo.yaml
# 验证:kubectl get daemonset 和 pods 均无相关资源

四、StatefulSet(有状态集)

作用

管理有状态应用,为 Pod 提供固定的名称(如 web-0web-1)、固定的网络标识(通过 DNS 访问)和独立的持久化存储(每个 Pod 数据不共享)。

适用场景

有状态服务(如数据库、分布式系统:MySQL、ZooKeeper 等,需要稳定的身份和数据持久化)。

实操步骤
1. 准备 Headless Service(为 StatefulSet 提供网络标识)

StatefulSet 需要一个 “无头服务”(Headless Service)来生成固定的 DNS 记录,先创建它:

statefulset-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-headless  # 服务名称
spec:
  selector:
    app: nginx-stateful  # 匹配 StatefulSet 的 Pod 标签
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None  # 关键:Headless Service 无集群 IP,通过 DNS 提供 Pod 域名

创建服务:

kubectl apply -f statefulset-service.yaml
------------------------------------------------------------------------------------------------------------
#测试
[root@k8s-master Pod-controller]# kubectl get service
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.96.0.1    <none>        443/TCP   3d22h
nginx-headless   ClusterIP   None         <none>        80/TCP    96s
2. 编写 StatefulSet YAML 配置(statefulset-demo.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-demo  # StatefulSet 名称
spec:
  serviceName: "nginx-headless"  # 关联上面的 Headless Service(必须)
  replicas: 2  # 2 个副本
  selector:
    matchLabels:
      app: nginx-stateful  # 匹配 Pod 标签
  # 存储卷声明模板:为每个 Pod 自动创建独立的存储(PVC)
  volumeClaimTemplates:
  - metadata:
      name: data-volume  # 存储卷名称(与容器挂载对应)
    spec:
      accessModes: [ "ReadWriteOnce" ]  # 存储访问模式(单节点读写)
      resources:
        requests:
          storage: 1Gi  # 每个 Pod 请求 1GB 存储
  template:
    metadata:
      labels:
        app: nginx-stateful  # 与 selector 匹配
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
          name: web
        # 挂载持久化存储到容器内的 /usr/share/nginx/html 目录
        volumeMounts:
        - name: data-volume  # 与 volumeClaimTemplates.name 对应
          mountPath: /usr/share/nginx/html
3. 创建 StatefulSet
kubectl apply -f statefulset-demo.yaml
4. 验证创建结果
  • 查看 StatefulSet:

kubectl get statefulset

输出示例:NAME READY AGE

sts-demo 2/2 40s


- 查看 Pod(名称固定,带序号):

```bash
kubectl get pods
# 输出示例:NAME         READY   STATUS    RESTARTS   AGE
#          sts-demo-0   1/1     Running   0          45s
#          sts-demo-1   1/1     Running   0          40s
# 名称格式:<statefulset 名称>-<序号>(0 开始,固定不变)
  • 查看自动创建的 PVC(每个 Pod 一个):

    kubectl get pvc
    # 输出示例:NAME                     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    #          data-volume-sts-demo-0   Bound    pv-xxx    1Gi        RWO            standard       50s
    #          data-volume-sts-demo-1   Bound    pv-yyy    1Gi        RWO            standard       45s
    
5. 测试固定网络标识(可选)

在集群内的任意 Pod 中,通过 DNS 访问 StatefulSet 的 Pod:

# 进入一个测试 Pod(如用 busybox)
kubectl run -it --rm busybox --image=busybox:1.36 -- sh
# 在 busybox 中执行 ping 命令(域名格式:<pod 名称>.<service 名称>)
ping sts-demo-0.nginx-headless
ping sts-demo-1.nginx-headless
# 应能 ping 通(证明网络标识固定)
6. 清理资源
# 先删除 StatefulSet(会自动删除 Pod 和 PVC)
kubectl delete -f statefulset-demo.yaml
# 再删除 Headless Service
kubectl delete -f statefulset-service.yaml
# 验证:kubectl get statefulset、service、pvc、pods 均无相关资源

五、Job(任务)

作用

管理一次性任务:确保 Pod 执行完任务后终止(成功则状态为 Completed,失败则按配置重试),不持续运行。

适用场景

批处理任务(如数据备份、日志分析、临时计算等)。

实操步骤
1. 编写 YAML 配置(job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo  # Job 名称
spec:
  completions: 1   # 任务需要成功完成的总次数(默认 1)
  parallelism: 1   # 并行执行的 Pod 数量(默认 1)
  backoffLimit: 4  # 失败重试次数(超过则任务失败,默认 6)
  template:
    spec:
      containers:
      - name: task
        image: busybox:1.36
        # 任务命令:打印信息 → 休眠 20 秒(模拟任务执行)→ 打印完成
        command: ["/bin/sh", "-c", "echo '任务开始'; sleep 20; echo '任务完成'"]
      restartPolicy: Never  # 任务失败时不重启 Pod(Job 会新建 Pod 重试)
      # 注意:Job 的 restartPolicy 只能是 Never 或 OnFailure(不能是 Always)
2. 创建 Job
kubectl apply -f job-demo.yaml
3. 验证创建结果
  • 查看 Job:

    kubectl get job
    # 输出示例:NAME       COMPLETIONS   DURATION   AGE
    #          job-demo   0/1           10s        10s
    # 等待 20 秒后再次查看,COMPLETIONS 会变为 1/1
    
  • 查看 Job 创建的 Pod:

    kubectl get pods
    # 任务执行中:STATUS 为 Running
    # 任务完成后:STATUS 为 Completed
    
  • 查看任务输出日志:

    # 替换为实际 Pod 名称
    kubectl logs job-demo-abc123
    -----------------------------------------------------------------------------------------------------
    #验证
    [root@k8s-master Pod-controller]# kubectl logs job-demo-j84zr 
    任务开始
    任务完成
    
4. 测试失败重试(可选)

修改 YAML 中的 command 为错误命令(如 echo '任务开始'; exit 1,让任务失败),重新创建 Job:

kubectl apply -f job-demo.yaml
# 查看 Pod 会发现多次重试(最多 backoffLimit 次)
kubectl get pods
5. 清理资源
kubectl delete -f job-demo.yaml
# 验证:kubectl get job 和 pods 均无相关资源

六、CronJob(定时任务)

作用

基于时间调度的 Job,类似 Linux 的 crontab,按指定周期(如每分钟、每天)重复执行任务。

适用场景

周期性任务(如定时备份、日志清理、定时报表生成等)。

实操步骤
1. 编写 YAML 配置(cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-demo  # CronJob 名称
spec:
  # 调度时间(cron 表达式:分 时 日 月 周)
  # 这里表示“每分钟执行一次”
  schedule: "*/1 * * * *"
  # Job 模板(定义要执行的任务,与 Job 配置一致)
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cron-task
            image: busybox:1.36
            # 任务命令:打印当前时间和信息
            command: ["/bin/sh", "-c", "date; echo '定时任务执行了'"]
          restartPolicy: Never
  # 并发策略:控制任务是否允许并发执行
  concurrencyPolicy: Allow  # Allow(允许)、Forbid(禁止)、Replace(替换)
  # 任务启动的截止时间(超过 100 秒未启动则视为失败)
  startingDeadlineSeconds: 100
  # 是否暂停任务(false 表示正常调度)
  suspend: false
2. 创建 CronJob
kubectl apply -f cronjob-demo.yaml
3. 验证创建结果
  • 查看 CronJob:

    kubectl get cronjob
    -----------------------------------------------------------------------------------------------------
    [root@k8s-master Pod-controller]# kubectl get cronjob
    NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    cronjob-demo   */1 * * * *   False     0        <none>          5s
    
  • 查看定时生成的 Job(每分钟一个):

    kubectl get jobs
    -----------------------------------------------------------------------------------------------------
    # 示例:
    [root@k8s-master Pod-controller]# kubectl get jobs -w
    NAME                    COMPLETIONS   DURATION   AGE
    cronjob-demo-29374947   1/1           1s         37s
    cronjob-demo-29374948   0/1                      0s
    cronjob-demo-29374948   0/1           0s         0s
    cronjob-demo-29374948   0/1           1s         1s
    cronjob-demo-29374948   1/1           1s         1s
    cronjob-demo-29374949   0/1                      0s
    cronjob-demo-29374949   0/1           0s         0s
    cronjob-demo-29374949   0/1           1s         1s
    cronjob-demo-29374949   1/1           1s         1s
    cronjob-demo-29374950   0/1                      0s
    cronjob-demo-29374950   0/1           0s         0s
    cronjob-demo-29374950   0/1           2s         2s
    cronjob-demo-29374950   1/1           2s         2s
    cronjob-demo-29374947   1/1           1s         3m2s
    
  • 查看 Job 对应的 Pod 及日志:

    kubectl get pods
    -----------------------------------------------------------------------------------------------------
    [root@k8s-master Pod-controller]# kubectl get pods
    NAME                          READY   STATUS      RESTARTS   AGE
    cronjob-demo-29374948-g5vr7   0/1     Completed   0          2m47s
    cronjob-demo-29374949-x8wsz   0/1     Completed   0          107s
    cronjob-demo-29374950-spzm5   0/1     Completed   0          47s
    -----------------------------------------------------------------------------------------------------
    kubectl logs <pod 名称>
    -----------------------------------------------------------------------------------------------------
    #查看
    [root@k8s-master Pod-controller]# kubectl logs cronjob-demo-29374949-x8wsz
    Fri Nov  7 06:29:01 UTC 2025
    定时任务执行了
    
4. 暂停 / 恢复任务(可选)
  • 暂停任务(停止调度新 Job):

    kubectl patch cronjob cronjob-demo -p '{"spec":{"suspend":true}}'
    
  • 恢复任务:

    kubectl patch cronjob cronjob-demo -p '{"spec":{"suspend":false}}'
    
5. 清理资源
kubectl delete -f cronjob-demo.yaml
# 注意:CronJob 创建的历史 Job 和 Pod 不会自动删除,需手动清理:
kubectl delete jobs --all  # 删除所有 Job(会同时删除关联的 Pod)
# 验证:kubectl get cronjob、job、pods 均无相关资源

总结

控制器 核心特点 练习关键操作
ReplicaSet 维持固定副本数 手动删除 Pod 测试自愈
Deployment 滚动更新、版本回滚 更新镜像、回滚版本
DaemonSet 每个节点一个 Pod 查看 Pod 分布的节点
StatefulSet 固定名称、独立存储 验证 Pod 名称和 PVC 对应关系
Job 一次性任务 查看任务日志、测试失败重试
CronJob 定时任务 观察周期性生成的 Job、暂停 / 恢复任务
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐