主题
Kubernetes 生产检查清单
适用 Kubernetes 1.24+(已移除 dockershim,运行时为 containerd)。每条都可勾选,括号内是默认值或判断依据;默认值以官方文档为准。 只列「不做会出事」的动作,机制解释见各篇正文。
上线前
- [ ] requests/limits 与 QoS 定级:所有 Pod 设
resources.requests和resources.limits,核心服务requests = limits拿 Guaranteed;limits.memory取requests.memory × 1.5–2;命名空间再用 ResourceQuota 硬约束、LimitRange 兜默认值。验收:kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.qosClass}{"\n"}{end}'核心服务全为 Guaranteed,BestEffort 为 0。 - [ ] 三种探针各司其职:慢启动应用必须配
startupProbe(如failureThreshold=30、periodSeconds=10,给 300s 窗口),initialDelaySeconds不低于 P99 启动时间 ×1.5;livenessProbe只判死锁/无响应,readinessProbe用failureThreshold: 1快速摘流量。配错的典型表现是 CrashLoopBackOff 但业务日志无错误。 - [ ] 滚动更新可无损:
maxUnavailable: 0+maxSurge: 1;preStop先摘注册中心/SLB,terminationGracePeriodSeconds(默认 30s,以官方文档为准)必须大于 preStop 等待加优雅关闭时间(正文示例 5s + 30s)。验收:kubectl rollout status全程无中断,发布中kubectl get endpoints始终有可用 IP。 - [ ] PDB 与打散同时存在:核心服务配
minAvailable: 50%或maxUnavailable: 1,并用podAntiAffinity把副本打到不同 Node/可用区。验收:kubectl get pdb的 ALLOWED DISRUPTIONS ≥1;kubectl get pods -o wide无全部副本落在同一 Node。 - [ ] 发布可回滚、配置有唯一真相:镜像用固定 tag 或 digest,不用
latest;revisionHistoryLimit(默认 10,以官方文档为准)保留足够历史;所有变更走 Git + CI/CD,不用kubectl edit。发布前核对 Service selector 与 Pod label 一致(灰度时最易 502),并确认kubectl rollout history有上一版可--to-revision回退。 - [ ] 镜像与容器权限收紧:非 root(
USER 1000)、readOnlyRootFilesystem、cap-drop=ALL按需cap-add、禁用--privileged;镜像扫描(Trivy)高危阻断;Secret 只是 base64,必须配 etcd 加密 + RBAC,或改用 External Secrets / Sealed Secrets。
运行中
- [ ] 资源水位可见:
kubectl top nodes/kubectl top pods --all-namespaces;节点内存或磁盘 >85% 告警,命名空间 requests 分配率 >80% 停止接新负载;BestEffort Pod 数量应长期为 0(节点 OOM 时最先被杀)。 - [ ] Pod 健康趋势:RESTARTS 增长、Running 但 0/1 Ready、Evicted 数量都要有面板;每天看
kubectl get events --all-namespaces --sort-by='.lastTimestamp',节点 NotReady 前通常先有 MemoryPressure/DiskPressure 事件。 - [ ] HPA 与 PDB 状态可用:
kubectl get hpa的 TARGETS 不能长期<unknown>(说明 metrics-server 无数据或 requests 未设);kubectl get pdb的 ALLOWED DISRUPTIONS=0 会让节点排空和集群升级卡住。 - [ ] 灰度按步放量并盯指标:10% → 30% → 50% → 100%,每步观察窗口可配 10–300s,默认按平台配置,看错误率、RT、CPU;配置 5xx 超阈值自动回滚、30 分钟人工未确认自动回滚;同时巡检 Git 期望态与实际态,HPA 造成的 replicas 差异要排除,避免误报。
故障时
- [ ] Pod Pending →
kubectl describe pod <name>看 Events → 资源不足、nodeSelector/affinity 不匹配、污点未容忍、镜像拉取失败,Events 会直接写明是哪一类。 - [ ] CrashLoopBackOff →
kubectl logs <pod> --previous+kubectl describe pod <name> | grep -i oom→ 先区分 OOMKilled(调 limit 或查泄漏)、启动命令错误、还是Liveness probe failed(调 startupProbe/阈值),不要盲目重启。 - [ ] Running 但 502/0 Ready →
kubectl get endpoints <svc>→ Endpoint 为空查 selector 与 Pod label、readiness 是否通过;Endpoint 正常但仍 connection refused,多半是连接池缓存了旧 Pod IP,配连接空闲回收 + 重试,长连接用 Headless Service。 - [ ] 节点 NotReady 或大量 Evicted →
kubectl describe node <name> | grep -A5 Conditions+kubectl top pods --all-namespaces --sort-by=memory→ 按 MemoryPressure/DiskPressure/PIDPressure 定位,优先找没设 limit 的 Pod;节点失联时 PDB 不生效,先看拓扑打散与剩余容量,只有主动 drain/升级时才用 PDB 卡住中断。 - [ ] 排空/发布卡住 →
kubectl get pdb看 ALLOWED DISRUPTIONS 是否为 0,kubectl rollout status看是否被 maxUnavailable 卡住 → 先扩容或临时调整 minAvailable;需要退回时kubectl rollout undo deployment/<name> --to-revision=<N>。