这是《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 内:
- 共享网络命名空间;
- 可通过 localhost 通信;
- 可共享 Volume;
- 共享 IPC 和 UTS;
- 生命周期绑定。
多容器模式:
| 模式 | 用途 |
|---|---|
| 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 快速定位阶段问题。
思考题
- 为什么 Pod 而不是容器作为调度单元?
- 同 Pod 容器如何通信?
- Init Container 适合什么任务?
- OOMKilled 和 CrashLoopBackOff 有什么区别?
- 静态 Pod 适合哪些组件?