Kubernetes Controller 管理
·
下面是对 《K8s 的 Controller 管理(第 4 部分)》PDF 内容 的系统化、简洁但不失细节的总结。我已将概念讲清楚、流程理顺,并且对涉及代码与命令的地方给出多个示例,整体采用 Markdown 结构,方便你在 Typora / Obsidian / GitHub 中直接使用。
Kubernetes Controller 管理
Controller 是 Kubernetes 的核心控制机制,负责让集群“始终朝着期望状态运行”。
一、Controller 的作用与分类
1️⃣ Controller 的核心作用
Controller 的本质是一个 控制循环(Control Loop):
不断比较:实际状态 vs 期望状态 → 不一致就自动修复
主要控制对象是 Pod。
📌 例如:
- 你说要 3 个 Pod
- 实际只剩 2 个
- Controller 自动补 1 个
2️⃣ Controller 类型总览
| Controller | 作用 |
|---|---|
| Deployment | 无状态应用部署、滚动升级、回滚 |
| ReplicaSet | 保证 Pod 副本数量 |
| ReplicationController | ReplicaSet 旧版本(已淘汰) |
| StatefulSet | 有状态应用(如 MySQL) |
| DaemonSet | 每个节点运行 1 个 Pod |
| Job | 一次性任务 |
| CronJob | 定时任务 |
二、Deployment(最常用)
1️⃣ Deployment 的定位
- 用于部署无状态应用
- 内部 自动管理 ReplicaSet
- 支持:
- 滚动升级
- 回滚
- 扩 / 缩容
- 自动重建 Pod
📌 生产环境首选
2️⃣ 无状态应用特征
- 所有 Pod 完全等价
- 使用同一个镜像
- 无启动顺序要求
- Pod 数量可随意增减
- Pod IP 不固定
典型代表:nginx / web / api
3️⃣ 创建 Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26-alpine
ports:
- containerPort: 80
kubectl apply -f deployment-nginx.yml

4️⃣ Deployment → ReplicaSet → Pod 关系
Deployment
└── ReplicaSet
└── Pod
kubectl get deployment
kubectl get rs
kubectl get pods

5️⃣ Pod 删除后的行为(重点)
kubectl delete pod <pod-name> --force --grace-period=0

✅ 现象:
- Pod 被删除
- ReplicaSet 立刻重建新 Pod
- IP、Node 可能变化
📌 结论:
Pod IP 不可靠 → 需要 Service 提供稳定访问入口
三、Deployment 版本管理(核心能力)
1️⃣ 查看当前镜像版本
kubectl exec <pod> -- nginx -v

2️⃣ 滚动升级(推荐方式)
kubectl set image deployment deploy-nginx nginx=nginx:1.29-alpine

升级过程:
- 创建新 ReplicaSet
- 逐步替换旧 Pod
- 不中断服务
3️⃣ 查看升级状态
kubectl rollout status deployment deploy-nginx

4️⃣ 查看历史版本
kubectl rollout history deployment deploy-nginx
kubectl rollout history deployment deploy-nginx --revision=1

5️⃣ 回滚到指定版本
kubectl rollout undo deployment deploy-nginx --to-revision=1
📌 Deployment 才支持回滚,ReplicaSet 不支持

四、Deployment 扩容与缩容
1️⃣ 扩容
kubectl scale deployment deploy-nginx --replicas=4
- Pod 数量 可以大于 Node 数
- Scheduler 自动调度

2️⃣ 缩容(甚至为 0)
kubectl scale deployment deploy-nginx --replicas=0
📌 常用于:
- 临时下线服务
- 节省资源

3️⃣ 扩容失败案例(Calico 网络)
现象
STATUS: ContainerCreating
kubectl describe pod <pod-name>
原因
- CNI 插件 Calico 异常
解决
kubectl rollout restart daemonset calico-node -n kube-system
五、ReplicaSet
1️⃣ ReplicaSet 的特点
- 只负责 副本数量
- 不支持滚动升级
- 不支持回滚
📌 不建议直接使用
2️⃣ ReplicaSet 示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.26-alpine
扩容:
kubectl scale rs rs-nginx --replicas=4

版本更新
[root@k8s-master YAML]# kubectl describe pods rs-nginx-28dng | grep Image;
Image: nginx:1.26-alpine
Image ID: docker.io/library/nginx@sha256:1eadbb07820339e8bbfed18c771691970baee292ec4ab2558f1453d26153e22d
[root@k8s-master YAML]# kubectl set image replicaset rs-nginx nginx=nginx:latest --record
Flag --record has been deprecated, --record will be removed in the future
replicaset.apps/rs-nginx image updated
检查,版本并没发生变化,replicaset无法实现版本更新
[root@k8s-master YAML]# kubectl describe pods rs-nginx-28dng | grep Image;
Image: nginx:1.26-alpine
Image ID: docker.io/library/nginx@sha256:1eadbb07820339e8bbfed18c771691970baee292ec4ab2558f1453d26153e22d

❌ 镜像不会自动更新
六、DaemonSet(每节点一个 Pod)
1️⃣ DaemonSet 的作用
- 每个 Node 运行一个 Pod
- Node 增加 → 自动部署
- Node 删除 → 自动清理
📌 常见场景:
- 日志收集(filebeat)
- 监控(node-exporter)
- 网络插件
2️⃣ DaemonSet 示例(含 Master 节点)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
name: nginx-ds
template:
metadata:
labels:
name: nginx-ds
spec:
tolerations: # 代表容忍,保证在所有节点运行
- key: node-role.kubernetes.io/master # 能容忍的污点key
effect: NoSchedule # 能容忍的污点effect
containers:
- name: nginx
image: nginx:1.26-alpine
imagePullPolicy: IfNotPresent
resources: # 资源限制是为了防止节点资源被占太多(根据实际情况配置)
limits:
memory: 100Mi
requests:
memory: 100Mi
验证
[root@k8s-master YAML]# kubectl apply -f deamonset1.yml
daemonset.apps/daemonset-nginx created
[root@k8s-master YAML]# kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-nginx 2 2 2 2 2 <none> 15s
[root@k8s-master YAML]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-nginx-47j8x 1/1 Running 0 24s 10.244.36.89 k8s-node1 <none> <none>
daemonset-nginx-px8ct 1/1 Running 0 24s 10.244.169.153 k8s-node2 <none> <none>
rs-nginx-28dng 1/1 Running 0 10m 10.244.36.88 k8s-node1 <none> <none>
rs-nginx-glgpg 1/1 Running 0 10m 10.244.169.152 k8s-node2 <none> <none>
rs-nginx-pq4bv 1/1 Running 0 10m 10.244.36.87 k8s-node1 <none> <none>
rs-nginx-vl5fn 1/1 Running 0 10m 10.244.169.151 k8s-node2 <none> <none>
📌 DaemonSet:
- ❌ 不支持 scale
- ✅ 支持镜像升级

七、Job(一次性任务)
1️⃣ Job 的适用场景
- 批处理
- 计算任务
- 备份
- 数据迁移
任务 完成即结束
2️⃣ 示例:计算 π 值
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pod-pi
spec:
nodeName: k8s-node2 #注意不要写错节点名字了,要不然状态会变成pending
containers:
- name: c-pi
image: perl
imagePullPolicy: IfNotPresent
command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never

3️⃣ 固定执行次数 Job
spec:
completions: 10
parallelism: 1
八、CronJob(定时任务)
1️⃣ CronJob 说明
- 类似 Linux
crontab - 定期创建 Job
2️⃣ CronJob 示例
apiVersion: batch/v1
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
3️⃣ 定时备份 MySQL(实战)
- StatefulSet 运行 MySQL
- CronJob 定期
mysqldump - 备份文件落盘到 Node
九、StatefulSet(有状态应用)
1️⃣ 有状态 vs 无状态
| 对比 | 无状态 | 有状态 |
|---|---|---|
| Pod 身份 | 无 | 固定 |
| 存储 | 不需要 | 必须 |
| 替换 | 任意 | 不可 |
| 示例 | Nginx | MySQL |
2️⃣ StatefulSet 核心特性
- 固定 Pod 名称(db-0 / db-1)
- 固定网络身份
- 持久化存储
- 有序创建 / 删除 / 升级
3️⃣ StatefulSet 三大组成
- Headless Service
- StatefulSet
- VolumeClaimTemplate
十、存储:NFS / PV / PVC
1️⃣ 为什么需要 PV / PVC
解耦:存储实现 vs 应用使用
- PV:存储资源(生产者)
- PVC:存储申请(消费者)
2️⃣ NFS 挂载示例
volumes:
- name: documentroot
nfs:
server: 192.168.100.138
path: /data/nfs
多个 Pod 共享同一存储
十一、核心总结
一句话版本
- Deployment = 无状态应用标配
- Service = 稳定访问入口
- ReplicaSet = 不要单独用
- DaemonSet = 每节点一个
- Job = 一次性任务
- CronJob = 定时任务
- StatefulSet = 有状态应用
- PV / PVC = 存储解耦
- VolumeClaimTemplate
十、存储:NFS / PV / PVC
1️⃣ 为什么需要 PV / PVC
解耦:存储实现 vs 应用使用
- PV:存储资源(生产者)
- PVC:存储申请(消费者)
2️⃣ NFS 挂载示例
volumes:
- name: documentroot
nfs:
server: 192.168.100.138
path: /data/nfs
多个 Pod 共享同一存储
十一、核心总结
一句话版本
- Deployment = 无状态应用标配
- Service = 稳定访问入口
- ReplicaSet = 不要单独用
- DaemonSet = 每节点一个
- Job = 一次性任务
- CronJob = 定时任务
- StatefulSet = 有状态应用
- PV / PVC = 存储解耦
更多推荐
所有评论(0)