title: K8s 系列 | 第 3 天:Pod 详解:K8s 最小的调度单元与生命周期管理
tags:
– Kubernetes
– K8s系列
– DevOps
– Pod
– 容器编排
– 云原生
第 3 / 30 天
一、引言
在 Kubernetes 的世界里,Pod 是最小、最基础的调度单元。很多初学者容易把 Pod 和容器混为一谈——实际上,Pod 是「容器的外壳」,它封装了一个或多个紧密耦合的容器,并共享网络、存储和生命周期。
理解 Pod 是掌握 Kubernetes 一切操作的前提。无论是 Deployment、StatefulSet 还是 DaemonSet,最终管理的都是 Pod。今天我们就从核心概念 → 实战操作 → 状态管理 → 常见问题四个维度,把 Pod 彻底搞明白。
二、核心概念
2.1 Pod 是什么?
Pod 是 Kubernetes 中可以创建和管理的最小计算单元。一个 Pod 包含:
- 一个或多个容器(通常是一个主容器 + 多个 sidecar 辅助容器)
- 共享的网络命名空间(所有容器共享同一个 IP 和端口空间)
- 共享的存储卷(Pod 内容器可以通过 Volume 共享数据)
- 相同的生命周期(Pod 一起调度、一起销毁)
关键理解:Pod 是一个「逻辑主机」,里面的容器就像同一台机器上的多个进程,可以通过 localhost 互相通信。
2.2 Pod 的设计哲学
Kubernetes 之所以设计 Pod 而非直接调度容器,核心原因有二:
- 资源共享与协作:某些场景下,多个容器需要紧密协作(如日志采集 sidecar + 应用容器),共享网络和存储可以大幅简化架构
- 原子调度:Pod 内的所有容器一定被调度到同一个 Node 上,要么一起启动,要么都不启动
2.3 单容器 Pod vs 多容器 Pod
| 特征 | 单容器 Pod | 多容器 Pod |
|---|---|---|
| 适用场景 | 常规应用部署 | 日志采集、代理、适配器模式 |
| 典型模式 | 一个容器跑应用 | 主容器 + sidecar/ambassador/adapter |
| 通信方式 | localhost:端口 | localhost:端口 |
| 存储共享 | 无需特殊配置 | 通过 emptyDir 或 PVC 共享 |
三、实战步骤
3.1 创建一个最简单的 Pod
首先,让我们从最基础的 YAML 配置开始:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
env: dev
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
创建并验证:
# 创建 Pod
kubectl apply -f nginx-pod.yaml
# 查看 Pod 状态
kubectl get pods -o wide
# 查看 Pod 详细信息
kubectl describe pod nginx-pod
# 查看 Pod 日志
kubectl logs nginx-pod
# 进入 Pod 中的容器
kubectl exec -it nginx-pod -- /bin/sh
3.2 多容器 Pod(Sidecar 模式)
实际生产中,最经典的多容器 Pod 是「应用容器 + 日志采集 Sidecar」:
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
labels:
app: web-app
spec:
containers:
- name: app
image: nginx:1.25-alpine
ports:
- containerPort: 80
volumeMounts:
- name: logs
mountPath: /var/log/nginx
- name: log-collector
image: busybox:1.36
command: ["/bin/sh", "-c"]
args:
- while true; do
cat /var/log/nginx/access.log;
sleep 30;
done
volumeMounts:
- name: logs
mountPath: /var/log/nginx
volumes:
- name: logs
emptyDir: {}
# 验证两个容器都在运行
kubectl get pod app-with-sidecar
# 分别查看两个容器的日志
kubectl logs app-with-sidecar -c app
kubectl logs app-with-sidecar -c log-collector
3.3 Init 容器:在主容器启动前执行初始化
Init 容器在 Pod 中的普通容器启动之前运行,用于完成初始化任务(如等待数据库就绪、准备配置文件等):
apiVersion: v1
kind: Pod
metadata:
name: init-container-demo
spec:
initContainers:
- name: init-db-wait
image: busybox:1.36
command:
- sh
- -c
- |
echo "Waiting for database to be ready..."
until nc -zv mysql-service 3306; do
sleep 2
done
echo "Database is ready!"
- name: init-config-setup
image: busybox:1.36
command:
- sh
- -c
- |
echo "Generating config file..."
echo "DB_HOST=mysql-service" > /config/db.conf
volumeMounts:
- name: config
mountPath: /config
containers:
- name: main-app
image: nginx:1.25-alpine
volumeMounts:
- name: config
mountPath: /etc/app-config
volumes:
- name: config
emptyDir: {}
# 观察 Init 容器的执行过程
kubectl get pod init-container-demo -w
kubectl logs init-container-demo -c init-db-wait
Init 容器的关键特性:
– 按顺序依次执行
– 只有所有 Init 容器成功退出后,主容器才会启动
– 如果任一 Init 容器失败,Pod 会重启整个 Init 流程(取决于 restartPolicy)
四、Pod 生命周期管理
4.1 五种 Pod 状态
| 状态 | 含义 | 常见原因 |
|---|---|---|
| Pending | Pod 已创建但尚未调度到 Node | 资源不足、镜像拉取中、PVC 未绑定 |
| Running | 至少一个容器正在运行 | 正常状态 |
| Succeeded | 所有容器正常退出(Job/CronJob) | 批处理任务完成 |
| Failed | 至少一个容器以非零码退出 | 应用崩溃、配置错误 |
| Unknown | 无法获取 Pod 状态 | Node 失联、网络分区 |
4.2 容器探针(Probe)
Kubernetes 提供三类探针来确保容器健康运行:
apiVersion: v1
kind: Pod
metadata:
name: probe-demo
spec:
containers:
- name: web
image: nginx:1.25-alpine
ports:
- containerPort: 80
livenessProbe: # 存活探针:检测容器是否还活着
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe: # 就绪探针:检测容器是否准备好接收流量
httpGet:
path: /ready
port: 80
initialDelaySeconds: 3
periodSeconds: 5
startupProbe: # 启动探针:给慢启动应用更多时间
httpGet:
path: /startup
port: 80
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30 # 最多等待 150 秒
# 模拟探针触发
# 查看 Pod 就绪状态
kubectl get pod probe-demo
# 查看探针事件
kubectl describe pod probe-demo | grep -A 5 -i probe
三种探针的区别:
| 探针类型 | 失败后果 | 适用场景 |
|---|---|---|
| livenessProbe | 重启容器 | 检测死锁、内存泄漏 |
| readinessProbe | 从 Service Endpoints 移除 | 应用启动中、依赖未就绪 |
| startupProbe | 重启容器(慢启动场景) | 需要较长启动时间的应用 |
4.3 restartPolicy 三种策略
spec:
restartPolicy: Always # 默认值:始终重启(适合长期运行的服务)
# restartPolicy: OnFailure # 仅在失败时重启(适合批处理任务)
# restartPolicy: Never # 从不重启(适合一次性任务)
五、常见问题与排查思路
5.1 Pod 一直 Pending
# 排查步骤
kubectl describe pod <pod-name>
kubectl get events --sort-by='.lastTimestamp'
常见原因:
– Node 资源不足(CPU/Memory)
– PVC 未绑定(查看 PVC/PV 状态)
– NodeSelector / Affinity 不匹配
– Taints 与 Tolerations 不匹配
5.2 Pod 反复 CrashLoopBackOff
# 查看日志
kubectl logs <pod-name> --previous # 查看上一次崩溃的日志
kubectl logs <pod-name> -c <container-name>
# 查看事件
kubectl get events --field-selector involvedObject.name=<pod-name>
常见原因:
– 应用配置错误(环境变量、ConfigMap)
– 资源 Limit 设置过小导致 OOMKill
– 启动命令或参数错误
– Secret 挂载路径或权限问题
5.3 Pod 删除后一直 Terminating
# 强制删除
kubectl delete pod <pod-name> --force --grace-period=0
# 如果上述命令无效,清理 finalizers
kubectl patch pod <pod-name> -p '{"metadata":{"finalizers":null}}'
六、总结
今天我们深入学习了 Kubernetes 中最核心的抽象——Pod。从单容器 Pod 到多容器 Sidecar 模式,从 Init 容器初始化到三种探针保障健康,再到常见问题的排查手段,这些知识是后续学习所有控制器(Deployment、StatefulSet、DaemonSet)的基础。
Pod 的核心要点:
1. ✅ Pod 是最小调度单元,封装一个或多个共享网络/存储的容器
2. ✅ Init 容器按顺序执行,全部成功后才启动主容器
3. ✅ Liveness/Readiness/Startup 探针保障容器健康
4. ✅ 多容器 Pod 通过共享 Volume 和 localhost 通信,实现 Sidecar 模式
5. ✅ describe pod 和 kubectl logs 是排查问题的最有力工具
📺 下期预告
第 4 天:Deployment 与 ReplicaSet:声明式应用管理
我们将深入 Kubernetes 中最常用的工作负载控制器——Deployment。了解如何通过声明式配置管理应用副本数、实现滚动更新与回滚,以及 ReplicaSet 在其中扮演的角色。敬请期待!
📚 系列目录
K8s 系列 | 第 1 天:Kubernetes 是什么?核心概念与架构全景解析
K8s 系列 | 第 2 天:手把手搭建你的第一个 K8s 集群(kubeadm 实战)
→ 第 3 天:Pod 详解:K8s 最小的调度单元与生命周期管理(本篇)















暂无评论内容