5.k8s的pod介绍

k8s的pod介绍

    • [一、Pod 概述](#一、Pod 概述)
      • [1.1 定义与本质](#1.1 定义与本质)
      • [1.2 使用模式](#1.2 使用模式)
    • [二、Pod 内部架构](#二、Pod 内部架构)
      • [2.1 Pause 容器(Infra Container)](#2.1 Pause 容器(Infra Container))
      • [2.2 Init 容器(初始化容器)](#2.2 Init 容器(初始化容器))
    • [三、Pod 生命周期](#三、Pod 生命周期)
      • [3.1 阶段状态(Phase)](#3.1 阶段状态(Phase))
      • [3.2 条件状态(Conditions)](#3.2 条件状态(Conditions))
    • [四、Pod 资源管理与服务质量](#四、Pod 资源管理与服务质量)
      • [4.1 资源限制](#4.1 资源限制)
      • [4.2 服务质量等级(QoS)](#4.2 服务质量等级(QoS))
    • [五、Pod 健康检查机制](#五、Pod 健康检查机制)
      • [5.1 探针类型](#5.1 探针类型)
      • [5.2 检查方式](#5.2 检查方式)
    • [六、Pod 调度与控制](#六、Pod 调度与控制)
      • [6.1 普通 Pod](#6.1 普通 Pod)
      • [6.2 静态 Pod(Static Pod)](#6.2 静态 Pod(Static Pod))
    • [七、Pod 亲和与反亲和](#七、Pod 亲和与反亲和)
      • [7.1 Pod 亲和(podAffinity)](#7.1 Pod 亲和(podAffinity))
      • [7.2 Pod 反亲和(podAntiAffinity)](#7.2 Pod 反亲和(podAntiAffinity))
    • [八、Pod 常用操作命令](#八、Pod 常用操作命令)
      • [8.1 创建与运行](#8.1 创建与运行)
      • [8.2 查看与调试](#8.2 查看与调试)
      • [8.3 更新与扩缩容](#8.3 更新与扩缩容)
      • [8.4 删除](#8.4 删除)
    • [九、Pod YAML 规范(完整示例)](#九、Pod YAML 规范(完整示例))
    • [十、Pod 设计原则与最佳实践](#十、Pod 设计原则与最佳实践)

一、Pod 概述

1.1 定义与本质

Pod 是 Kubernetes 中最小可调度与部署单元 ,代表一个逻辑主机,封装一个或多个紧密协作的容器。

核心特征:

  • 调度原子性:调度器以 Pod 为单位分配节点
  • 资源共享 :
    • 共享 Network Namespace(IP、端口空间)
    • 共享 UTS Namespace(主机名)
    • 共享 IPC Namespace(进程间通信)
    • 共享 Storage Volume(数据卷)
  • 统一生命周期:Pod 创建/删除时,内部容器同步启停

通信模型:

  • 容器间通过 localhost 直接通信
  • Pod 间通过 Pod IP 跨节点通信(需底层CNI支持)

1.2 使用模式

模式 说明 典型场景
单容器 Pod 一个 Pod 运行一个容器 标准无状态应用
多容器 Pod 主容器 + 辅助容器(Sidecar) 日志采集、代理、配置同步
无状态 Pod 不保存本地状态,数据依赖外部存储 Web服务器、API服务
有状态 Pod 需持久化数据,配合 StatefulSet 数据库、消息队列

二、Pod 内部架构

2.1 Pause 容器(Infra Container)

定义 :每个 Pod 启动时自动创建的特殊"根容器",不执行业务逻辑 ,镜像极简(仅 /pause)。

核心作用:

功能 说明
命名空间持有者 创建并持有 Network、UTS、IPC、PID 命名空间
资源共享基础 业务容器启动时加入 pause 已创建的命名空间
Pod 存活锚点 pause 容器存活即 Pod 存活,业务容器可独立重启
稳定环境提供 Pod 生命周期内 pause 持续运行,为重启容器提供恒定网络环境

类比:Pod = 豆荚,Pause = 豆荚壳,业务容器 = 豆子。

查看命令:

bash 复制代码
docker ps | grep pause

修改默认 Infra 镜像:

bash 复制代码
vim /etc/kubernetes/kubelet
# 添加或修改 --pod-infra-container-image 参数

2.2 Init 容器(初始化容器)

定义 :在业务容器启动前按顺序执行的专用容器,执行成功后退出。

核心特性:

特性 说明
执行顺序 多个 Init 容器串行执行,按定义次序
与业务容器关系 Init 容器全部成功后才启动业务容器
生命周期 执行成功即退出,不持续运行
重启行为 Pod 重启时,Init 容器重新执行

适用场景:

  • 数据库初始化脚本导入
  • 配置文件生成
  • 权限设置
  • 依赖服务等待

三、Pod 生命周期

3.1 阶段状态(Phase)

status.phase 定义 Pod 所处生命周期阶段:

状态 含义 典型原因
Pending API 对象已创建,但部分容器未就绪 调度失败、镜像拉取中、资源不足
Running Pod 已调度至节点,所有容器创建成功,至少一个运行中 -
Succeeded 所有容器成功退出(返回码 0) Job、CronJob 完成
Failed 至少一个容器以非 0 返回码退出 应用崩溃、配置错误
Unknown 状态无法获取 Master 与 Node 通信故障
CrashLoopBackOff 容器启动后异常退出,且反复重启 应用故障、健康检查失败
Completed 同 Succeeded,任务类 Pod 正常结束 -
Error 容器运行出错 -
Init:N/M M 个 Init 容器,N 个已完成 Init 容器执行中
Init:Error Init 容器执行失败 -
Init:CrashLoopBackOff Init 容器反复失败 -
PodInitializing Init 容器完成,业务容器启动中 -

3.2 条件状态(Conditions)

status.conditions 提供更细粒度状态描述:

条件 说明
PodScheduled Pod 已被调度至某节点
Ready Pod 可提供服务(所有就绪探针通过)
Initialized 所有 Init 容器执行成功
Unschedulable 调度失败(资源不足、污点不匹配等)
ContainersReady 所有容器已就绪

四、Pod 资源管理与服务质量

4.1 资源限制

参数定义:

参数 含义 单位
requests 资源最小申请量(调度保证) CPU:核(1000m=1核) 内存:Mi、Gi
limits 资源最大使用量(强制限制) 同上

超限行为 :容器试图使用超过 limits 的资源时,可能被 OOM Kill 并重启。

4.2 服务质量等级(QoS)

Kubernetes 根据资源定义自动为 Pod 分配 QoS 等级:

等级 判定条件 资源不足时驱逐优先级
Guaranteed(最高) 所有容器均设置 limits 与 requests,且两者相等 最低
Burstable(中等) 至少一个容器设置 requests,不满足 Guaranteed 条件 中等
BestEffort(最低) 没有任何 容器设置 requests 与 limits 最高(优先驱逐)

生产建议 :始终为容器同时配置 requests 和 limits 且取值相同,获得 Guaranteed QoS。


五、Pod 健康检查机制

5.1 探针类型

探针 作用 失败后果
livenessProbe(存活探针) 检查容器是否正在运行 kubelet 杀死容器,根据重启策略重建
readinessProbe(就绪探针) 检查容器是否可接收流量 从 Service Endpoints 中移除 Pod IP
startupProbe(启动探针) 检查容器是否已完成启动 失败则杀死容器,重启策略生效;存在时禁用其他探针

默认行为 :未配置探针时,liveness 默认成功,readiness 默认成功。

5.2 检查方式

方式 原理 适用场景
exec 容器内执行命令,返回码 0 为成功 自定义检查逻辑
httpGet HTTP GET 请求,状态码 200-399 为成功 Web 应用健康端点
tcpSocket TCP 端口是否开放(类似 telnet) 非 HTTP 服务

关键参数:

参数 含义
initialDelaySeconds 容器启动后延迟检查秒数
periodSeconds 探测间隔秒数(默认10)
timeoutSeconds 单次探测超时秒数(默认1)
successThreshold 成功阈值(默认1)
failureThreshold 失败阈值(默认3)

六、Pod 调度与控制

6.1 普通 Pod

  • 由用户直接创建或通过控制器(Deployment、StatefulSet 等)管理
  • 定义存储在 etcd 中
  • 调度器分配节点后,kubelet 负责实例化
  • 容器崩溃时根据 restartPolicy 重启

重启策略:

策略 行为
Always(默认) 容器退出时自动重启
OnFailure 仅当返回码非 0 时重启
Never 从不重启

6.2 静态 Pod(Static Pod)

定义 :由特定节点的 kubelet 直接管理,不依赖 API Server。

核心特征:

特征 说明
配置存储 不存储在 etcd ,存放于节点本地目录(如 /etc/kubernetes/manifests)
管理方式 kubelet 监控目录,YAML 创建/删除即自动创建/删除 Pod
API 可见性 API Server 会创建镜像 Pod(Mirror Pod) 以只读方式可见
控制能力 不能通过 API Server 删除或修改(需操作本地文件)
典型用途 部署控制平面组件(kube-apiserver、etcd 等)

启用配置:

yaml 复制代码
# /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests

创建 :将 Pod YAML 放入上述目录
删除:从上述目录删除对应 YAML 文件


七、Pod 亲和与反亲和

7.1 Pod 亲和(podAffinity)

定义 :Pod 与 Pod 之间的倾向性调度规则 ,使某些 Pod 靠近部署(同一拓扑域)。

典型场景 :将应用前端与后端部署在同一节点/可用区,减少网络延迟。

示例 :将带有 security=S1 标签的 Pod 调度到同一拓扑域(如可用区)。

7.2 Pod 反亲和(podAntiAffinity)

定义 :Pod 与 Pod 之间的排斥性调度规则 ,使某些 Pod 分散部署(不同拓扑域)。

典型场景:

  • 高可用部署:同一应用的多个副本分布在不同节点
  • 面试题 :如何让 Deployment 在每个节点仅运行一个 Pod?
    答案 :使用 podAntiAffinity + requiredDuringSchedulingIgnoredDuringExecution + topologyKey: kubernetes.io/hostname

核心参数:

参数 含义
requiredDuringSchedulingIgnoredDuringExecution 硬策略:必须满足,否则 Pod 无法调度
preferredDuringSchedulingIgnoredDuringExecution 软策略:尽量满足,不强制
topologyKey 拓扑域划分依据(如 kubernetes.io/hostname 表示按节点划分)

八、Pod 常用操作命令

8.1 创建与运行

bash 复制代码
# 使用镜像直接运行 Pod
kubectl run <pod-name> --image=<image> [--command -- <cmd>]

# 从 YAML 创建
kubectl apply -f <pod.yaml>

# 强制更新(替换)
kubectl replace -f <pod.yaml> --force

8.2 查看与调试

bash 复制代码
# 查看基本信息
kubectl get pods [-n <namespace>] [-o wide|yaml|json]

# 查看标签
kubectl get pods --show-labels

# 根据标签过滤
kubectl get pods -l <key>=<value>

# 查看详情(事件、状态)
kubectl describe pod <pod-name>

# 查看 Pod IP 及所在节点
kubectl get pod <pod-name> -o wide

# 查看日志
kubectl logs <pod-name> [-c <container-name>] [-f]

# 进入容器
kubectl exec -it <pod-name> [-c <container-name>] -- <shell>

# 查看 Pod 内运行的镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

8.3 更新与扩缩容

bash 复制代码
# 滚动更新镜像
kubectl set image pod/<pod-name> <container-name>=<new-image>

# 手动扩缩容(仅控制器管理时有效)
kubectl scale <deployment/rs> --replicas=<num>

# 自动水平伸缩(HPA)
kubectl autoscale deployment <deployment-name> --max=<max> --min=<min> --cpu-percent=<threshold>

8.4 删除

bash 复制代码
# 正常删除
kubectl delete pod <pod-name>

# 强制删除(Terminating 状态)
kubectl delete pod <pod-name> --grace-period=0 --force

九、Pod YAML 规范(完整示例)

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: <pod-name>                 # Pod 名称(必填)
  namespace: default              # 命名空间(默认为 default)
  labels:                        # 标签(用于 Service 选择器)
    app: <app-label>
  annotations:                   # 注释(非标识性元数据)
    description: <text>
spec:
  # ---------- 调度控制 ----------
  nodeSelector:                  # 节点标签选择器
    <key>: <value>
  affinity:                     # 亲和性规则
    podAffinity:               # Pod 亲和
    podAntiAffinity:           # Pod 反亲和
  tolerations:                 # 污点容忍
  - key: <taint-key>
    operator: Equal|Exists
    value: <value>
    effect: NoSchedule|NoExecute|PreferNoSchedule
    tolerationSeconds: <int>
  
  # ---------- 容器定义 ----------
  containers:
  - name: <container-name>      # 容器名称(必填)
    image: <image>:<tag>        # 镜像地址(必填)
    imagePullPolicy: Always|IfNotPresent|Never  # 拉取策略
    
    # 启动命令与参数
    command: ["<executable>"]   # 覆盖 Dockerfile ENTRYPOINT
    args: ["<arg1>", "<arg2>"]  # 覆盖 Dockerfile CMD
    workingDir: <path>          # 工作目录
    
    # 端口声明
    ports:
    - name: <port-name>
      containerPort: <int>      # 容器监听端口
      protocol: TCP|UDP        # 协议
      hostPort: <int>          # 宿主机映射端口(不推荐)
    
    # 环境变量
    env:
    - name: <KEY>              # 直接赋值
      value: <value>
    - name: <KEY>              # 从 ConfigMap 引用
      valueFrom:
        configMapKeyRef:
          name: <cm-name>
          key: <cm-key>
    - name: <KEY>              # 从 Secret 引用
      valueFrom:
        secretKeyRef:
          name: <secret-name>
          key: <secret-key>
    
    # 资源限制
    resources:
      requests:
        cpu: "100m"            # 最小申请 CPU
        memory: "128Mi"        # 最小申请内存
      limits:
        cpu: "500m"            # 最大使用 CPU
        memory: "256Mi"        # 最大使用内存
    
    # 健康检查
    livenessProbe:
      exec:
        command: ["cat", "/tmp/healthy"]
      httpGet:
        path: /healthz
        port: 8080
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 1
      failureThreshold: 3
      successThreshold: 1
    
    readinessProbe:            # 配置方式同 livenessProbe
    startupProbe:             # 配置方式同 livenessProbe
    
    # 存储挂载
    volumeMounts:
    - name: <volume-name>
      mountPath: <container-path>
      readOnly: true|false
      subPath: <file-name>    # 挂载单个文件
  
  # ---------- 初始化容器 ----------
  initContainers:
  - name: <init-container-name>
    image: <image>
    command: ["<command>"]
    volumeMounts: [...]       # 可与业务容器共享卷
  
  # ---------- 存储卷定义 ----------
  volumes:
  - name: <volume-name>
    emptyDir: {}              # 临时卷(Pod 删除即销毁)
  - name: <volume-name>
    hostPath:                 # 宿主机目录
      path: <host-path>
      type: Directory|File|...
  - name: <volume-name>
    configMap:                # ConfigMap 卷
      name: <cm-name>
      items:
      - key: <cm-key>
        path: <file-name>
  - name: <volume-name>
    secret:                   # Secret 卷
      secretName: <secret-name>
  - name: <volume-name>
    persistentVolumeClaim:    # PVC 卷
      claimName: <pvc-name>
  - name: <volume-name>
    nfs:                      # NFS 卷
      server: <nfs-server-ip>
      path: <export-path>
  
  # ---------- Pod 策略 ----------
  restartPolicy: Always|OnFailure|Never
  hostNetwork: true|false      # 使用宿主机网络命名空间
  dnsPolicy: ClusterFirst|Default|...
  serviceAccountName: <sa>    # 服务账户
  
  # ---------- 节点选择与隔离 ----------
  nodeName: <node-name>        # 直接指定节点(跳过调度器)
  hostPID: true|false         # 共享宿主机 PID 命名空间
  hostIPC: true|false        # 共享宿主机 IPC 命名空间

十、Pod 设计原则与最佳实践

原则 说明
单职责原则 一个 Pod 应承载一个主业务进程,Sidecar 为辅助功能
无状态优先 优先设计无状态 Pod,数据存储通过 PVC 或外部服务
资源显式声明 始终设置 requests 与 limits,且值相等(Guaranteed QoS)
探针必配 生产环境必须配置 livenessProbe 与 readinessProbe
镜像拉取策略 开发测试用 IfNotPresent,生产用 Always 或指定版本
配置分离 非敏感配置用 ConfigMap,敏感信息用 Secret
反亲和部署 关键应用使用 podAntiAffinity 分散至不同节点
不直接使用 Pod 长期运行应用通过 Deployment、StatefulSet 等控制器管理

Pod 非在线更新限制 :Pod 的绝大多数字段不支持直接 apply/ edit** 更新**,需删除重建或通过控制器滚动更新。

相关推荐
Eminem895 天前
14、k8s持久化存储
k8s
上火的金鱼妹7 天前
higress网关访问+ 模型访问的安全策略管控
k8s·higress·ai网关
weixin_444579307 天前
Containerd
容器·k8s
Dragon_qu·x9 天前
MongoDB 高可用集群部署
运维·数据库·mongodb·k8s·helm
此冬歌咏16 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心16 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
流烟默16 天前
K8s StatefulSet 详解:有状态应用的“身份证”与“固定住址”
k8s·statefulset
cg.family16 天前
K8S集群手动巡检
k8s
九皇叔叔16 天前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
九皇叔叔17 天前
K8S 资源菜单
docker·容器·kubernetes·k8s