这是《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 处理批处理。选择控制器就是选择生命周期。
思考题
- Deployment 和 ReplicaSet 的关系是什么?
- StatefulSet 的稳定标识有哪些用途?
- DaemonSet 适合什么场景?
- Job 重试策略如何设计?
- 哪些应用不适合 Deployment?