Docker KubernetesNotes

第 12 章:控制器

zjc 于 2026-01-12 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 控制器负责维护工作负载期望状态。不同控制器对应不同生命周期语义,不能只按“能启动”选择。

12.1 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order
  template:
    metadata:
      labels:
        app: order
    spec:
      containers:
        - name: app
          image: registry.example.com/shop/order-service:1.2.0

查看:

kubectl get deployment order-service
kubectl rollout status deployment/order-service
kubectl rollout history deployment/order-service

12.2 ReplicaSet

Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod 副本。滚动发布时会同时存在新旧 ReplicaSet。

12.3 StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres-headless
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:16
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 100Gi

适合数据库、消息系统等有稳定网络标识和存储的工作负载。

12.4 DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter

每个满足条件的节点运行一个 Pod,适合日志采集、监控 Agent 和网络组件。

12.5 Job 与 CronJob

Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: data-migrate
spec:
  backoffLimit: 3
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: shop/migration:1.0.0

CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-report
spec:
  schedule: "5 1 * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec: ...

12.6 控制器选择

需求 控制器
无状态服务 Deployment
稳定标识和存储 StatefulSet
每节点一个 DaemonSet
一次性任务 Job
定时任务 CronJob
特殊自定义控制 Operator

本章小结

控制器是声明式模型的大脑。Deployment 管发布,StatefulSet 管有状态语义,DaemonSet 覆盖节点级任务,Job 与 CronJob 处理批处理。选择控制器就是选择生命周期。

思考题

  1. Deployment 和 ReplicaSet 的关系是什么?
  2. StatefulSet 的稳定标识有哪些用途?
  3. DaemonSet 适合什么场景?
  4. Job 重试策略如何设计?
  5. 哪些应用不适合 Deployment?