返回文章列表
Cloud Native

Pod:Kubernetes 中后端服务的最小运行单元

解释 Pod 与容器的关系、共享网络、生命周期特点,以及后端开发者最常用的 Pod 排查命令。

2026-05-1618 min

文章定位

面向生产环境的实战经验沉淀,适合拿来做方案评审、复盘和升级前检查。

阅读建议

先看标题和列表,再回到关键段落。技术文章更适合跳读和回查的阅读节奏。

适合场景

云原生、后端工程、系统设计、性能优化、故障处理和团队知识沉淀。

这篇解决什么问题#

后端开发者从 Docker 进入 Kubernetes 时,最常见的困惑是:我明明只想跑一个容器,为什么还要先理解 Pod?

因为 Kubernetes 不直接调度单个容器,而是调度 Pod。Pod 是一个小运行环境,里面可以包含一个或多个容器,这些容器共享网络命名空间和部分存储。大多数后端 API 是“一个 Pod 一个主容器”,但理解 Pod 之后,日志、端口、探针、Sidecar 和 Service 选择都会清晰很多。

架构位置#

Pod 位于 Deployment 和 Container 之间:

CODE
Deployment
  -> ReplicaSet
  -> Pod
  -> Container
  -> 后端进程

Deployment 负责维持副本数,Pod 承载真实运行环境,容器里才是你的后端进程。生产中通常修改 Deployment,让它创建新的 Pod,而不是手动修改现有 Pod。

核心名词#

  • Pod:Kubernetes 最小调度单位。
  • Container:Pod 内运行的容器。
  • Pod IP:Pod 在集群网络中的地址,Pod 重建后可能变化。
  • label:标签,Service 和控制器常用它选择 Pod。
  • restartPolicy:Pod 内容器退出后的重启策略。
  • initContainer:主容器启动前执行的初始化容器。
  • sidecar:和主容器同 Pod 运行的辅助容器。
  • phase:Pod 生命周期阶段,例如 Pending、Running、Succeeded、Failed。

最小示例#

下面示例运行一个 nginx,模拟后端 HTTP 服务:

CODE
apiVersion: v1
kind: Pod
metadata:
  name: api-pod
  labels:
    app: api
spec:
  containers:
    - name: api
      image: nginx:1.27
      ports:
        - containerPort: 80
      env:
        - name: APP_ENV
          value: dev

执行:

CODE
kubectl apply -f pod.yaml
kubectl get pod api-pod -o wide
kubectl describe pod api-pod
kubectl logs api-pod

containerPort 是声明容器内进程监听的端口,主要给读 YAML 的人和某些工具看。它不是对外暴露服务,外部访问还需要 Service、Ingress 或端口转发。

Pod 内多容器通信#

同一个 Pod 内的容器共享网络命名空间,所以它们可以通过 localhost 互相访问。例如主容器监听 8080,Sidecar 可以请求 http://127.0.0.1:8080

但不同 Pod 之间不能用 localhost,即使它们在同一个 Node 上。Pod 间访问应该通过 Pod IP 或更稳定的 Service。后端服务调用另一个服务时,生产中优先使用 Service DNS。

高频命令#

CODE
kubectl get pods
kubectl get pod api-pod -o wide
kubectl describe pod api-pod
kubectl logs api-pod
kubectl logs -f api-pod
kubectl logs api-pod -c api
kubectl exec -it api-pod -- sh
kubectl delete pod api-pod

get pod 看状态,describe pod 看事件和配置,logs 看应用输出,exec 进容器临时排查。生产环境里 exec 要谨慎,排查结论应回到镜像、配置或 YAML,而不是在容器里手工修。

参数意义#

-o wide 会显示 Pod IP、所在 Node 等更多信息。网络不通或调度异常时,这些字段很关键。

-c 用来指定 Pod 内某个容器。如果 Pod 里有多个容器,不加 -c 可能无法确定要看哪个容器的日志。

--previous 可以查看上一次崩溃容器的日志。遇到 CrashLoopBackOff 时,当前容器可能刚重启,真正错误在 previous 日志里。

delete pod 对裸 Pod 是删除,对 Deployment 管理的 Pod 则会触发重建。看到 Pod 被删除后又出现,是控制器在维持副本数。

常见问题#

第一,直接管理生产 Pod。裸 Pod 缺少滚动更新和副本管理能力,生产后端服务应使用 Deployment。

第二,把 Pod IP 写进配置。Pod IP 会变化,服务调用应该走 Service。

第三,容器内服务只监听 127.0.0.1。如果主进程只绑定本地回环地址,Pod 外部可能无法访问,后端服务通常要监听 0.0.0.0

第四,只看日志不看事件。镜像拉取失败、调度失败、配置引用错误等问题,日志里未必有,describe pod 的 Events 更直接。

后端开发者检查清单#

  • 知道 Kubernetes 调度的是 Pod,不是单个容器。
  • 能解释同 Pod 容器为什么可以通过 localhost 通信。
  • 后端服务是否监听 0.0.0.0 和正确端口。
  • 排查 Pod 时是否先看状态,再看 Events,再看日志。
  • 多容器 Pod 查看日志时是否指定 -c
  • 遇到重启是否查看 --previous 日志。
  • 是否避免把 Pod IP 写入业务配置。
  • 生产服务是否交给 Deployment 管理。

相关文章