Kubernetes Pod
Pod 是 Kubernetes 中 最小的可调度单位 Unit of Deployment。
Pod 的核心特点:
- 封装一个或多个容器
- 共享网络命名空间(IP/Port 都共享)
- 共享 Volume(数据卷)
- 与 Node 绑定(不会跨节点漂移)
- 由上层控制器管理(不可直接作为高可用模型)
Pod 本质是 K8s 为容器提供的“运行沙箱(sandbox)”。
容器本身是轻量级进程,但实际业务通常需要:
- Sidecar(如日志采集、代理 container)
- InitContainer(初始化任务)
- 同机协同运行多个进程
Pod 就是为了满足这些需求设计的,而不是直接调度 Docker/Containerd 容器。
Pod 是容器的逻辑单元,容器是不可直接调度的。
Kubernetes Pod 生命周期有清晰且可观测的状态:
| 阶段(Phase) | 说明 |
|---|---|
| Pending | 等调度/拉镜像 |
| Running | 所有容器运行(至少一个 running) |
| Succeeded | 任务完成(Job 场景) |
| Failed | 至少一个容器退出且不会自动重启 |
| Unknown | 节点不可达 |
| CrashLoopBackOff | 容器不停重启(最常见故障) |
Pod = metadata + spec + status
Pod Spec 关键字段(全量版)
主容器列表。
初始化容器,按顺序运行。
可用于运行 kubectl debug 注入调试容器。
持久卷 / 临时卷声明。
影响调度位置。
- Always
- OnFailure
- Never
Deployment = Always
Job = OnFailure 或 Never
优雅退出的最大等待时间(默认 30s)。
决定网络/命名空间是否与 Host 分享。
运行用户权限、SELinux、AppArmor、root 限制等。
Pod 中的每个容器支持 lifecycle hook:
- postStart(容器运行后立即触发)
- preStop(容器退出前触发)
常见用途:
- preStop 用于优雅退出(nginx/drain/flush)
- postStart 用于注册、初始化动作
Pod 的网络本质:
每个 Pod:
- 有唯一 IP(Pod IP)
- 容器之间通过 localhost 通信
- 同 Node 跨 Pod 通信:veth pair + bridge
- 跨节点通信:由 CNI(Calico, Cilium, Flannel)负责
Pod 的 IP 从不共享,即使 Deployment 重建也会变化。
想要固定访问,必须用 Service。
Pod 支持多种 Volume:
| Volume 类型 | 特点 | 场景 |
|---|---|---|
| emptyDir | Pod 删除就消失 | 缓存/临时文件 |
| hostPath | 挂载宿主机目录 | 调试/日志 |
| configMap / secret | 配置注入 | 配置文件/敏感数据 |
| PVC / CSI | 由存储插件管理 | 数据库/持久化数据 |
| downwardAPI | 注入 Pod 元数据 | Pod IP/Labels |
Pod 级别 Volume = 在 Pod 内所有容器之间共享。
K8s 调度策略由以下因素决定:
- nodeSelector 简单标签选择
- nodeAffinity 高级标签选择
- podAffinity / antiAffinity Pod 亲和/反亲和
- taints / tolerations 驱逐/容忍
- 资源 request/limit
- Pod Priority / Preemption
- (优先级抢占)
由 kubelet 管理,不受 API Server 控制。
适用于:
- 控制面原地启动
- 关键 Agent(离线管理)
由 Deployment/DaemonSet/StatefulSet 管理。
kubectl run 或 kubectl debug 创建。
kubectl describe pod <pod>
kubectl logs <pod> [-c container]
kubectl get pod -o wide
kubectl describe pod
kubectl exec -it <pod> -- sh
kubectl debug <pod> -it --image=busybox
kubectl describe pod | grep -i "failed"
用 Deployment / StatefulSet / DaemonSet。
避免资源抢占导致 OOMKilled。
例如:
- 日志 sidecar
- envoy/istio proxy
- 本地 agent
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 封装一个或多个协作容器,由控制器管理生命周期。