Pod 是 Kubernetes 里最小的调度单元。只要你把 Pod 理解清楚,后面的 Deployment、Service、探针、排障这些主题都会顺很多。反过来,如果对 Pod 的认知一直是模糊的,Kubernetes 往往会显得比它实际更玄。

Pod 到底是什么

一个 Pod 本质上是一个或多个容器组成的同一运行单元,它们共享:

  • 同一套网络命名空间
  • 同一个 Pod IP
  • 同一个端口空间
  • 以及可选的共享卷

大多数情况下,一个 Pod 只放一个主容器就够了。只有在生命周期真的强绑定时,多容器 Pod 才有明显价值。

什么时候一个 Pod 里放多个容器是合理的

  • sidecar 代理或监控组件
  • 日志转发或文件转换
  • 紧耦合的辅助进程
  • 通过 emptyDir 共享临时文件的流程

如果两个容器并不需要一起启动、一起终止、一起调度,那它们通常更适合拆成两个 Pod。

最小示例

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: app
      image: nginx:1.25
      ports:
        - containerPort: 80
    - name: sidecar
      image: busybox:1.36
      command: ["sh", "-c", "while true; do echo ok; sleep 5; done"]

现实里最先遇到的通常是什么问题

Pod 是很多问题第一次露面的地方,比如:

  • 调度失败
  • 镜像拉取失败
  • 探针失败
  • 持续重启
  • 资源不足
  • 配置或存储挂载异常

所以,Pod 也是最常见的排障切入口。

我最先信的证据链

Pod 出问题时,我通常先按这个顺序看:

kubectl get pod -n <ns> -o wide
kubectl describe pod -n <ns> <pod>
kubectl get events -n <ns> --sort-by=.lastTimestamp
kubectl logs -n <ns> <pod> -c <container> --previous

这几步基本能覆盖大部分日常问题,不需要先猜。

常见 Pod 故障形态

ImagePullBackOff

通常是镜像名、仓库凭证或网络问题。

CrashLoopBackOff

多数是应用退出、配置错误、依赖不可达,或者探针过于激进。

OOMKilled

一般是内存限额太小、内存泄漏,或者 requests / limits 设得很不合理。

readiness 失败

容器可能已经 Running,但 Service 依然不会把流量打进来。

Running 不等于 Ready

这是 Pod 里最关键的一课之一。

一个 Pod 可以:

  • 已经在跑,但还没 Ready
  • 进程活着,但还不适合接流量
  • liveness 看起来没问题,但 readiness 一直失败

所以 Running 绝不等于“服务已经没问题了”。

调度和资源也是 Pod 级问题

Pod 不是随便落到某个节点上的。调度器会结合:

  • requests / limits
  • taints / tolerations
  • affinity / anti-affinity
  • 拓扑约束
  • 节点可用资源

如果 requests 长期空着,调度器的判断空间就会变差,噪声邻居和资源争抢问题也更容易放大。

Pod 生命周期为什么重要

Pod 不是一台长期存在的机器,而是可替换的工作负载单元。

这会直接影响你如何设计:

  • 本地文件写入
  • 启动和关闭过程
  • 配置加载方式
  • 状态如何持久化

如果你的应用假设 Pod 永远不会换地方,那 Kubernetes 很快就会打破这个假设。

安全与作用域也会落到 Pod 上

很多安全和权限问题,最终都会在 Pod 这一层体现出来,比如:

  • ServiceAccount 身份
  • securityContext
  • Secret 挂载
  • namespace 边界
  • NetworkPolicy

这也是为什么很多 Pod 问题,最后会一路追到配置、权限和运行时安全上去。

几个很值钱的小习惯

  • 给 Pod 明确 labels
  • requests / limits 尽量别空着
  • readiness 和 liveness 分工清楚
  • 配置和 Secret 挂载方式要有意图
  • 日志一定要方便查看

这些看起来都是小事,但它们会让后面所有控制器行为都更容易解释。

FAQ

Q: 生产里应该直接创建 Pod 吗? A: 通常不建议。多数生产工作负载应该交给 Deployment 或 StatefulSet 之类的更高层控制器管理。

Q: 为什么 Pod 明明在 Running,应用却还是访问不到? A: 很常见的原因是 readiness 没过,或者 Service selector 没选中它。Running 只说明进程在,不说明流量已经能进来。

Q: 什么情况下适合做多容器 Pod? A: 当几个容器确实属于同一个生命周期和协作单元时,比如 sidecar 模式,而不是因为“它们看起来有关系”。

下一步阅读

  • 接着读 kubernetes-quickstart-deployment-replicaset.md,理解 Pod 是如何被更高层控制器管理的
  • 再读 kubernetes-quickstart-service.md,理解流量是怎么打到 Pod 上的
  • 如果你想继续看启动和健康行为,读 kubernetes-quickstart-probes.md

收个尾

Pod 是 Kubernetes 最“接地气”的入口。只要你能把 Pod 状态看明白,后面很多高层对象的行为都会从“神秘”变成“可追踪”。

参考链接