Docker KubernetesNotes

第 11 章:Pod

zjc 于 2026-01-11 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Pod 是 Kubernetes 最小调度单元,包含一个或多个共享网络和存储的容器。应用设计应尽量无状态、可重启、可替换。

11.1 Pod 示例

apiVersion: v1
kind: Pod
metadata:
  name: order-app
  labels:
    app: order
spec:
  restartPolicy: Always
  containers:
    - name: app
      image: registry.example.com/shop/order-service:1.2.0
      ports:
        - containerPort: 8080
      resources:
        requests:
          cpu: 250m
          memory: 512Mi
        limits:
          cpu: "1"
          memory: 1Gi
      env:
        - name: APP_ENV
          value: prod

11.2 Pod 内容器

同一 Pod 内:

  1. 共享网络命名空间;
  2. 可通过 localhost 通信;
  3. 可共享 Volume;
  4. 共享 IPC 和 UTS;
  5. 生命周期绑定。

多容器模式:

模式 用途
sidecar 代理、日志收集
adapter 输出格式转换
ambassador 外部访问代理
init 初始化任务

11.3 Pod 阶段

阶段 含义
Pending 已创建,未运行
Running 至少一个容器运行
Succeeded 成功退出
Failed 失败退出
Unknown 状态未知

查看:

kubectl get pod order-app -o wide
kubectl describe pod order-app
kubectl logs order-app -c app
kubectl get events --field-selector involvedObject.name=order-app

11.4 Init Container

initContainers:
  - name: wait-db
    image: busybox:1.36
    command: ['sh', '-c', 'until nc -z postgres 5432; do sleep 2; done']

Init 容器按顺序执行,全部成功后主容器才启动。

11.5 静态 Pod

静态 Pod 由节点上的 kubelet 直接管理,常用于控制面组件:

/etc/kubernetes/manifests/kube-apiserver.yaml

不要把业务应用配置成静态 Pod。

11.6 Pod 排查

kubectl exec -it order-app -- sh
kubectl port-forward pod/order-app 8080:8080
kubectl get pod order-app -o yaml
状态 常见原因
Pending 资源不足、亲和性、污点
ContainerCreating CNI、镜像、存储
ImagePullBackOff 凭据、镜像不存在
CrashLoopBackOff 应用错误、配置错误
OOMKilled 内存 limit 过低
Evicted 节点压力

本章小结

Pod 封装共享环境的容器组。生产应设置 requests / limits、健康探针、优雅停机和日志策略,并通过 describe、logs 和 events 快速定位阶段问题。

思考题

  1. 为什么 Pod 而不是容器作为调度单元?
  2. 同 Pod 容器如何通信?
  3. Init Container 适合什么任务?
  4. OOMKilled 和 CrashLoopBackOff 有什么区别?
  5. 静态 Pod 适合哪些组件?