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. 调度流程

  1. 通过 kubectl apply 向 API Server 提交 Pod 创建请求。
  2. API Server 将配置写入 etcd。
  3. Scheduler 监听 API Server,筛选符合条件的 Node(过滤 + 优先级排序)。
  4. Scheduler 将 Pod 绑定到目标 Node,更新 etcd。
  5. 目标 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. 生命周期阶段

  1. 初始化阶段:Init Container 执行环境初始化。
  2. 主容器启动:主容器启动后触发 postStart 钩子。
  3. 健康检查:执行存活探测(liveness)和就绪探测(readiness)。
  4. 终止阶段:触发 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容器非零退出码终止或被系统杀死
UnknownMaster 与 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 应用部署的核心载体,需重点掌握:

  1. 标签与控制器的关联逻辑。
  2. YAML 配置核心字段(镜像、资源限制、健康检查)。
  3. 调度约束与生命周期管理。
  4. 常见故障的排查方法。

后续可结合 Deployment、Service 等资源,实现 Pod 的高可用部署与服务暴露。

更多推荐