个人随笔
目录
Kubernetes集群核心概念:Pod超全详解(理论+实操)
2026-06-27 23:24:38
一、Kubernetes工作负载(Workloads)概述

1.1 工作负载定义

工作负载(workload)是运行在Kubernetes集群中的应用程序,是集群业务运行的核心载体。无论是单一服务还是多组件协同的复杂应用,Kubernetes 均通过 Pod 来承载运行。
工作负载整体分为两大核心模块:Pod(底层运行载体)Controllers(上层控制器)

1.2 Pod与控制器的关联关系

  • Pod:Kubernetes 最小部署单元,负责实际运行容器,本身无自愈、扩缩容、升级能力。
  • Controllers 控制器:集群管理组件,负责管控 Pod 的生命周期,实现 Pod 伸缩、升级、自愈、回滚等核心能力。
  • 唯一关联方式:控制器与 Pod 通过 Label(标签)+ Selector(标签选择器) 绑定。

1.3 标签关联实操配置

1. 在 Pod YAML 中自定义标签
metadata:
  labels: 
    app: nginx  # 自定义Pod标签
2. 在控制器 YAML 中通过标签选择器匹配对应 Pod
spec:
  selector:
    matchLabels:
      app: nginx  # 匹配带有app=nginx标签的Pod

二、Pod 核心介绍

2.1 Pod 定义与核心特性

Pod(豌豆荚)是 Kubernetes 最小、最基础的可部署、可调度计算单元,是一组一个或多个容器的集合,用于封装应用服务。
核心特性:
  • Pod 不是系统进程,而是容器运行的隔离环境,本身不运行业务程序。
  • 支持单容器 Pod(主流用法)、多容器 Pod(主容器+Sidecar 边车容器,高级用法)。
  • 同一 Pod 内所有容器 共享网络命名空间、存储卷、IPC 通信,可通过 localhost 互相访问。
  • 默认调度至 Worker 节点运行,不运行在 Master 控制节点(特殊调度策略除外)。
  • Pod IP 为集群内部临时 IP,动态变化,集群外无法直接访问。

2.2 Pod 分类

2.2.1 静态 Pod

无控制器管理的自主 Pod,由节点本地 kubelet 进程直接管理,不经过 API Server 调度。kubelet 会实时监控静态 Pod,故障自动重启,多用于集群自托管控制面组件部署。

2.2.2 控制器管理 Pod

通过 Deployment、StatefulSet、DaemonSet 等控制器管理,支持副本数管控、弹性扩缩容、版本升级、故障自愈、回滚等全套运维能力,是生产环境主流使用方式。

2.3 Pod 常用查看命令

# 查看默认命名空间所有Pod
kubectl get pod

# 查看指定命名空间Pod
kubectl get pod -n kube-system

# 查看Pod详细信息(节点、IP等)
kubectl get pods -o wide

2.4 Pod 完整 YAML 资源清单详解

Pod YAML 是定义 Pod 运行规则的核心配置文件,包含必选、可选配置项,完整规范如下:
apiVersion: v1       # 必选,API版本,固定v1
kind: Pod          必选,资源类型
metadata:          必选,元数据信息
  name: string       # 必选,Pod名称(DNS规范)
  namespace: string  # 可选,所属命名空间,默认default
  labels:           选,自定义标签,用于控制器关联
    name: string     
  annotations:        # 可选,自定义注释
    name: string
spec:         # 必选,Pod期望运行状态规约
  containers:      # 必选,容器列表
  - name: string     # 必选,容器名称
    image: string    # 必选,容器镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent] # 镜像拉取策略
    command: [string]    # 容器启动命令
    args: [string]     # 启动命令参数
    workingDir: string     # 容器工作目录
    volumeMounts:    # 存储卷挂载配置
    - name: string     
      mountPath: string    
      readOnly: boolean    
    ports:       # 端口暴露配置
    - name: string     
      containerPort: int   # 容器监听端口
      hostPort: int    # 宿主机映射端口
      protocol: string     # 协议TCP/UDP,默认TCP
    env:       # 环境变量配置
    - name: string     
      value: string    
    resources:       # 资源配额(CPU/内存)
      limits:      # 资源上限
        cpu: string    
        memory: string     
      requests:      # 资源申请下限
        cpu: string    
        memory: string     
    # 健康检查配置
    livenessProbe:     # 存活探针
    readinessProbe:    # 就绪探针
    startupProbe:      # 启动探针
    restartPolicy: [Always | Never | OnFailure] # 重启策略
    nodeSelector: obeject  # 节点标签选择调度
    nodeName: string       # 指定固定节点调度
    imagePullSecrets:    # 镜像拉取密钥
    hostNetwork: false     # 是否使用宿主机网络
    volumes:       # Pod共享存储卷定义
    - name: string     
      emptyDir: {}     # 临时存储卷(Pod生命周期)
      hostPath: string     # 宿主机目录挂载
      secret:      # 密钥挂载
      configMap:     # 配置文件挂载    # 可             #     # 

YAML 配置查询帮助命令

kubectl explain namespace
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers

三、Pod 创建、删除与核心配置实操

3.1 命令行快速创建 Pod(v1.18版本变更)

K8s v1.18 之前:kubectl run 创建 Deployment;v1.18 及之后:直接创建 Pod。
# 创建nginx测试Pod
kubectl run nginx1 --image=nginx:1.15-alpine

# 验证Pod运行状态
kubectl get pods

3.2 YAML 文件创建 Pod(生产推荐)

3.2.1 编写压力测试 Pod YAML

vim pod1.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-stress
spec:
  containers:
  - name: c1
    image: polinux/stress
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
    imagePullPolicy: IfNotPresent

3.2.2 应用配置并验证

# 创建Pod
kubectl apply -f pod1.yml

# 查看Pod基础信息
kubectl get pod

# 查看Pod详细运行节点、IP
kubectl get pods -o wide

# 查看Pod事件、详细状态(排错核心)
kubectl describe pod pod-stress

3.3 Pod 删除操作

3.3.1 删除单个 Pod

# 方式1:指定Pod名称删除
kubectl delete pod pod-stress

# 方式2:通过YAML文件删除
kubectl delete -f pod1.yml

3.3.2 批量删除 Pod

# 方式1:批量指定Pod名
kubectl delete pod pod1 pod2 pod3

# 方式2:筛选所有Pod批量删除
kubectl get pods |awk 'NR>1 {print $1}' |xargs kubectl delete pod

# 方式3:删除整个命名空间(清空该命名空间所有资源)
kubectl delete ns 命名空间名

3.4 镜像拉取策略 imagePullPolicy

控制 Pod 创建时镜像的拉取规则,共三种策略:
  • Always:无论本地是否存在镜像,强制从仓库拉取最新镜像
  • Never:仅使用本地镜像,绝不拉取远程镜像,本地无镜像则启动失败
  • IfNotPresent:本地有镜像则直接使用,无镜像则远程拉取(默认策略)
默认规则:镜像标签为 latest 时,默认策略为 Always;指定固定版本号时,默认策略为 IfNotPresent。

3.5 Pod 标签管理

Pod 标签是控制器关联 Pod、筛选管理 Pod 的核心标识,支持命令行和 YAML 两种方式管理。

3.5.1 命令行管理标签

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

# 给Pod打多个标签
kubectl label pod pod-stress region=huanai zone=A env=test bussiness=game

# 根据标签筛选Pod(等值查询)
kubectl get pods -l zone=A

# 集合查询标签
kubectl get pods -l "zone in (A,B,C)"

# 删除标签(标签名后加-)
kubectl label pod pod-stress region- zone- env- bussiness-

3.5.2 YAML 定义 Pod 标签

apiVersion: v1
kind: Pod
metadata:
  name: pod-stress
  namespace: default
  labels:
    env: dev
    app: nginx
spec:
  containers:
  - name: c1
    image: polinux/stress
    imagePullPolicy: IfNotPresent

3.6 Pod 资源配额限制

通过 requests(资源申请)和 limits(资源上限)限制 Pod CPU、内存使用,防止资源抢占、节点过载,超出 limits 内存会触发 OOMKilled 杀死容器。

3.6.1 正常资源配置(可正常运行)

apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-stress2
  namespace: namespace1
spec:
  containers:
  - name: c1
    image: polinux/stress
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

3.6.2 超资源配置(触发 OOM)

apiVersion: v1
kind: Pod
metadata:
  name: pod-stress3
  namespace: namespace1
spec:
  containers:
  - name: c1
    image: polinux/stress
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "150Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
现象:pod-stress3 状态为 OOMKilled,内存超出限制被系统终止,根据重启策略反复重启。

3.7 多容器 Pod 特性验证

同一 Pod 内多个容器共享网络、存储资源,端口不可重复占用,否则容器启动失败。

3.7.1 多容器冲突案例

apiVersion: v1
kind: Pod
metadata:
  name: nginx2
spec:
  containers:
  - name: c1
    image: nginx:1.15-alpine
  - name: c2
    image: nginx:1.15-alpine
故障现象:两个 Nginx 容器默认占用 80 端口,端口冲突,其中一个容器启动失败,状态为 CrashLoopBackOff
报错原因:bind() to 0.0.0.0:80 failed (98: Address in use),验证同一 Pod 容器共享网络端口空间。

3.8 Pod 容器操作命令

3.8.1 非交互式执行容器命令

# 指定容器执行命令(多容器Pod必须指定-c)
kubectl exec pod-stress4 -c c2 -- touch /111

# 单容器Pod可省略-c,默认操作第一个容器
kubectl exec pod-stress4 -- touch /222

3.8.2 交互式进入容器终端

kubectl exec -it pod-stress4 -c c1 -- /bin/bash

四、Pod 调度机制

4.1 Pod 完整调度流程

  1. 用户通过kubectl 提交 YAML 配置,向 APIServer 发送 Pod 创建请求;
  2. APIServer 校验配置合法性,生成 Pod 资源对象,写入 etcd 数据库;
  3. Scheduler 调度器实时监听 APIServer,识别 nodeName 为空 的未调度 Pod;
  4. 调度器执行过滤、打分机制,筛选最优 Worker 节点,绑定节点信息并更新 etcd;
  5. 目标节点 kubelet 监听 etcd 变更,发现绑定自身的 Pod,调用容器运行时创建容器;
  6. 容器创建完成后,kubelet 上报运行状态至 APIServer,更新集群资源状态。

4.2 手动调度约束(指定节点运行)

4.2.1 nodeName 固定节点调度

直接指定 Pod 运行节点,跳过调度器,强制运行在指定节点。
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
spec:
  nodeName: k8s-worker1  # 强制调度到该节点
  containers:
  - name: nginx
    image: nginx:1.15-alpine

4.2.2 nodeSelector 标签调度

通过匹配节点标签,将 Pod 调度到符合标签规则的节点,灵活性更高。
# 1. 给节点打标签
kubectl label nodes k8s-worker1 bussiness=game

# 2. Pod配置节点选择器
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselect
spec:
  nodeSelector:
    bussiness: game  # 匹配对应节点标签
  containers:
  - name: nginx
    image: nginx:1.15-alpine

五、Pod 生命周期与健康检查

5.1 Pod 完整生命周期流程

5.1.1 启动流程

  1. 初始化容器(Init Container)执行,完成环境预处理;
  2. 主容器启动初始化;
  3. 执行 postStart 启动后钩子(自定义启动后置操作);
  4. 启动存活探针、就绪探针、启动探针,持续健康检测。

5.1.2 终止流程

  1. 触发删除指令,执行 preStop 终止前钩子(自定义收尾操作);
  2. 默认等待 30 秒优雅终止,超时未退出则强制杀死容器;
  3. 根据重启策略判断是否重启 Pod。

5.2 容器重启策略 restartPolicy

  • Always(默认):容器无论正常/异常退出,均自动重启,适配常驻服务(Deployment 默认策略)。
  • OnFailure:仅容器异常退出(非0退出码)时重启,适配一次性任务。
  • Never:容器退出后永不重启。
重启退避机制:Always 策略下,容器反复崩溃会触发指数退避,首次立即重启,后续依次延迟10s、20s、40s,避免集群资源耗尽。

5.3 三大健康探针详解

5.3.1 探针作用

  • StartupProbe 启动探针:检测应用是否启动完成,启动成功前禁用其他探针,适配启动慢的应用。
  • LivenessProbe 存活探针:检测容器是否正常运行,探测失败则杀死容器并重启。
  • ReadinessProbe 就绪探针:检测容器是否可对外提供服务,探测失败则将 Pod 从 Service 端点剔除,不接收流量,不重启容器。

5.3.2 四大探测方式

  • Exec:在容器内执行命令,命令返回0则探测成功。
  • HTTPGet:请求容器内指定 URL,返回2xx/3xx状态码则成功。
  • TCP:尝试连接容器指定端口,端口可连通则成功。
  • gRPC:调用 gRPC 健康检查接口,返回 SERVING 状态则成功(需开启特性门控)。

5.4 健康检查实操案例

5.4.1 Liveness-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  # 启动5秒后开始探测
      periodSeconds: 5         # 每5秒探测一次
现象:30秒后文件被删除,探测失败,kubelet 杀死容器并自动重启,重启次数持续累加。

5.4.2 Liveness-HTTPGet 案例

apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget
spec:
  containers:
  - name: liveness
    image: nginx:1.15-alpine
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 3
      periodSeconds: 5
测试:删除 Nginx 主页文件,探测失败,容器自动重启恢复服务。

5.4.3 Liveness-TCP 案例

apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
spec:
  containers:
  - name: liveness
    image: nginx:1.15-alpine
    ports:
    - containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 5
测试:手动停止 Nginx 服务,端口断开,探测失败,容器重启。

5.4.4 Readiness 就绪探针案例

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget
spec:
  containers:
  - name: readiness
    image: nginx:1.15-alpine
    ports:
    - containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index.html
      initialDelaySeconds: 3
      periodSeconds: 5
现象:删除主页后,Pod 状态变为 0/1 Running,就绪失败,不再接收流量;恢复文件后,自动变回1/1 Running

5.5 生命周期钩子实操

5.5.1 postStart 启动后钩子

容器启动完成后自动执行自定义命令,用于初始化环境。
apiVersion: v1
kind: Pod
metadata:
  name: poststart
spec:
  containers:
  - name: poststart
    image: nginx:1.15-alpine
    lifecycle:
      postStart:
        exec:
          command: ["mkdir","-p","/usr/share/nginx/html/haha"]

5.5.2 preStop 终止前钩子

容器删除终止前执行自定义收尾命令,默认30秒超时强制终止。
apiVersion: v1
kind: Pod
metadata:
  name: prestop
spec:
  containers:
  - name: prestop
    image: nginx:1.15-alpine
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh","-c","sleep 60000000"]

六、Pod 常见故障排查

6.1 Pod 核心状态说明

状态
故障说明
Pending
Pod 未调度完成,原因:节点资源不足、镜像拉取失败、节点标签不匹配
Running
Pod 正常运行,至少一个容器存活
Completed
一次性任务执行完成,所有容器正常退出
Failed
容器异常退出(非0退出码),任务执行失败
Unknown
APIServer 与节点 kubelet 通信异常,无法获取 Pod 状态
CrashLoopBackOff
容器反复崩溃重启,常见原因:命令错误、配置缺失、端口冲突、资源不足、健康检查失败
OOMKilled
容器内存超出 limits 限制,被系统强制杀死

6.2 核心排错命令

# 查看Pod详细事件(快速定位调度、启动故障)
kubectl describe pod  pod名

# 查看容器运行日志(定位业务代码、配置故障)
kubectl logs pod名 [-c 容器名]

# 进入容器交互式排错
kubectl exec -it pod名 [-c 容器名] -- 命令
 3

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2