个人随笔
目录
Kubernetes核心概念:Pod控制器(Controller)超全实战笔记
2026-06-28 16:36:08
在Kubernetes集群中,Pod是最小的资源调度单元,但直接手动管理大量Pod会极其繁琐且低效。为了实现Pod的自动化管理、生命周期管控、扩缩容、升级回滚等核心能力,K8s提供了Pod控制器(Controller)机制。
控制器是K8s的核心工作负载管理组件,属于高级资源抽象,用户只需定义资源预期状态,控制器会持续比对集群实际状态,自动完成调度、修复、更新等操作,保证集群状态与预期一致。

一、Pod控制器核心概述

1.1 控制器核心作用

专门用于管控Pod的全生命周期,实现Pod的自动化运维,解决手动管理Pod的痛点:故障自愈、动态扩缩容、版本升级/回滚、批量调度、定时任务执行等。

1.2 主流控制器分类及适用场景

K8s内置7种核心控制器,适配不同业务场景,核心分类及用途如下:
  • Deployment:最常用,用于管理无状态应用,支持滚动升级、版本回退、副本扩缩容,底层依赖ReplicaSet
  • ReplicaSet(副本集):核心功能为Pod副本扩容、缩容、故障自愈,现基本被Deployment封装替代
  • ReplicationController(RC):ReplicaSet的旧版本,功能老旧,官方建议废弃,统一使用Deployment+ReplicaSet
  • StatefulSet:专门管理有状态应用,保证Pod唯一性、启动顺序、存储绑定,适配数据库、中间件等场景
  • DaemonSet:节点守护进程控制器,在集群所有/指定节点运行常驻Pod,适用于日志采集、监控、节点驱动等场景(如filebeat、node_exporter)
  • Job:一次性任务控制器,执行短暂、一次性的批处理任务,任务完成后Pod自动结束
  • CronJob:定时任务控制器,基于Linux crontab规则,周期性执行Job任务

二、核心控制器详解:Deployment(无状态应用首选)

Deployment是K8s管理无状态应用的标准方案,集成了ReplicaSet的所有能力,额外提供滚动升级、版本回退、历史版本记录等核心功能,生产环境90%的无状态业务均使用Deployment部署。

2.1 ReplicaSet 核心功能

ReplicaSet是Deployment的底层依赖组件,专注于副本管理:
  • 支持基于集合的标签选择器(旧RC不支持),精准匹配管控Pod
  • 实时监控副本数量,自动实现Pod扩容、缩容、故障重建

2.2 Deployment 核心功能

  • 完全集成ReplicaSet的副本管控能力
  • 支持应用滚动升级、灰度发布,业务零停机更新
  • 支持任意历史版本回滚,保障发布故障快速修复
  • 记录版本变更日志,便于运维追溯

2.3 无状态应用核心特点

Deployment仅适用于无状态应用,这类应用具备以下特征:
  • 所有Pod完全无差别,可相互替换
  • 所有Pod运行同一镜像、同一配置
  • Pod可调度至集群任意节点,无节点绑定限制
  • 无固定启动、停止顺序要求
  • 支持任意数量的副本扩缩容
  • 典型场景:静态Web服务、API接口服务、前端应用

2.4 实战:创建Deployment应用(Nginx)

步骤1:编写YAML资源清单

创建 deployment-nginx.yml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx      eployment资源名称
spec:    
  replicas: 1          本数
  selector:
    matchLabels:
      app: nginx          的Pod标签
  template:            od模板定义
    metadata:
      labels:
        app: nginx       od标签,与selector对应
    spec:
      containers:           # 容器配置
  ame: nginx
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80    - n                         # P                                       # P                             # 匹配管控                                     # 初始副                                              # D

步骤2:应用YAML创建资源

kubectl apply -f deployment-nginx.yml

步骤3:资源验证

# 查看Deployment
kubectl get deployment

# 查看Pod
kubectl get pods

# 查看底层ReplicaSet
kubectl get replicasets

2.5 访问Deployment应用

默认创建的Pod仅集群内部可访问,集群外部无法直接访问:

步骤1:查看Pod详细信息(IP、节点)

kubectl get pods -o wide

步骤2:集群内访问测试

所有集群节点的网卡均属于 10.244.0.0/16 网段,任意节点均可通过Pod IP访问服务
curl 10.244.159.155  # 替换为实际Pod IP
核心问题:Pod IP是动态随机的,删除重建、集群重启后IP会变更,无法作为固定访问入口,因此需要 Service 提供固定访问端点。

2.6 Pod自愈特性验证

Deployment依托ReplicaSet实现故障自愈,手动删除Pod后,控制器会自动重建新Pod:

步骤1:删除现有Pod

kubectl delete pod deploy-nginx-6c9764bb69-pbc2h

步骤2:查看重建结果

kubectl get pods -o wide
现象:自动生成新Pod,节点、IP均发生变化,验证Pod动态性与自愈能力。

2.7 应用版本升级(滚动更新)

Deployment支持零停机滚动升级,逐步替换旧版本Pod,保障业务不中断。

步骤1:查看当前应用版本

# 查看镜像版本
kubectl describe pods  pod名称 | grep Image:

# 查看Nginx版本
kubectl exec pod名称 -- nginx -v

步骤2:执行版本升级

# 升级为1.16版本,--record记录变更日志
kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record

步骤3:监控升级进度并验证

# 查看升级状态
kubectl rollout status deployment deploy-nginx

# 验证新版本
kubectl get pods
kubectl exec 新pod名称 -- nginx -v

2.8 应用版本回退

版本升级异常时,可一键回退至历史稳定版本。

步骤1:查看版本历史

kubectl rollout history deployment deploy-nginx

步骤2:查看指定版本详情

kubectl rollout history deployment deploy-nginx --revision=1

步骤3:执行版本回退

# 回退到1号历史版本
kubectl rollout undo deployment deploy-nginx --to-revision=1

步骤4:验证回退结果

kubectl rollout history deployment deploy-nginx
kubectl exec pod名称 -- nginx -v

2.9 副本扩缩容

支持动态调整Pod副本数量,适配业务流量波动。

扩容示例(调整为2副本)

kubectl scale deployment deploy-nginx --replicas=2
kubectl get pods -o wide

缩容示例(调整为1副本)

kubectl scale deployment deploy-nginx --replicas=1
kubectl get pods
特性:副本数可大于集群节点数,K8s会自动调度多个Pod至同一节点。

2.10 多副本滚动更新实战

多副本场景下,Deployment会分批更新Pod,保证更新过程中业务可用。
# 1. 扩容至16副本
kubectl scale deployment deploy-nginx --replicas=16

# 2. 执行版本升级
kubectl set image deployment deploy-nginx nginx=nginx:1.17-alpine --record

# 3. 监控滚动更新进度
kubectl rollout status deployment deploy-nginx

2.11 删除Deployment资源

删除Deployment会自动关联删除所有下属Pod、ReplicaSet资源:
kubectl delete deployment deploy-nginx

三、ReplicaSet 独立实战

ReplicaSet可独立创建,仅负责副本管理,无升级、回退能力,生产环境不单独使用,仅作原理学习。

步骤1:编写RS资源清单

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
  namespace: default
spec:                   
  replicas: 2            # 副本数2
  selector:              
    matchLabels:
      app: nginx         
  template:
    metadata:
      labels:
        app: nginx
    spec:               
      containers:
      - name: nginx
        image: nginx:1.15-alpine
        ports:
        - name: http
          containerPort: 80

步骤2:创建并验证资源

kubectl apply -f rs-nginx.yml
kubectl get rs
kubectl get pods
kubectl get deployment  # 无Deployment资源,证明RS独立存在

四、DaemonSet 节点守护控制器

4.1 核心特性

  • 在集群所有/指定节点运行唯一一个常驻Pod
  • 新节点加入集群时,自动在新节点创建Pod;节点移除时,自动清理对应Pod
  • Pod故障后自动重建,保证节点始终运行指定守护进程
  • 适用场景:日志采集(filebeat)、监控采集(node_exporter)、节点驱动、网络插件

4.2 DaemonSet 实战案例

步骤1:编写YAML资源清单

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx    spec:
  selector:
    matchLabels:
      name: nginx-ds
  template:
    metadata:
      labels:
        name: nginx-ds
    spec:
      tolerations:                    ,允许master部署Pod
      - key: node-role.kubernetes.io/master  
        effect: NoSchedule   
      containers:
      - name: nginx
        image: nginx:1.15-alpine
        imagePullPolicy: IfNotPresent
        resources:    # 资源限制,防止占用节点过多资源
          limits:
            memory: 100Mi
          requests:
            memory: 100Mi# 容忍master节点污点                                                

步骤2:创建并验证资源

kubectl apply -f daemonset-nginx.yml
kubectl get ds
kubectl get pods -o wide
现象:集群每一个节点(master、worker)均运行一个Nginx Pod。

五、Job 一次性任务控制器

5.1 核心特性

不同于Deployment常驻服务,Job用于执行短暂、一次性、批处理任务,任务执行完成后Pod状态变为Completed,不会自动重启。适用于数据计算、文件处理、数据备份等一次性场景。

5.2 实战案例1:计算圆周率2000位

步骤1:编写Job清单

apiVersion: batch/v1
kind: Job
metadata:
  name: pi     pec:
  template:
    metadata:
      name: pi           :
      containers:
      - name: pi 
        image: perl    
        imagePullPolicy: IfNotPresent
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never   # 任务完成不重启                   
    spec     
s              

步骤2:创建并查看任务结果

kubectl apply -f job1.yml
kubectl get jobs
kubectl get pods
kubectl logs pi-tjq9b  # 查看任务输出结果

5.3 实战案例2:指定执行次数的Job

通过 completions 指定任务总执行次数,parallelism 指定并发数。
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  completions: 10       # 总共执行10次任务
  parallelism: 1        # 单次并发1个任务
  template:
    metadata:
      name: busybox-job-pod
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["echo", "hello"]
      restartPolicy: Never
应用资源后,可通过 kubectl get job 实时查看任务完成进度。

5.4 实战案例3:MySQL数据库一次性备份

步骤1:部署测试MySQL服务

apiVersion: v1
kind: Service
metadata:
  name: mysql-test
  namespace: default
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None
  selector:
    app: mysql-dump

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db
  namespace: default
spec:
  selector:
    matchLabels:
      app: mysql-dump
  serviceName: "mysql-test"
  template:
    metadata:
      labels:
        app: mysql-dump
    spec:
      nodeName: k8s-master3
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "abc123"
        ports:
        - containerPort: 3306
        volumeMounts:
        - mountPath: "/var/lib/mysql"
          name: mysql-data
      volumes:
      - name: mysql-data
        hostPath:
          path: /opt/mysqldata

步骤2:创建备份Job任务

apiVersion: batch/v1
kind: Job
metadata:
  name: mysql-dump
spec:
  template:
    metadata:
      name: mysql-dump
    spec:
      nodeName: k8s-master2
      containers:
      - name: mysql-dump
        image: mysql:5.7
        command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql2022.sql"]
        volumeMounts:
        - mountPath: "/root"
          name: mysql-data
      restartPolicy: Never
      volumes:
      - name: mysql-data
        hostPath:
          path: /opt/mysqldump

六、CronJob 定时任务控制器

6.1 核心特性

CronJob基于Linux crontab时间规则,周期性自动创建Job任务,实现定时任务自动化,时间格式:分 时 日 月 周

6.2 实战案例1:周期性输出日志

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob1
spec:
  schedule: "* * * * *"                 # 每分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo hello kubernetes
            imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure
应用后可查看每分钟自动生成的Completed状态Pod。

6.3 实战案例2:定时备份MySQL数据库

基于上述MySQL服务,配置每分钟自动备份数据库。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: mysql-dump
spec:
  schedule: "*/1 * * * *"  # 每分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          nodeName: worker02
          containers:
          - name: c1
            image: mysql:5.7
            command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
            volumeMounts:
              - name: mysql-data
                mountPath: "/root"
          restartPolicy: Never
          volumes:
            - name: mysql-data
              hostPath:
                path: /opt/mysqldump

七、核心知识点总结

控制器
业务类型
核心能力
生产场景
Deployment
无状态常驻服务
扩缩容、滚动升级、版本回退、故障自愈
Web服务、API服务、前端应用
ReplicaSet
无状态常驻服务
副本管控、故障重建
被Deployment封装,不单独使用
DaemonSet
节点级常驻服务
节点全局部署、自动适配节点上下线
日志、监控、节点驱动
Job
一次性任务
单次任务执行、执行完成终止
数据计算、临时备份、文件处理
CronJob
周期性任务
定时触发Job任务
定时备份、定时清理、定时巡检
StatefulSet
有状态常驻服务
Pod唯一性、存储绑定、有序启动
MySQL、Redis、MQ等中间件
 6

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2