深色模式
生产最佳实践 Checklist
面向即将或已经把服务跑在 K8s 上的团队。这是一份可勾选的上线核对清单,按工作负载 / 安全 / 网络 / 存储 / 可观测性 / 交付 / 成本分区。
适用版本与前提
- Kubernetes:v1.28+
- 用法:作为上线前 checklist 与季度巡检清单使用
- 每项都应能回答"做了 / 没做 / 不适用(为什么)"
建议
不要把它当成一次性任务。建议固化进发布流程:新服务上线必须勾完,老服务每季度巡检一次。
一、工作负载与可用性
- [ ] 所有容器设置了
resources.requests与limits(至少 requests 必填) - [ ] requests 贴近实际 P95 用量,不过度预留
- [ ] 配置了
readinessProbe(决定流量是否进入) - [ ] 配置了
livenessProbe(谨慎设置,避免误杀) - [ ] 慢启动服务配置了
startupProbe - [ ] 副本数 ≥ 2,且跨节点/跨 AZ 分布
- [ ] 配置了
topologySpreadConstraints或反亲和,避免单节点/单 AZ 单点 - [ ] 配置了
PodDisruptionBudget(核心服务minAvailable) - [ ] 应用正确处理
SIGTERM,并配置preStop覆盖 Endpoint 传播窗口 - [ ]
terminationGracePeriodSeconds大于"preStop + 排空"总时长 - [ ] Job/CronJob 设置了
backoffLimit与ttlSecondsAfterFinished(避免堆积) - [ ] 使用
Deployment/StatefulSet管理,而非裸 Pod
注意
livenessProbe是"重启开关"。如果探针依赖的下游抖动,会导致大规模误重启。liveness 应只检查进程自身存活,依赖检查放 readiness。
二、安全
- [ ] 命名空间级别用 RBAC 最小权限,无长期
cluster-admin绑定 - [ ] 每个工作负载使用独立 ServiceAccount,不直接用 default
- [ ] 不挂载 ServiceAccount token(或按需显式声明)
- [ ] 命名空间启用 Pod Security Admission(
restricted或至少baseline) - [ ] 容器以非 root 运行(
runAsNonRoot: true) - [ ] 设置了
securityContext.allowPrivilegeEscalation: false - [ ] 只读根文件系统(如可行
readOnlyRootFilesystem: true) - [ ] 定义了默认拒绝(
default-deny)的NetworkPolicy - [ ] Secret 未硬编码进镜像或 ConfigMap;启用 etcd 静态加密 / KMS
- [ ] 镜像来自可信仓库,启用漏洞扫描
- [ ] 镜像用 digest 或明确 tag 固定,不用
latest - [ ] 启用审计日志,关键操作可追溯
yaml
# 最小安全上下文示例
securityContext:
runAsNonRoot: true
runAsUser: 10001
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
三、网络
- [ ] Service 类型选择合理(ClusterIP 优先,不随意用 NodePort/LB)
- [ ] Ingress 配置了 TLS
- [ ] 外部访问有超时/限流配置
- [ ] NetworkPolicy 限制东西向流量(至少生产命名空间内)
- [ ] DNS 策略与
ndots已知悉(避免不必要的解析放大) - [ ] 有状态服务使用 Headless Service + 稳定 DNS
四、存储
- [ ] 有状态应用用
StatefulSet+ PVC,不用emptyDir存持久数据 - [ ] 使用 CSI 驱动(非已废弃的 in-tree 供应器)
- [ ] StorageClass 明确指定,
volumeBindingMode与拓扑匹配 - [ ] 快照/备份策略已建立并演练过恢复
- [ ] PV 回收策略明确(
RetainvsDelete),关键数据用 Retain - [ ] 监控 PVC 使用率并设置告警
生产危险
"有备份"不等于"能恢复"。备份有效性只能通过实际恢复演练证明,未演练过的备份应视为不存在。
五、可观测性
- [ ] 应用暴露
/metrics,并被 Prometheus 抓取 - [ ] 定义了服务的 SLI/SLO(可用性、时延)
- [ ] 关键指标有面板:RED(速率/错误/时延)
- [ ] 节点与集群有 USE(利用率/饱和度/错误)视图
- [ ] 告警基于 SLO/症状(而非仅资源阈值)
- [ ] 日志结构化(JSON)并带 trace_id
- [ ] 关键链路有分布式追踪
- [ ] 告警有明确 runbook 与负责人,无"孤儿告警"
建议
先定义 SLO 再写告警。没有 SLO 的告警很容易变成"阈值随意设、响了没人管"的噪音源。
六、交付与变更
- [ ] 所有配置用 Git 管理(GitOps 或至少 manifests 入库)
- [ ] 有回滚方案并演练过(
kubectl rollout undo或 Git 回退) - [ ] 镜像 tag 与 Git commit 可对应
- [ ] 生产变更走审批,有灰度批次
- [ ] 数据库/基础设施变更与应用发布解耦
- [ ] 有发布窗口与冻结期约定
七、成本与容量
- [ ] 命名空间/团队标签齐全,成本可分摊
- [ ] 定期(至少季度)做 requests RightSizing
- [ ] 启用 HPA / CA(按负载特征)
- [ ] 清理了无主 PV、废弃 LB、旧快照
- [ ] 有容量规划与增长模型,不是"满了再加"
八、故障与演练
- [ ] 有 on-call 轮值与升级路径
- [ ] 核心场景做过故障演练(节点宕机、AZ 故障)
- [ ] 每次事故有 postmortem,且改进项被跟踪关闭
- [ ] 集群证书到期有监控告警
验证
清单的价值在于被实际核对,而不是存在文档里:
bash
# 快速自检脚本思路(示例:找出没设 requests 的 Deployment)
kubectl get deploy -A -o json | jq -r '
.items[] | select(.spec.template.spec.containers[].resources.requests == null)
| "\(.metadata.namespace)/\(.metadata.name)"'
# 找出以 root 运行且未限制的容器(需结合 PSP/PSA 或策略引擎)1
2
3
4
5
6
2
3
4
5
6
版本相关
上面 jq 表达式仅作示例,字段结构与你的集群版本/CRD 可能不同,请在测试环境验证后再用于生产巡检。
常见坑
- checklist 做完就归档:最佳实践是持续状态,需纳入巡检。
- 只勾选不看效果:例如"配了探针"但探针永远返回成功,等于没配。
- 忽略人的流程:工具配齐但没人 on-call、没人做 postmortem,可靠性仍然靠运气。
- 一次性追求满分:应先覆盖高风险项(权限、备份、探针、PDB),再逐步完善。
参考资料
- Kubernetes 官方文档:生产环境注意事项,访问日期:2026-10-09。
- Kubernetes 官方文档:Pod 安全标准,访问日期:2026-10-09。
- Kubernetes 官方文档:配置 Pod 以使用存储,访问日期:2026-10-09。
- Google SRE Book,访问日期:2026-10-09。