第3课:控制器类型和工作原理
深入理解Kubernetes控制器模式和各种控制器类型
🎯 学习目标
- 理解控制器模式的基本原理
- 掌握Deployment、StatefulSet等核心控制器
- 学习控制器的工作机制和调度过程
- 了解不同控制器的适用场景
- 通过实践案例掌握控制器的使用
3.1 控制器模式基础
🔄 什么是控制器模式?
控制器模式是Kubernetes的核心设计模式,通过不断比较期望状态和实际状态,驱动系统向期望状态收敛。控制器负责监控集群状态并采取必要行动。
🏗️ 控制器工作流程
控制器不断比较期望状态和实际状态,采取行动使两者一致
🎯 控制器的核心功能
- 状态监控:持续监控集群中资源的状态
- 差异检测:比较期望状态和实际状态的差异
- 纠正行动:采取必要措施消除差异
- 自我修复:自动处理节点故障、容器崩溃等问题
- 扩缩容:根据负载自动调整资源规模
3.2 核心控制器类型详解
🚀 Deployment
无状态应用控制器,提供声明式更新、滚动升级和回滚功能。适用于Web服务、API服务等无状态应用。
kubectl create deployment \
nginx --image=nginx:1.21
💾 StatefulSet
有状态应用控制器,为每个Pod提供稳定的网络标识和持久化存储。适用于数据库、消息队列等。
kubectl create statefulset \
mysql --image=mysql:8.0
📊 DaemonSet
守护进程控制器,确保每个节点(或指定节点)运行一个Pod副本。适用于日志收集、监控代理等。
kubectl create daemonset \
fluentd --image=fluentd:latest
🔄 Job/CronJob
批处理控制器,用于运行一次性任务或定时任务。适用于数据备份、报表生成等。
kubectl create job \
backup --image=busybox
3.3 Deployment深入解析
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 20
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
🔧 Deployment关键特性
滚动更新(Rolling Update)
逐步替换旧版本Pod,确保服务在更新过程中不中断。可以控制更新速度和可用性。
版本回滚(Rollback)
支持快速回滚到之前的版本,通过ReplicaSet记录历史版本。
扩缩容(Scaling)
支持手动和自动扩缩容,根据负载调整Pod副本数量。
3.4 StatefulSet深入解析
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
🔗 StatefulSet核心特性
稳定的网络标识
每个Pod拥有稳定的主机名和DNS记录,格式为:$(statefulset名称)-$(序号).$(service名称)
有序部署和扩展
Pod按照序号顺序创建、删除和扩展,确保数据一致性。
持久化存储
每个Pod拥有独立的持久化存储卷,数据不会因Pod重启而丢失。
3.5 DaemonSet和Job控制器
👻 DaemonSet应用场景
日志收集
在每个节点运行日志收集器(如Fluentd、Filebeat),收集容器日志。
监控代理
部署监控代理(如Prometheus Node Exporter),收集节点指标。
网络插件
运行网络插件(如Calico、Flannel),提供容器网络功能。
⏰ Job和CronJob
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["/bin/sh", "-c", "date; echo Hello from Kubernetes"]
restartPolicy: OnFailure
3.6 控制器实战操作
# 1. 创建Deployment
kubectl create deployment nginx --image=nginx:1.21 --replicas=3
# 2. 查看Deployment状态
kubectl get deployments
kubectl describe deployment nginx
# 3. 扩缩容操作
kubectl scale deployment nginx --replicas=5
# 4. 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.22
# 5. 查看更新历史
kubectl rollout history deployment/nginx
# 6. 回滚操作
kubectl rollout undo deployment/nginx
# 7. 创建StatefulSet
kubectl apply -f mysql-statefulset.yaml
# 8. 创建DaemonSet
kubectl apply -f fluentd-daemonset.yaml
# 9. 创建定时任务
kubectl create cronjob hello --image=busybox --schedule="*/5 * * * *" -- /bin/sh -c 'date'
3.7 控制器选择指南
📋 控制器选择矩阵
| 应用类型 |
推荐控制器 |
特点 |
| 无状态Web服务 |
Deployment |
滚动更新、自动恢复 |
| 数据库、有状态服务 |
StatefulSet |
稳定网络、持久存储 |
| 节点级守护进程 |
DaemonSet |
每个节点运行一个副本 |
| 批处理任务 |
Job/CronJob |
一次性或定时执行 |
3.8 最佳实践和注意事项
💡 控制器使用建议
- 合理设置副本数:根据业务需求和资源情况设置合适的副本数量
- 配置资源限制:为每个容器设置CPU和内存限制
- 使用健康检查:配置存活性探针和就绪性探针
- 版本控制:使用有意义的镜像标签,便于版本管理
- 监控告警:设置监控指标和告警规则
⚠️ 常见问题排查
- Pod无法启动:检查镜像拉取、资源配额、安全策略
- 服务不可用:验证Service配置、网络策略、端口映射
- 更新失败:检查镜像兼容性、资源限制、健康检查配置
- 性能问题:监控资源使用情况,调整副本数和资源限制