4. Pod 与工作负载:生命周期与使用场景
在 Kubernetes 中,Pod 是最小的部署和调度单元,而 工作负载(Workload) 是管理 Pod 生命周期与副本状态的控制器抽象。理解 Pod 生命周期以及各类工作负载(Deployment、StatefulSet、DaemonSet、Job/CronJob)的适用场景,是构建弹性伸缩体系的基础。
4.1 Pod 生命周期与状态机
Pod 从创建到终止经历一系列状态,SRE 需掌握每个阶段的含义及故障排查切入点。
| 状态 | 说明 | 常见故障场景 |
|---|---|---|
| Pending | Pod 已被 API Server 接受,但尚未调度到节点或镜像拉取中 | 资源不足、PVC 未绑定、节点选择器不匹配 |
| Running | 至少一个容器正在运行,或正在启动/重启 | 就绪探针失败、OOMKill、CrashLoopBackOff |
| Succeeded | Pod 中所有容器成功终止(Job 场景) | 预期外退出码、日志未持久化 |
| Failed | Pod 中至少一个容器以非零退出码终止 | 应用异常、配置错误、资源限制 |
| Unknown | API Server 无法获取 Pod 状态(节点失联) | 节点宕机、网络分区、kubelet 停止响应 |
排查要点: 使用
kubectl describe pod <name> 查看 Events 字段,重点关注 FailedScheduling、BackOff、Unhealthy 等事件类型。
4.2 工作负载控制器使用场景
Kubernetes 提供多种工作负载控制器,每种控制器对应不同的运维需求。选择错误的控制器会导致扩缩容异常、数据丢失或服务中断。
4.2.1 Deployment:无状态服务
适用场景: Web 服务、API 网关、微服务等无状态应用。Deployment 提供声明式更新、滚动升级、回滚和副本管理。
- 弹性伸缩: 配合 HPA(Horizontal Pod Autoscaler)实现基于 CPU/内存/自定义指标的自动扩缩。
- 更新策略: RollingUpdate(默认)与 Recreate。滚动更新支持 maxSurge 和 maxUnavailable 参数控制速率。
- 故障排查: 检查 ReplicaSet 状态、Pod 模板哈希、更新历史(
kubectl rollout history)。
4.2.2 StatefulSet:有状态服务
适用场景: 数据库(MySQL、Cassandra)、消息队列(Kafka)、分布式协调(ZooKeeper)等需要稳定网络标识和持久化存储的应用。
| 特性 | 说明 | 运维关注点 |
|---|---|---|
| 稳定的 Pod 名称 | Pod 名称固定为 <statefulset-name>-<ordinal> |
扩缩容时序号不重用,避免数据错乱 |
| 稳定的网络标识 | 每个 Pod 拥有独立的 DNS 记录 | 集群内通信依赖 Headless Service |
| 有序部署/缩容 | 按序号顺序启动,逆序终止 | 缩容前需确认数据迁移或备份 |
| 持久化存储 | 每个 Pod 绑定独立的 PVC | PVC 模板需提前规划 StorageClass |
常见陷阱: StatefulSet 的滚动更新默认是 OnDelete 策略,需手动删除 Pod 触发重建。生产环境建议显式设置
updateStrategy: RollingUpdate 并配置 partition 实现灰度更新。
4.2.3 DaemonSet:节点级守护进程
适用场景: 日志采集(Fluentd)、监控代理(Prometheus Node Exporter)、网络插件(Calico)、节点存储(CSI Driver)。
- 调度特性: 默认在每个节点上运行一个 Pod,新节点加入时自动创建,节点删除时自动回收。
- 更新策略: RollingUpdate 支持 maxUnavailable 控制并发下线数量。
- 故障排查: 检查节点标签(
nodeSelector/affinity)是否匹配,以及 DaemonSet 的desiredNumberScheduled与currentNumberScheduled是否一致。
4.2.4 Job / CronJob:批处理与定时任务
适用场景: 数据迁移、批量计算、日志清理、定时备份、报表生成。
| 控制器 | 行为 | 关键参数 |
|---|---|---|
| Job | 运行指定数量的 Pod 直到成功终止 | completions(成功次数)、parallelism(并发数)、backoffLimit(重试次数) |
| CronJob | 按 Cron 表达式定时创建 Job | schedule(时间表达式)、startingDeadlineSeconds(启动截止时间)、concurrencyPolicy(并发策略) |
弹性伸缩关联: Job 的
parallelism 可在创建时设定,但运行中不支持动态调整。对于大规模批处理,建议拆分为多个小 Job 或使用 Work Queue 模式配合 HPA 实现动态 Worker 数量。
4.3 工作负载与弹性伸缩的关联
不同工作负载对弹性伸缩的支持程度不同,SRE 在设计自动扩缩策略时需注意以下约束:
- Deployment + HPA: 最成熟的组合,支持基于 CPU、内存、自定义指标(Prometheus、KEDA)的快速扩缩。
- StatefulSet + HPA: 支持水平扩缩,但需注意缩容时数据迁移和序号管理,建议配合
podManagementPolicy: Parallel加速扩缩。 - DaemonSet: 不支持 HPA,副本数由节点数量决定。如需调整资源,应使用 Node Autoscaler 或 Cluster Autoscaler。
- Job / CronJob: 不支持运行时 HPA,但可通过调整
parallelism或拆分任务实现“伪弹性”。
最佳实践: 在弹性伸缩运营中,优先使用 Deployment 封装无状态服务;对于有状态服务,评估是否可以通过 Operator 模式(如 TiDB Operator、Kafka Operator)实现更精细的扩缩容控制。