Kubernetes 工作负载
Deployment、StatefulSet、DaemonSet、Job、CronJob 的使用场景、发布回滚和异常排查。
Kubernetes 工作负载
工作负载控制器负责管理 Pod 的副本数、发布策略、重启和生命周期。日常应用交付最常用的是 Deployment、StatefulSet、DaemonSet、Job 和 CronJob。
类型选择
| 类型 | 适合场景 |
|---|---|
| Deployment | 无状态 Web 服务、API、Worker |
| StatefulSet | 有状态服务,需要稳定网络标识和有序部署 |
| DaemonSet | 每个节点运行一个 Pod,例如日志采集、监控 Agent |
| Job | 一次性任务 |
| CronJob | 定时任务 |
Deployment
Deployment 适合无状态应用,支持滚动发布和回滚。
# API 版本。Deployment 属于 apps 资源组,稳定版本为 apps/v1。
apiVersion: apps/v1
# 资源类型。这里表示创建 Deployment 控制器。
kind: Deployment
metadata:
# Deployment 名称,同一命名空间内必须唯一。
name: order-api
spec:
# 期望副本数,Deployment 会尽量维持 3 个可用 Pod。
replicas: 3
# 保留历史 ReplicaSet 数量,用于 rollout undo 回滚。
revisionHistoryLimit: 5
# Deployment 用 selector 找到自己管理的 Pod。
# matchLabels 必须和 template.metadata.labels 匹配。
selector:
matchLabels:
app: order-api
# 发布策略。RollingUpdate 表示滚动发布。
strategy:
type: RollingUpdate
rollingUpdate:
# 发布过程中最多可以额外创建 25% 的 Pod。
maxSurge: 25%
# 发布过程中最多允许不可用的 Pod 数量。
# 设置为 0 表示发布期间尽量不减少可用副本。
maxUnavailable: 0
# Pod 模板。Deployment 会根据这个模板创建 Pod。
template:
metadata:
# Pod 标签,必须能被 selector.matchLabels 匹配。
labels:
app: order-api
spec:
# Pod 中的容器列表。
containers:
# 容器名称,在同一个 Pod 内必须唯一。
- name: app
# 容器镜像,生产环境建议使用不可变 tag 或 digest。
image: registry.example.com/order-api:v1.0.0
# 容器声明的监听端口,主要用于文档化和 Service targetPort 引用。
ports:
- containerPort: 8080
# 就绪探针。失败时 Pod 会从 Service 后端摘除,但不会自动重启。
readinessProbe:
httpGet:
# 健康检查路径,由应用提供。
path: /healthz
# 探针访问的容器端口。
port: 8080
关键字段说明:
| 字段 | 说明 |
|---|---|
spec.replicas | 期望副本数 |
spec.selector | 选择 Deployment 管理哪些 Pod,创建后不建议修改 |
spec.template | Pod 模板,镜像、标签、环境变量、探针都在这里定义 |
strategy.rollingUpdate.maxSurge | 滚动发布时允许额外创建的 Pod 数 |
strategy.rollingUpdate.maxUnavailable | 滚动发布时允许不可用的 Pod 数 |
readinessProbe | 判断 Pod 是否可以接收流量 |
发布和回滚:
kubectl apply -f deployment.yaml
kubectl rollout status deployment/order-api -n default
kubectl rollout history deployment/order-api -n default
kubectl rollout undo deployment/order-api -n default
修改镜像:
kubectl set image deployment/order-api app=registry.example.com/order-api:v1.0.1 -n default
StatefulSet
StatefulSet 提供稳定 Pod 名称、稳定网络标识和有序发布,适合数据库、中间件和需要持久化身份的服务。
# API 版本。StatefulSet 属于 apps 资源组。
apiVersion: apps/v1
# 资源类型。这里表示创建 StatefulSet 控制器。
kind: StatefulSet
metadata:
# StatefulSet 名称,会作为 Pod 名称前缀。
name: redis
spec:
# 关联的 Headless Service 名称。
# StatefulSet 依赖它为每个 Pod 提供稳定 DNS。
serviceName: redis-headless
# 期望副本数,会生成 redis-0、redis-1、redis-2。
replicas: 3
# StatefulSet 用 selector 找到自己管理的 Pod。
selector:
matchLabels:
app: redis
# Pod 模板。
template:
metadata:
# Pod 标签,必须能被 selector.matchLabels 匹配。
labels:
app: redis
spec:
containers:
# 容器名称。
- name: redis
# Redis 镜像。
image: redis:7.2
# Redis 服务端口。
ports:
- containerPort: 6379
关键字段说明:
| 字段 | 说明 |
|---|---|
spec.serviceName | 关联 Headless Service,提供稳定网络标识 |
spec.replicas | 期望副本数,Pod 会按序号创建 |
spec.selector | 选择 StatefulSet 管理哪些 Pod |
spec.template | Pod 模板 |
Pod 名称会按序号生成:
redis-0
redis-1
redis-2
DaemonSet
DaemonSet 确保每个匹配节点上运行一个 Pod。
kubectl get daemonset -A
kubectl rollout status daemonset/node-exporter -n monitoring
kubectl rollout restart daemonset/node-exporter -n monitoring
常见用途:
- 日志采集 Agent。
- 节点监控 Agent。
- CNI 组件。
- 存储插件节点组件。
Job 和 CronJob
Job 适合一次性任务:
kubectl create job db-migrate --image=registry.example.com/migrate:v1
kubectl get job
kubectl logs job/db-migrate
CronJob 适合定时任务:
# API 版本。CronJob 属于 batch 资源组。
apiVersion: batch/v1
# 资源类型。这里表示创建定时任务。
kind: CronJob
metadata:
# CronJob 名称。
name: report-cleaner
spec:
# Cron 表达式。这里表示每天 02:00 执行。
schedule: "0 2 * * *"
# Job 模板。每次触发调度时都会基于该模板创建一个 Job。
jobTemplate:
spec:
# Pod 模板。
template:
spec:
# 任务失败时重启容器;Job / CronJob 常用 OnFailure 或 Never。
restartPolicy: OnFailure
containers:
# 容器名称。
- name: cleaner
# 任务镜像。
image: busybox:1.36
# 容器启动命令。
command: ["sh", "-c", "echo clean"]
关键字段说明:
| 字段 | 说明 |
|---|---|
spec.schedule | Cron 表达式,决定任务触发时间 |
spec.jobTemplate | 每次触发时创建的 Job 模板 |
restartPolicy | Job 类型工作负载通常使用 OnFailure 或 Never |
containers.command | 覆盖镜像默认启动命令 |
扩缩容
kubectl scale deployment/order-api --replicas=5 -n default
kubectl get deploy order-api -n default
kubectl get rs -n default -l app=order-api
暂停和恢复发布
kubectl rollout pause deployment/order-api -n default
kubectl rollout resume deployment/order-api -n default
适合批量修改多个字段后再统一触发滚动发布。
常见排查
Deployment 发布卡住:
kubectl rollout status deployment/order-api -n default
kubectl describe deployment order-api -n default
kubectl get rs,pod -n default -l app=order-api
kubectl describe pod <pod-name> -n default
StatefulSet 更新慢:
- 检查前一个序号 Pod 是否 Ready。
- 检查 PVC 挂载是否正常。
- 检查探针是否过于严格。
DaemonSet 没有覆盖所有节点:
kubectl describe daemonset <name> -n <namespace>
kubectl get nodes --show-labels
kubectl describe node <node-name>
重点检查 nodeSelector、亲和性、污点容忍和节点资源。