个人随笔
目录
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等中间件
 19

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


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

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