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** 更新**,需删除重建或通过控制器滚动更新。