Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kubernetes Pod

🧩 1. Pod 是什么?

Pod 是 Kubernetes 中 最小的可调度单位 Unit of Deployment。

Pod 的核心特点:

  • 封装一个或多个容器
  • 共享网络命名空间(IP/Port 都共享)
  • 共享 Volume(数据卷)
  • 与 Node 绑定(不会跨节点漂移)
  • 由上层控制器管理(不可直接作为高可用模型)

Pod 本质是 K8s 为容器提供的“运行沙箱(sandbox)”。

🧩 2. 为什么需要 Pod?

容器本身是轻量级进程,但实际业务通常需要:

  • Sidecar(如日志采集、代理 container)
  • InitContainer(初始化任务)
  • 同机协同运行多个进程

Pod 就是为了满足这些需求设计的,而不是直接调度 Docker/Containerd 容器。

Pod 是容器的逻辑单元,容器是不可直接调度的。

🧩 3. Pod 生命周期(重点)

Kubernetes Pod 生命周期有清晰且可观测的状态:

阶段(Phase) 说明
Pending 等调度/拉镜像
Running 所有容器运行(至少一个 running)
Succeeded 任务完成(Job 场景)
Failed 至少一个容器退出且不会自动重启
Unknown 节点不可达
CrashLoopBackOff 容器不停重启(最常见故障)

🧩 4. Pod 组成结构(Spec)

Pod = metadata + spec + status

Pod Spec 关键字段(全量版)

1. containers

主容器列表。

2. initContainers

初始化容器,按顺序运行。

3. ephemeralContainers(调试时用)

可用于运行 kubectl debug 注入调试容器。

4. volumes

持久卷 / 临时卷声明。

5. nodeSelector / affinity / tolerations

影响调度位置。

6. restartPolicy

  • Always
  • OnFailure
  • Never

Deployment = Always

Job = OnFailure 或 Never

7. terminationGracePeriodSeconds

优雅退出的最大等待时间(默认 30s)。

8. dnsPolicy / hostNetwork / hostPID / hostIPC

决定网络/命名空间是否与 Host 分享。

9. securityContext

运行用户权限、SELinux、AppArmor、root 限制等。

🧩 5. 容器生命周期钩子

Pod 中的每个容器支持 lifecycle hook:

  • postStart(容器运行后立即触发)
  • preStop(容器退出前触发)

常见用途:

  • preStop 用于优雅退出(nginx/drain/flush)
  • postStart 用于注册、初始化动作

🧩 6. Pod 的网络模型(CNI)

Pod 的网络本质:

每个 Pod:

  • 有唯一 IP(Pod IP)
  • 容器之间通过 localhost 通信
  • 同 Node 跨 Pod 通信:veth pair + bridge
  • 跨节点通信:由 CNI(Calico, Cilium, Flannel)负责

Pod 的 IP 从不共享,即使 Deployment 重建也会变化。

想要固定访问,必须用 Service。

🧩 7. Pod 的 Volume 模型

Pod 支持多种 Volume:

Volume 类型 特点 场景
emptyDir Pod 删除就消失 缓存/临时文件
hostPath 挂载宿主机目录 调试/日志
configMap / secret 配置注入 配置文件/敏感数据
PVC / CSI 由存储插件管理 数据库/持久化数据
downwardAPI 注入 Pod 元数据 Pod IP/Labels

Pod 级别 Volume = 在 Pod 内所有容器之间共享。

🧩 8. Pod 调度(调度器如何决定 Pod 去哪个节点?)

K8s 调度策略由以下因素决定:

  1. nodeSelector 简单标签选择
  2. nodeAffinity 高级标签选择
  3. podAffinity / antiAffinity Pod 亲和/反亲和
  4. taints / tolerations 驱逐/容忍
  5. 资源 request/limit
  6. Pod Priority / Preemption
    • (优先级抢占)

🧩 9. Pod 的三大类别(实际使用非常重要)

1. 静态 Pod(Static Pod)

由 kubelet 管理,不受 API Server 控制。

适用于:

  • 控制面原地启动
  • 关键 Agent(离线管理)

2. 普通 Pod(由控制器创建)

由 Deployment/DaemonSet/StatefulSet 管理。

3. 临时调试 Pod

kubectl run 或 kubectl debug 创建。

🧩 10. Pod 故障排查方法(最常用的 7 条)

1. 看 events

kubectl describe pod <pod>

2. 看日志

kubectl logs <pod> [-c container]

3. 查看容器重启次数

kubectl get pod -o wide

4. 看容器状态(waiting/reason)

kubectl describe pod

5. 进入容器

kubectl exec -it <pod> -- sh

6. 调试容器(ephemeral)

kubectl debug <pod> -it --image=busybox

7. 查看调度失败原因

kubectl describe pod | grep -i "failed"

🧩 11. 最佳实践(按生产级整理)

1. 永远不要直接创建 Pod(除非调试)

用 Deployment / StatefulSet / DaemonSet。

2. 设置 cpu/memory request/limits

避免资源抢占导致 OOMKilled。

3. 定义健康检查(liveness/readiness/startup)

4. 容器必须无状态(有状态用 StatefulSet + PVC)

5. 使用 initContainer 做初始化操作

6. Sidecar 模式拆分功能

例如:

  • 日志 sidecar
  • envoy/istio proxy
  • 本地 agent

7. 避免 hostPath(除非必须)

8. 避免 privileged 模式

🧩 12. Pod 完整示例(含 initContainer、sidecar、probe)

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  initContainers:
  - name: init-db
    image: busybox
    command: ["sh", "-c", "echo init && sleep 3"]

  containers:
  - name: app
    image: nginx
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet: { path: "/", port: 80 }
      initialDelaySeconds: 5
    readinessProbe:
      httpGet: { path: "/", port: 80 }
      initialDelaySeconds: 3

  - name: sidecar
    image: busybox
    command: ["sh", "-c", "tail -f /var/log/app.log"]

  volumes:
  - name: logs
    emptyDir: {}

🎯 总结一句话

Pod 是 Kubernetes 中最小的可调度、可运行单元,通过共享网络和 Volume 封装一个或多个协作容器,由控制器管理生命周期。