在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 replicasets2.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 -v2.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 -v2.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-nginx2.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等中间件 |
