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(最高) 所有容器均设置 limitsrequests,且两者相等 最低
Burstable(中等) 至少一个容器设置 requests,不满足 Guaranteed 条件 中等
BestEffort(最低) 没有任何 容器设置 requestslimits 最高(优先驱逐)

生产建议 :始终为容器同时配置 requestslimits 且取值相同,获得 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 或外部服务
资源显式声明 始终设置 requestslimits,且值相等(Guaranteed QoS)
探针必配 生产环境必须配置 livenessProbereadinessProbe
镜像拉取策略 开发测试用 IfNotPresent,生产用 Always 或指定版本
配置分离 非敏感配置用 ConfigMap,敏感信息用 Secret
反亲和部署 关键应用使用 podAntiAffinity 分散至不同节点
不直接使用 Pod 长期运行应用通过 Deployment、StatefulSet 等控制器管理

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

相关推荐
识途老码8 小时前
6.k8s-静态(static)pod介绍
k8s·静态pod
没有bug.的程序员8 小时前
容器网络深度探究:从 CNI 插件选型内核到 K8s 网络策略安全防护实战指南
java·网络·安全·kubernetes·k8s·cni·容器网络
研究司马懿4 天前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
Harvey9035 天前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
logocode_li6 天前
OCI/CRI 双标准下:从 dockerd 到 containerd 的 K8s 运行时迭代史
docker·云原生·容器·k8s
人间打气筒(Ada)7 天前
k8s:CNI网络插件flannel与calico
linux·云原生·容器·kubernetes·云计算·k8s
回忆是昨天里的海8 天前
k8s整体架构及核心组件
架构·k8s
没有bug.的程序员8 天前
Docker 与 K8s 生产级实战:从镜像极致优化到集群自动化部署全流程
spring cloud·docker·kubernetes·自动化·k8s·镜像·集群自动化
骂我的人都死了9 天前
DevOps架构部署
运维·ubuntu·docker·k8s·github·devops·python3.11