Kubernetes学习之旅-kubernetes 控制器
Kubernetes控制器详解:自动化管理的核心引擎
什么是Kubernetes控制器?
Kubernetes控制器是控制回路(Control Loop)的核心组件,它通过持续监控集群状态,并驱动实际状态向期望状态收敛。控制器是Kubernetes实现声明式API和自动化运维的关键机制。
为什么需要控制器?
在没有控制器的情况下,管理员需要:
手动创建和管理Pod
监控Pod状态并在失败时手动重启
手动扩展应用实例数量
处理节点故障时的Pod迁移
控制器将这些操作自动化,让用户只需声明期望状态,Kubernetes会自动维护这个状态。
核心控制器类型
1. Deployment - 无状态应用控制器
功能:管理Pod副本集,支持滚动更新、回滚和扩缩容
yaml
apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3 selector: matchLabels: app: web-server template: metadata: labels: app: web-server spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0
2. StatefulSet - 有状态应用控制器
功能:管理有状态应用,提供稳定的网络标识和持久化存储
yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: database spec: serviceName: "database" replicas: 3 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 ports: - containerPort: 3306 volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi
3. DaemonSet - 节点守护控制器
功能:在每个节点或特定节点上运行一个Pod副本
yaml
apiVersion: apps/v1 kind: DaemonSet metadata: name: log-collector spec: selector: matchLabels: name: log-collector template: metadata: labels: name: log-collector spec: containers: - name: fluentd image: fluentd:latest volumeMounts: - name: varlog mountPath: /var/log volumes: - name: varlog hostPath: path: /var/log
4. Job - 批处理任务控制器
功能:运行一次性任务直到完成
yaml
apiVersion: batch/v1 kind: Job metadata: name: data-processor spec: completions: 1 parallelism: 1 template: spec: containers: - name: processor image: data-processor:latest command: ["python", "process.py"] restartPolicy: Never backoffLimit: 4
5. CronJob - 定时任务控制器
功能:基于时间调度运行Job
yaml
apiVersion: batch/v1 kind: CronJob metadata: name: daily-backup spec: schedule: "0 2 * * *" # 每天凌晨2点 jobTemplate: spec: template: spec: containers: - name: backup image: backup-tool:latest command: ["/bin/backup.sh"] restartPolicy: OnFailure
控制器的工作原理
控制回路(Control Loop)
每个控制器都运行一个无限循环,执行以下步骤:
观察(Observe):通过API Server获取当前状态
比较(Diff):比较当前状态与期望状态
操作(Act):执行操作使当前状态匹配期望状态
重复(Repeat):持续循环监控
示例:Deployment控制流程
用户创建Deployment
↓
Deployment Controller创建ReplicaSet
↓
ReplicaSet Controller创建Pod
↓
Scheduler分配Pod到节点
↓
kubelet创建并运行容器
↓
Controllers持续监控状态
控制器的协同工作
层级关系
Deployment → ReplicaSet → Pod StatefulSet → Pod DaemonSet → Pod CronJob → Job → Pod
控制器管理器(Controller Manager)
Kubernetes运行多个内置控制器,包括:
Deployment控制器
ReplicaSet控制器
StatefulSet控制器
DaemonSet控制器
Job控制器
CronJob控制器
节点控制器
端点控制器
服务账户控制器
高级控制器特性
扩缩容(Scaling)
bash
# 手动扩缩容 kubectl scale deployment/web-app --replicas=5 # 基于CPU使用率的自动扩缩容 apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
滚动更新策略
yaml
strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% # 最大激增Pod数量 maxUnavailable: 25% # 最大不可用Pod数量资源管理
资源管理
yaml
resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"
故障排查技巧
查看控制器状态
bash
# 查看Deployment状态 kubectl describe deployment/my-deployment # 查看控制器事件 kubectl get events --sort-by='.lastTimestamp' # 查看Pod状态 kubectl get pods -o wide # 查看控制器日志 kubectl logs -n kube-system -l component=kube-controller-manager
常见问题解决
bash
# Pod一直Pending kubectl describe pod <pod-name> # 镜像拉取失败 kubectl get events | grep -i "pull" # 资源不足 kubectl describe nodes
总结
Kubernetes控制器是集群自动化管理的核心,它们:
实现声明式API:用户只需描述期望状态
提供自动化运维:自动修复、扩缩容、更新
支持多种工作负载:无状态、有状态、批处理、定时任务
保证高可用性:通过副本管理和故障转移
支持扩展:可以通过自定义控制器满足特定需求
掌握各种控制器的特性和使用场景,是有效使用Kubernetes的关键。选择合适的控制器类型,合理配置控制策略,可以大大提高应用的稳定性和可维护性。
更多推荐


所有评论(0)