Kubernetes Pod 全面实操指南:从概念到故障排除
·
文章目录
Kubernetes Pod 全面实操指南:从概念到故障排除
一、Pod 核心概念与分类
1. 什么是 Pod?
Pod 是 Kubernetes 集群中最小的计算单元,本质是容器的运行环境,可封装一个或多个容器(主容器 + sidecar 边车容器)。同一 Pod 内的容器共享网络命名空间(Net Namespace)、UTS 命名空间、IPC 命名空间及存储资源,Pod IP 不固定,集群外无法直接访问。
2. Pod 分类
- 静态 Pod:由特定节点的 kubelet 直接管理,无需 API 服务器介入,故障时自动重启。
- 控制器管理的 Pod:通过 Deployment 等控制器管理,支持副本伸缩、版本更新与回滚。
3. Pod 与控制器的关联
Pod 与控制器通过 label-selector 唯一关联:
- 在 Pod 的 YAML 中定义标签(labels: app: nginx)。
- 在控制器的 YAML 中通过选择器匹配标签(selector: matchLabels: app: nginx)。
二、Pod 基础操作:查看、创建、删除
1. 查看 Pod
# 查看默认命名空间的 Pod
kubectl get pod # 简写 pod/pods 均可
# 查看指定命名空间(如 kube-system)的 Pod
kubectl get pod -n kube-system
# 查看 Pod 详细信息(含节点、IP)
kubectl get pods -o wide
# 查看 Pod 标签
kubectl get pods --show-labels
2. 创建 Pod
方式 1:命令行快速创建
# 创建名为 nginx1 的 Pod,使用 nginx:1.26-alpine 镜像
kubectl run nginx1 --image=nginx:1.26-alpine
# 指定命名空间创建
kubectl run nginx1 --image=nginx:1.26-alpine --namespace=game
方式 2:YAML 配置文件创建
基础 YAML 模板(pod1.yml):
apiVersion: v1 # 必选,API 版本号
kind: Pod # 必选,资源类型
metadata:
name: pod-stress # 必选,Pod 名称
namespace: default # 可选,默认 default
labels: # 可选,自定义标签
env: dev
app: nginx
spec:
containers: # 必选,容器列表
- name: c1 # 必选,容器名称
image: polinux/stress # 必选,镜像名称
imagePullPolicy: IfNotPresent # 镜像拉取策略
command: ["stress"] # 容器启动命令
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] # 启动参数
restartPolicy: Always # 重启策略:Always/OnFailure/Never
创建命令:
kubectl apply -f pod1.yml
3. 删除 Pod
单个 Pod 删除
# 按名称删除
kubectl delete pod pod-stress
# 按 YAML 文件删除
kubectl delete -f pod1.yml
多个 Pod 删除
# 直接指定多个 Pod 名称
kubectl delete pod pod1 pod2
# 批量删除(截取所有 Pod 名称)
kubectl get pods | awk 'NR>1 {print $1}' | xargs kubectl delete pod
# 删除命名空间(连带删除该命名空间下所有 Pod)
kubectl delete ns game
三、Pod 关键配置详解
1. 镜像拉取策略(imagePullPolicy)
控制镜像获取方式,默认规则:
- 镜像标签为
latest时,默认Always。 - 指定具体版本(如 1.26-alpine)时,默认
IfNotPresent。
| 策略 | 说明 |
|---|---|
| Always | 强制从仓库下载镜像 |
| Never | 仅使用本地镜像,本地无则失败 |
| IfNotPresent | 本地存在则使用,不存在则从仓库下载 |
配置示例:
spec:
containers:
- name: c1
image: polinux/stress
imagePullPolicy: IfNotPresent # 显式指定策略
2. Pod 标签管理
标签用于控制器关联、Pod 筛选,操作语法与 Node 标签一致:
# 为 Pod 添加标签
kubectl label pod pod-stress region=nanjing env=test
# 按标签查询 Pod(等值匹配)
kubectl get pods -l zone=A
# 按标签集合查询
kubectl get pods -l "zone in (A,B,C)"
# 删除 Pod 标签(标签名后加减号)
kubectl label pod pod-stress region- env-
3. 资源限制(resources)
通过 limits(最大限制)和 requests(初始请求)限制 CPU / 内存,避免资源争抢:
配置示例(pod2.yml):
apiVersion: v1
kind: Pod
metadata:
name: pod-stress2
namespace: namespace1
spec:
containers:
- name: c1
image: polinux/stress
args: ["--vm", "1", "--vm-bytes", "150M"]
resources:
limits:
memory: "200Mi" # 最大内存限制
cpu: "500m" # 最大 CPU 限制(1 核 = 1000m)
requests:
memory: "100Mi" # 初始内存请求
cpu: "200m" # 初始 CPU 请求
注意:若容器占用资源超出
limits,会被 OOM 杀死(状态CrashLoopBackOff)。
4. 多容器 Pod 配置
同一 Pod 可包含多个容器,共享网络和存储,但需避免端口冲突:
配置示例(pod4.yml):
apiVersion: v1
kind: Pod
metadata:
name: pod-stress4
spec:
containers:
- name: c1 # 第一个容器
image: polinux/stress
args: ["--vm", "1", "--vm-bytes", "150M"]
- name: c2 # 第二个容器
image: polinux/stress
args: ["--vm", "1", "--vm-bytes", "150M"]
验证容器状态:
# 查看 Pod 容器列表
kubectl exec pod-stress4 -- ps # 默认进入第一个容器
# 指定容器执行命令
kubectl exec pod-stress4 -c c2 -- date
四、Pod 调度机制
1. 调度流程
- 通过
kubectl apply向 API Server 提交 Pod 创建请求。 - API Server 将配置写入 etcd。
- Scheduler 监听 API Server,筛选符合条件的 Node(过滤 + 优先级排序)。
- Scheduler 将 Pod 绑定到目标 Node,更新 etcd。
- 目标 Node 的 kubelet 启动容器,更新 Pod 状态到 etcd。
2. 调度约束
方式 1:nodeName(直接指定节点名称)
spec:
nodeName: node2 # 直接调度到 node2,跳过 Scheduler
containers:
- name: nginx
image: nginx:1.26-alpine
方式 2:nodeSelector(按 Node 标签调度)
# 为 Node 打标签
kubectl label nodes node1 bussiness=game
spec:
nodeSelector:
bussiness: game # 调度到含该标签的 Node
containers:
- name: nginx
image: nginx:1.26-alpine
五、Pod 生命周期与健康检查
1. 生命周期阶段
- 初始化阶段:Init Container 执行环境初始化。
- 主容器启动:主容器启动后触发
postStart钩子。 - 健康检查:执行存活探测(liveness)和就绪探测(readiness)。
- 终止阶段:触发
preStop钩子,超时 30 秒后强制终止。
2. 重启策略
Always:容器终止即重启(默认),失败后延迟递增(10s→20s→…)。OnFailure:仅非 0 退出码时重启。Never:不重启。
3. 健康检查(Probe)
三种探测类型
| 探测类型 | 作用 | 失败处理 |
|---|---|---|
| Liveness Probe | 检查容器是否存活 | 杀死容器,按重启策略处理 |
| Readiness Probe | 检查容器是否就绪(可提供服务) | 从 Service 端点列表中移除 Pod IP |
| Startup Probe | 检查应用是否启动(禁用其他探针直到成功) | 杀死容器,按重启策略处理 |
四种探测方式
- Exec:执行命令判断结果。
- HTTPGet:访问 URL 检查状态码。
- TCPSocket:测试端口连通性。
- gRPC:通过 gRPC 健康检查(Alpha 特性)。
实操案例
案例 1:Liveness Probe(Exec 方式)
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args: ["/bin/sh", "-c", "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"]
livenessProbe:
exec:
command: ["cat", "/tmp/healthy"]
initialDelaySeconds: 5 # 启动后延迟 5s 探测
periodSeconds: 5 # 每 5s 探测一次
案例 2:Readiness Probe(HTTPGet 方式)
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget
spec:
containers:
- name: readiness
image: nginx:1.26-alpine
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 3
periodSeconds: 5
案例 3:postStart 与 preStop 钩子
apiVersion: v1
kind: Pod
metadata:
name: poststart-prestop
spec:
containers:
- name: main
image: nginx:1.26-alpine
lifecycle:
postStart: # 启动后创建目录
exec:
command: ["mkdir", "-p", "/usr/share/nginx/html/abc"]
preStop: # 终止前休眠 60s
exec:
command: ["/bin/sh", "-c", "sleep 60"]
六、Pod 故障排除
1. 常见状态及原因
| 状态 | 原因分析 |
|---|---|
| Pending | 调度失败(资源不足、节点标签不匹配)或镜像下载慢 |
| CrashLoopBackOff | 容器启动后快速退出(命令错误、端口冲突、OOM) |
| Running(0/1) | 就绪探测失败(服务未启动、文件缺失) |
| Failed | 容器非零退出码终止或被系统杀死 |
| Unknown | Master 与 Node 通信故障 |
2. 排错命令
# 查看 Pod 详细事件(调度、镜像拉取、启动日志)
kubectl describe pod <pod-name>
# 查看容器日志(多容器需指定 -c 容器名)
kubectl logs <pod-name> [-c <container-name>]
# 进入容器交互排查
kubectl exec -it <pod-name> [-c <container-name>] -- /bin/bash
总结
Pod 是 Kubernetes 应用部署的核心载体,需重点掌握:
- 标签与控制器的关联逻辑。
- YAML 配置核心字段(镜像、资源限制、健康检查)。
- 调度约束与生命周期管理。
- 常见故障的排查方法。
后续可结合 Deployment、Service 等资源,实现 Pod 的高可用部署与服务暴露。
更多推荐

所有评论(0)