Skip to content

Kubernetes-Pod

Kubernetes 工作负载概述

工作负载是在 Kubernetes 上运行的应用程序。在 Kubernetes 中,无论你的负载是由单个组件还是由多个一同工作的组件构成, 你都可以在一组 Pod 中运行它。 在 Kubernetes 中, Pod 代表的是集群上处于运行状态的一组 容器 的集合。Kubernetes Pod 遵循预定义的生命周期。 例如,当在你的集群中运行了某个 Pod,但是 Pod 所在的 节点 出现致命错误时, 所有该节点上的 Pod 的状态都会变成失败。Kubernetes 将这类失败视为最终状态: 即使该节点后来恢复正常运行,你也需要创建新的 Pod 以恢复应用。不过,为了减轻用户的使用负担,通常不需要用户直接管理每个 Pod 。 而是使用负载资源来替用户管理一组 Pod。 这些负载资源通过配置 控制器 来确保正确类型的、处于运行状态的 Pod 个数是正确的,与用户所指定的状态相一致。

内置的工作负载资源

  • Deployment 和 ReplicaSet (替换原来的资源 ReplicationController)。 Deployment 很适合用来管理你的集群上的无状态应用, Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被替换。
  • StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pod。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet ,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。
  • DaemonSet 定义提供节点本地支撑设施的 Pod 。这些 Pod 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某 DaemonSet 的规约匹配,则控制平面会为该 DaemonSet 调度一个 Pod到该新节点上运行。
  • Job 和 CronJob。 定义一些一直运行到结束并停止的任务。 Job 用来执行一次性任务,而CronJob 用来执行的根据时间规划反复运行的任务

Pod 基本概念

  1. 最小部署单元:Pod 是 Kubernetes 中创建和管理的最小对象
  2. 容器组:一个 Pod 可以包含一个或多个紧密耦合的容器
  3. 共享环境:Pod 中的容器共享:
    • 网络命名空间(相同的 IP 和端口空间)
    • 存储卷(Volumes)
    • 内存/CPU 资源限制

Pod 的主要特点

  1. 生命周期短暂:Pod 是临时的,可以被创建、销毁和重新调度
  2. 原子性调度:Pod 中的所有容器总是被调度到同一个节点上
  3. 共享网络:Pod 内的容器通过 localhost 互相通信
  4. 共享存储:Pod 可以定义一组共享的存储卷

Pod 的典型使用场景

  1. 单容器 Pod:最常见的模式,一个 Pod 只运行一个容器
  2. Sidecar 模式:主容器 + 辅助容器(如日志收集器)
  3. 适配器模式:标准化不同容器的输出
  4. 大使模式:代理到外部服务的连接

Pod 多容器示例

demo-multi.yaml

yaml
apiVersion: v1
kind: Namespace
metadata:
  name: demo
---
apiVersion: v1
kind: Pod
metadata:
  name: demo-multi
  namespace: demo
spec:
  volumes:
    - name: html
      emptyDir: {}
  containers:
    - name: demo-nginx
      image: nginx
      volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
    - name: demo-alpine
      image: alpine
      command: ["/bin/sh","-c","while true; do date > /html/index.html; sleep 0.5; done;"]
      volumeMounts:
        - name: html
          mountPath: /html

进入pod

bash
kubectl exec -it demo-multi -n demo -c demo-nginx/demo-alpine -- /bin/sh
  • -c:选择进入那个容器

Pod 生命周期

  1. Pending:Pod 已被系统接受,但容器尚未创建
  2. Running:Pod 已绑定到节点,所有容器已创建
  3. Succeeded:所有容器成功终止
  4. Failed:至少一个容器异常终止
  5. Unknown:无法获取 Pod 状态

Pod 管理

  • 一般不直接创建 Pod:通常通过 Deployment、StatefulSet 等控制器来管理 Pod
  • 临时调试 Pod:可以使用 kubectl run命令快速创建临时 Pod
  • 查看 Pod 信息kubectl get pods, kubectl describe pod <pod-name>

Kubernetes Pod 生命周期

Pod 作为 Kubernetes 的最小调度单元,其生命周期管理是集群运维的核心知识。以下是 Pod 从创建到终止的完整生命周期解析:

Pod 生命周期阶段

  1. Pending(挂起)
    • Pod 已被 API Server 接受
    • 容器镜像正在下载或调度未完成
    • 典型场景:等待节点资源分配或镜像拉取
  2. Running(运行中)
    • Pod 已绑定到节点
    • 至少一个容器正在运行(包括 pause 容器)
    • 可能状态:所有容器运行中/部分容器启动中/部分容器失败但未达到重启策略阈值
  3. Succeeded(成功终止)
    • 所有容器正常退出(exit code 0)
    • 典型场景:Job/CronJob 类工作负载完成
  4. Failed(失败终止)
    • 至少一个容器异常终止(非 0 退出码)
    • 可能原因:容器执行失败/节点资源不足/OOMKilled
  5. Unknown(未知状态)
    • 无法获取 Pod 状态信息
    • 常见原因:节点失联/kubelet 进程异常

Pod 创建流程(详细时序)

mermaid
sequenceDiagram
    participant User
    participant API_Server
    participant Scheduler
    participant Kubelet
    participant Container_Runtime
    
    User->>API_Server: kubectl apply -f pod.yaml
    API_Server->>Scheduler: 未绑定Pod入调度队列
    Scheduler->>API_Server: 绑定到合适Node
    API_Server->>Kubelet: 节点监听新增Pod
    Kubelet->>Container_Runtime: 创建pause容器
    Container_Runtime-->>Kubelet: pause容器运行
    Kubelet->>Container_Runtime: 创建业务容器
    Container_Runtime-->>Kubelet: 业务容器状态
    Kubelet->>API_Server: 更新Pod状态

关键生命周期事件

Init Containers(初始化容器)

  • 串行执行,全部成功后才启动主容器
  • 典型用途:数据库迁移/配置文件生成/网络检查

容器探针(Probes)

探针类型检查时机失败后果
Startup Probe容器启动后阻止其他探针执行
Liveness Probe运行期间定期检查重启容器
Readiness Probe服务就绪检查从Service端点移除

容器钩子(Lifecycle Hooks)

yaml
lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "-c", "echo Hello > /tmp/startup"]
  preStop:
    httpGet:
      path: /graceful-shutdown
      port: 8080

Pod 终止流程(优雅关闭)

  1. 触发终止(以下事件之一)

    • 用户执行删除操作(kubectl delete)
    • 节点资源不足被驱逐
    • 健康检查失败
  2. 终止序列

    tex
    1. API Server 更新Pod状态为Terminating
    2. Kubelet 触发preStop钩子(默认30秒等待)
    3. 发送SIGTERM信号给容器进程
    4. 等待优雅退出期(默认30秒)
    5. 强制终止(SIGKILL)残留进程
    6. 清理容器资源并通知API Server