一、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 wide2.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 pods3.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: IfNotPresent3.2.2 应用配置并验证
# 创建Pod
kubectl apply -f pod1.yml
# 查看Pod基础信息
kubectl get pod
# 查看Pod详细运行节点、IP
kubectl get pods -o wide
# 查看Pod事件、详细状态(排错核心)
kubectl describe pod pod-stress3.3 Pod 删除操作
3.3.1 删除单个 Pod
# 方式1:指定Pod名称删除
kubectl delete pod pod-stress
# 方式2:通过YAML文件删除
kubectl delete -f pod1.yml3.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: IfNotPresent3.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 /2223.8.2 交互式进入容器终端
kubectl exec -it pod-stress4 -c c1 -- /bin/bash四、Pod 调度机制
4.1 Pod 完整调度流程
- 用户通过
kubectl提交 YAML 配置,向 APIServer 发送 Pod 创建请求; - APIServer 校验配置合法性,生成 Pod 资源对象,写入 etcd 数据库;
- Scheduler 调度器实时监听 APIServer,识别
nodeName 为空的未调度 Pod; - 调度器执行过滤、打分机制,筛选最优 Worker 节点,绑定节点信息并更新 etcd;
- 目标节点 kubelet 监听 etcd 变更,发现绑定自身的 Pod,调用容器运行时创建容器;
- 容器创建完成后,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-alpine4.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 启动流程
- 初始化容器(Init Container)执行,完成环境预处理;
- 主容器启动初始化;
- 执行 postStart 启动后钩子(自定义启动后置操作);
- 启动存活探针、就绪探针、启动探针,持续健康检测。
5.1.2 终止流程
- 触发删除指令,执行 preStop 终止前钩子(自定义收尾操作);
- 默认等待 30 秒优雅终止,超时未退出则强制杀死容器;
- 根据重启策略判断是否重启 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 容器名] -- 命令
