资源模型基础:Pod、Service、Deployment、StatefulSet 概述
在 Kubernetes 故障排查中,理解核心资源模型是定位故障域的第一步。Pod、Service、Deployment、StatefulSet 构成了绝大多数工作负载的骨架。它们之间的依赖关系、生命周期差异以及网络模型,往往是排错时最先需要确认的维度。
1. 核心资源角色与职责
| 资源类型 | 核心职责 | 排错关注点 |
|---|---|---|
| Pod | 最小调度单元,运行一个或多个容器,共享网络栈与存储卷 | 容器退出码、就绪探针、资源限制、镜像拉取 |
| Service | 提供稳定的网络端点,通过标签选择器将流量分发到后端 Pod | 端点列表、ClusterIP 可达性、端口映射、会话亲和性 |
| Deployment | 声明式管理无状态 Pod 的副本数、滚动更新与回滚 | 副本状态、更新策略、历史版本、Pod 模板哈希 |
| StatefulSet | 管理有状态 Pod,提供稳定的网络标识与持久化存储 | 序号索引、PVC 绑定、Pod 启动顺序、Headless Service |
排错口诀:Pod 看死活,Service 看端点,Deployment 看副本,StatefulSet 看序号与存储。
2. 资源模型关系图
下图展示了四种资源在集群中的典型协作关系。Deployment 或 StatefulSet 负责管理 Pod 的生命周期,Service 通过标签选择器将流量路由到后端 Pod,而 Pod 内部包含一个或多个容器。
3. 资源生命周期对比
不同资源在创建、更新、删除时的行为差异,是故障域划分的重要依据。下表总结了关键生命周期特征:
| 操作 | Deployment | StatefulSet | Service |
|---|---|---|---|
| 创建 | 立即创建 Pod,按 maxSurge 策略启动 | 按序号顺序创建 Pod,前一个 Ready 才启动下一个 | 创建后立即分配 ClusterIP,但 Endpoints 为空直到有匹配 Pod |
| 更新 | 滚动更新,逐步替换 Pod | 按序号逆序更新,保留 PVC 绑定 | 更新 selector 或 port 后,Endpoints 重新匹配 |
| 删除 | 删除 Pod 后 ReplicaSet 立即重建 | 删除 Pod 后按序号重建,PVC 保留 | 删除 Service 后 Endpoints 立即清除,Pod 不受影响 |
| 扩缩容 | 并行创建/删除 Pod | 按序号顺序创建/删除 Pod | 无需操作,自动感知后端 Pod 变化 |
常见陷阱:StatefulSet 的 Pod 删除后,PVC 不会自动删除。如果手动删除了 PVC,新 Pod 会因 PVC 绑定失败而处于 Pending 状态。这是有状态应用排错时最容易忽略的故障域。
4. 网络模型与标识
Pod 与 Service 之间的网络模型决定了流量路径。理解以下三个核心概念,有助于快速定位网络层面的故障:
- ClusterIP:Service 的虚拟 IP,仅在集群内部可达。通过 iptables 或 IPVS 规则将流量转发到后端 Pod。
- Pod IP:Pod 的真实网络地址,由 CNI 插件分配。Pod 重启后 IP 会变化,因此客户端应始终通过 Service 访问。
- Headless Service:设置
clusterIP: None,不提供负载均衡,直接返回后端 Pod 的 IP 列表。StatefulSet 通常配合 Headless Service 使用,为每个 Pod 提供稳定的 DNS 名称。
# 查看 Service 的 Endpoints 列表
kubectl get endpoints <service-name>
# 查看 Pod 的 IP 与就绪状态
kubectl get pods -o wide
# 查看 StatefulSet 的 DNS 记录(需配合 Headless Service)
kubectl run -it --rm dns-test --image=busybox -- nslookup <pod-name>.<service-name>.<namespace>.svc.cluster.local
5. 故障域划分原则
在排错时,将问题归因到正确的资源模型层,可以大幅缩小排查范围。以下是一套实用的故障域划分流程:
- Pod 层:检查 Pod 状态是否为 Running、就绪探针是否通过、容器日志是否有错误。如果 Pod 反复 CrashLoopBackOff,优先排查应用配置与资源限制。
- Service 层:检查 Endpoints 列表是否包含目标 Pod IP。如果 Endpoints 为空,检查 Service 的 selector 是否与 Pod 的 labels 匹配。
- Deployment/StatefulSet 层:检查副本数是否达到预期、更新策略是否阻塞、历史版本是否异常。如果 Pod 无法调度,检查节点资源与污点容忍。
- 存储层(StatefulSet 特有):检查 PVC 是否 Bound、StorageClass 是否存在、PV 的访问模式是否匹配。
实战案例:某生产环境 StatefulSet 的 Pod 一直处于 Pending 状态。通过
kubectl describe pod 发现 PVC 绑定失败,进一步排查发现 StorageClass 引用的存储后端磁盘配额已满。故障域定位到存储层,而非应用层。
6. 资源模型排错速查表
| 现象 | 可能故障域 | 排查命令 |
|---|---|---|
| Pod 一直 Pending | 调度、存储、资源配额 | kubectl describe pod <pod-name> |
| Pod 反复重启 | 应用配置、资源限制、探针 | kubectl logs --previous <pod-name> |
| Service 无法访问 | Endpoints、selector、端口 | kubectl get endpoints <svc-name> |
| Deployment 更新卡住 | 更新策略、就绪探针、副本数 | kubectl rollout status deployment <deploy-name> |
| StatefulSet Pod 启动顺序异常 | 序号依赖、PVC 绑定、Headless Service | kubectl get statefulset <sts-name> -o yaml |