跳到正文

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>。

把一门技术讲透到既懂也会用