K8s 系列 | 第 3 天:Pod 详解:K8s 最小的调度单元与生命周期管理


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 而非直接调度容器,核心原因有二:

  1. 资源共享与协作:某些场景下,多个容器需要紧密协作(如日志采集 sidecar + 应用容器),共享网络和存储可以大幅简化架构
  2. 原子调度: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 podkubectl logs 是排查问题的最有力工具


📺 下期预告

第 4 天:Deployment 与 ReplicaSet:声明式应用管理

我们将深入 Kubernetes 中最常用的工作负载控制器——Deployment。了解如何通过声明式配置管理应用副本数、实现滚动更新与回滚,以及 ReplicaSet 在其中扮演的角色。敬请期待!


📚 系列目录
K8s 系列 | 第 1 天:Kubernetes 是什么?核心概念与架构全景解析
K8s 系列 | 第 2 天:手把手搭建你的第一个 K8s 集群(kubeadm 实战)
→ 第 3 天:Pod 详解:K8s 最小的调度单元与生命周期管理(本篇)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容