<返回目录     Powered by claud/xia兄

第3课:控制器类型和工作原理

深入理解Kubernetes控制器模式和各种控制器类型

🎯 学习目标

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 最佳实践和注意事项

💡 控制器使用建议

⚠️ 常见问题排查