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.templatePod 模板,镜像、标签、环境变量、探针都在这里定义
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.templatePod 模板

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.scheduleCron 表达式,决定任务触发时间
spec.jobTemplate每次触发时创建的 Job 模板
restartPolicyJob 类型工作负载通常使用 OnFailureNever
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、亲和性、污点容忍和节点资源。