文章目录
- [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
# Pod 端
metadata:
labels:
app: nginx
# 控制器端
selector:
matchLabels:
app: nginx
3. 常用命令 30s 速查
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 模板骨架(最小可运行)
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
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. 生命周期钩子
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)
spec:
nodeName: node2
- nodeSelector(标签匹配)
kubectl label nodes node1 disktype=ssd
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. 一键实验清单
# 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 现场