30. 生产环境检查清单#
mindmap
root((Production<br/>Readiness))
Resources
Requests & Limits
HPA
PDB
Resource Quotas
Reliability
Health Checks
Anti-affinity
Graceful Shutdown
Rollback Plan
Security
RBAC
NetworkPolicy
Image Scanning
Secrets Management
Observability
Metrics
Logging
Tracing
Alerting
Networking
TLS
Ingress
DNS
Rate Limiting
Backup
etcd Backup
PV Snapshots
DB Backup
资源管理(Resource Management)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ 所有容器均已设置 CPU/Memory requests |
避免调度异常 |
|
☐ 所有容器均已设置 CPU/Memory limits |
防止”吵闹邻居”问题 |
|
☐ 无状态工作负载已配置 HPA |
基于 CPU/内存/自定义指标自动扩缩容 |
|
☐ 有状态工作负载已评估 VPA |
自动调整资源请求至合理水平 |
|
☐ 已设置 PodDisruptionBudget |
确保节点排空(Drain)期间的可用性 |
|
☐ 命名空间已设置 ResourceQuota |
防止资源被耗尽 |
|
☐ 命名空间已设置 LimitRange |
为未显式指定限制的 Pod 提供默认值 |
# ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "100"
persistentvolumeclaims: "20"
---
# LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: production
spec:
limits:
- default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "100m"
memory: "128Mi"
type: Container
可靠性(Reliability)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ 已配置存活探针(Liveness Probe) |
自动重启不健康的容器 |
|
☐ 已配置就绪探针(Readiness Probe) |
启动期间或异常时从 Service 中摘除 |
|
☐ 慢启动应用已配置启动探针(Startup Probe) |
防止存活探针过早判定失败 |
|
☐ 已实现优雅关闭(Graceful Shutdown) |
正确处理 SIGTERM 信号,排空连接 |
|
☐ 已设置 terminationGracePeriodSeconds |
默认 30 秒,按需调大 |
|
☐ 已配置 Pod 反亲和性(Anti-affinity) |
将 Pod 分散到不同节点 |
|
☐ 已配置拓扑分布约束(Topology Spread Constraints) |
跨可用区均匀分布 |
|
☐ 已配置滚动更新策略(Rolling Update Strategy) |
maxSurge=1, maxUnavailable=0 实现零停机 |
|
☐ 已编写回滚预案 |
|
# Pod 反亲和性 + 拓扑分布约束
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: ["myapp"]
topologyKey: kubernetes.io/hostname
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
安全(Security)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ 已配置 RBAC(最小权限原则) |
应用禁止使用 cluster-admin |
|
☐ 已应用 NetworkPolicy |
默认拒绝 + 显式放行 |
|
☐ 已启用 Pod 安全标准(Pod Security Standards) |
生产环境使用 |
|
☐ 容器以非 root 用户运行 |
|
|
☐ 根文件系统设为只读 |
|
|
☐ 禁止特权提升 |
|
|
☐ 已丢弃所有 Linux Capabilities |
|
|
☐ CI 中已集成镜像漏洞扫描 |
发现严重 CVE 时阻断流水线(Trivy/Snyk) |
|
☐ 镜像已签名 |
Cosign + 准入策略(Admission Policy) |
|
☐ 密钥由外部系统管理 |
Vault / Sealed Secrets / External Secrets |
|
☐ 私有镜像仓库已配置 imagePullSecrets |
确保镜像可正常拉取 |
|
☐ 生产环境禁止使用 |
使用明确的版本标签 |
可观测性(Observability)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ 已暴露 Prometheus 指标 |
|
|
☐ 已配置 ServiceMonitor |
Prometheus 采集配置 |
|
☐ 已创建 Grafana 仪表盘 |
涵盖关键业务指标和基础设施指标 |
|
☐ 已定义告警规则 |
错误率、延迟、饱和度 |
|
☐ 日志采用结构化格式(JSON) |
便于日志聚合器解析 |
|
☐ 已配置日志聚合 |
Loki / ELK / CloudWatch |
|
☐ 已启用分布式链路追踪 |
OpenTelemetry / Jaeger |
|
☐ 已定义并监控 SLO |
可用性、延迟目标 |
必须配置的核心告警#
# 必备告警
- HighErrorRate: 5xx 错误率 > 5% 持续 5 分钟
- HighLatency: p99 延迟 > 1s 持续 5 分钟
- PodCrashLooping: 重启频率 > 0 持续 5 分钟
- PodOOMKilled: 任何 OOM 事件
- NodeNotReady: 节点 NotReady 持续 5 分钟
- DiskPressure: 磁盘使用率 > 85%
- CertificateExpiring: TLS 证书将在 14 天内过期
- PVCAlmostFull: PVC 使用率 > 85%
网络(Networking)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ Ingress 层已配置 TLS 终止 |
cert-manager + Let’s Encrypt |
|
☐ 已配置 HTTP → HTTPS 重定向 |
|
|
☐ 已配置速率限制(Rate Limiting) |
防止滥用 |
|
☐ 已配置 CORS |
如果 API 需要被浏览器访问 |
|
☐ 已设置安全响应头 |
X-Frame-Options、CSP 等 |
|
☐ DNS 记录已配置 |
所有服务的 A/CNAME 记录 |
|
☐ 健康检查端点已排除认证 |
|
备份与灾难恢复(Backup & Disaster Recovery)#
检查项 |
状态 |
说明 |
|---|---|---|
☐ etcd 备份已自动化 |
每日快照,已验证恢复流程 |
|
☐ 已配置 PV 快照 |
数据库使用 VolumeSnapshot |
|
☐ 数据库备份已自动化 |
pg_dump / mysqldump + 定时任务 |
|
☐ 备份存储在集群外部 |
S3 / GCS / 独立存储 |
|
☐ 恢复流程已文档化 |
逐步操作手册(Runbook) |
|
☐ 灾难恢复已演练 |
定期进行 DR 演练 |
CI/CD#
检查项 |
状态 |
说明 |
|---|---|---|
☐ CI 流水线已运行测试 |
单元测试 + 集成测试 |
|
☐ CI 中已构建并扫描镜像 |
发现严重 CVE 时阻断 |
|
☐ 已配置 GitOps 工作流 |
ArgoCD / Flux |
|
☐ 已配置金丝雀/蓝绿部署 |
渐进式发布(Progressive Rollout) |
|
☐ 回滚流程已文档化 |
一条命令即可回滚 |
|
☐ 预发布环境与生产环境保持一致 |
相同配置,较小规模 |
部署前验证#
# 验证清单文件
kubectl apply --dry-run=server -f manifests/
helm template myapp ./chart -f values-prod.yaml | kubectl apply --dry-run=server -f -
# 检查资源配额
kubectl describe resourcequota -n production
# 验证镜像是否存在
docker manifest inspect registry.example.com/myapp:1.2.3
# 部署后运行冒烟测试
kubectl rollout status deployment/myapp --timeout=300s
curl -f https://myapp.example.com/healthz