文章目录
[Kubernetes Pod 管理](#Kubernetes Pod 管理)
[1. 核心概念速览](#1. 核心概念速览)
[2. 资源模型:Pod ↔ Controller 关联](#2. 资源模型:Pod ↔ Controller 关联)
[3. 常用命令 30s 速查](#3. 常用命令 30s 速查)
[4. YAML 模板骨架(最小可运行)](#4. YAML 模板骨架(最小可运行))
[5. 镜像拉取策略](#5. 镜像拉取策略)
[6. 资源限制与 QoS](#6. 资源限制与 QoS)
[7. Pod 多容器实践](#7. Pod 多容器实践)
[8. 生命周期钩子](#8. 生命周期钩子)
[9. 健康检查探针](#9. 健康检查探针)
[10. 调度约束](#10. 调度约束)
[11. 重启策略与现场恢复](#11. 重启策略与现场恢复)
[12. 排障三板斧](#12. 排障三板斧)
[13. 一键实验清单](#13. 一键实验清单)
[14. 思维导图](#14. 思维导图)
Kubernetes Pod 管理
1. 核心概念速览
术语
一句话记忆
Pod
K8s 最小调度单元,1-N 个容器共享网络/存储
Workload
由 Pod + 控制器(Deployment、StatefulSet...)组成
静态 Pod
直接由 kubelet 管理,无控制器,kube-apiserver 不可见
控制器 Pod
由控制器管理,支持副本伸缩、滚动升级、回滚
2. 资源模型:Pod ↔ Controller 关联
唯一关联方式:Label-Selector
yaml
复制代码
# Pod 端
metadata:
labels:
app: nginx
# 控制器端
selector:
matchLabels:
app: nginx
3. 常用命令 30s 速查
bash
复制代码
kubectl get pod -A # 看所有 Pod
kubectl get pod --show-labels # 带标签
kubectl top pod <name> # 实时资源
kubectl describe pod <name> # 事件排障
kubectl logs <pod> [-c <container>] # 日志
kubectl exec <pod> [-c <c>] -- <cmd> # 进入容器
kubectl label pod <name> k=v # 打标签
kubectl delete pod <name> [--force] # 删除单 Pod
4. YAML 模板骨架(最小可运行)
yaml
复制代码
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
labels:
app: demo
spec:
containers:
- name: c1
image: nginx:1.26-alpine
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5
restartPolicy: Always
5. 镜像拉取策略
策略值
行为
默认触发条件
Always
每次都尝试 pull
镜像 tag 为 latest
IfNotPresent
本地有就用本地
非 latest
Never
只用本地镜像
手动指定
6. 资源限制与 QoS
yaml
复制代码
resources:
requests: # 调度权重 & kubelet 预留
cpu: 100m
memory: 100Mi
limits: # 运行时硬限制
cpu: 200m
memory: 200Mi
QoS 等级 (系统 OOM 时按顺序 kill)
Guaranteed:requests == limits
Burstable:requests < limits
BestEffort:未写 requests/limits
7. Pod 多容器实践
共享网络 :同一 Pod 内 127.0.0.1 互通
共享存储 :挂载同一 volume
常见组合 :主容器 + sidecar(日志/代理/监控)
⚠️ 端口冲突场景:两个 nginx 都监听 80 → 第二容器 CrashLoopBackOff
8. 生命周期钩子
yaml
复制代码
lifecycle:
postStart: # 容器启动后
exec:
command: ["mkdir", "-p", "/var/www/cache"]
preStop: # 容器终止前
exec:
command: ["/bin/sh","-c","sleep 10 && nginx -s quit"]
preStop 最长宽限期 30s,之后强制 SIGKILL
9. 健康检查探针
探针类型
作用
失败行为
liveness
存活检查
kubelet 重启容器
readiness
就绪检查
从 Service Endpoints 摘流
startup
启动保护
成功前禁用其他探针
探测方式 :exec、httpGet、tcpSocket、grpc
10. 调度约束
nodeName (直接绕过 scheduler)
yaml
复制代码
spec:
nodeName: node2
nodeSelector (标签匹配)
bash
复制代码
kubectl label nodes node1 disktype=ssd
yaml
复制代码
spec:
nodeSelector:
disktype: ssd
亲和/反亲和、污点容忍
11. 重启策略与现场恢复
策略
说明
场景
Always (默认)
无限重启,指数退避(10s→20s→40s...)
长期服务
OnFailure
仅异常退出重启
批处理 Job
Never
不重启
一次性任务
12. 排障三板斧
kubectl describe pod <name> → 看 Events
kubectl logs <pod> -c <container> --previous → 看上次退出日志
kubectl exec -it <pod> -c <c> -- /bin/sh → 现场交互
13. 一键实验清单
bash
复制代码
# 1. 创建
kubectl apply -f https://raw.githubusercontent.com/polinux/stress/master/k8s/pod-stress.yaml
# 2. 监控
watch -n 1 kubectl top pod pod-stress
# 3. 打标签
kubectl label pod pod-stress region=hz env=test
# 4. 删除观察重启
kubectl delete pod pod-stress
14. 思维导图
复制代码
Pod
├── 定义:最小调度单元
├── 分类
│ ├── 静态 Pod(kubelet 自管)
│ └── 控制器 Pod(Deployment 等)
├── 操作
│ ├── 创建:kubectl run / apply
│ ├── 查询:get, describe, top, logs
│ └── 删除:delete(级联 vs 孤立)
├── YAML 核心字段
│ ├── metadata:name/namespace/labels
│ ├── spec.containers:image/resources/probes
│ └── spec.restartPolicy
├── 生命周期
│ ├── Init → Main → PostStart → Probes → PreStop
│ └── 重启策略:Always | OnFailure | Never
├── 调度
│ ├── nodeName(直连)
│ ├── nodeSelector(标签)
│ └── 亲和/污点(进阶)
└── 排障
├── Events
├── Logs
└── exec 现场