【云原生与DevOps】03-K8s生产环境部署Checklist:你踩过这18个坑吗

📅 2026/6/30 1:03:49
【云原生与DevOps】03-K8s生产环境部署Checklist:你踩过这18个坑吗
专栏云原生 DevOps难度进阶标签Kubernetes生产环境checklist踩坑最佳实践前言K8s 在测试环境跑得好好的一到生产就出问题。本文总结了真实血泪经验中的18个坑每一条都是真实事故凝练的经验。坑1没配资源 limits被一个Pod打挂整个节点resources:requests:cpu:250mmemory:256Milimits:cpu:1000mmemory:512Mi教训requests用于调度limits用于限制。不配 limits一个内存泄漏的 Pod 会把节点内存耗尽导致 OOMKill 雪崩。坑2镜像标签用 latest滚动更新失效# 错误image:myapp:latest# 正确image:myapp:1.2.3-abc1234# 包含git commit hash教训latest不是版本imagePullPolicy: Always会导致每次都拉镜像降低启动速度。坑3没配健康检查流量打到未就绪的PodreadinessProbe:httpGet:path:/health/readyport:8080initialDelaySeconds:10periodSeconds:5failureThreshold:3livenessProbe:httpGet:path:/health/liveport:8080initialDelaySeconds:30periodSeconds:10failureThreshold:3教训readinessProbe控制是否接收流量livenessProbe控制是否重启容器两者缺一不可。坑4PodDisruptionBudget 没配滚动更新导致服务中断apiVersion:policy/v1kind:PodDisruptionBudgetmetadata:name:myapp-pdbspec:minAvailable:2# 滚动时保持至少2个可用selector:matchLabels:app:myapp坑5没配 HPA突发流量直接挂apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:myapp-hpaspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:myappminReplicas:2maxReplicas:20metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:70坑6ConfigMap 热更新不生效默认情况下 Pod 不会感知 ConfigMap 的变更。解决方案使用 Reloader推荐https://github.com/stakater/Reloader将配置版本写入 Deployment annotation触发滚动更新# 方案2在annotation中记录configmap版本spec:template:metadata:annotations:configmap-version:v3# 改这里触发滚动更新坑7Service 类型用 NodePort 暴露生产服务生产环境应使用 LoadBalancer 或 IngressNodePort 端口范围有限且难以管理。坑8没配 Pod 反亲和性所有副本跑在同一节点affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchLabels:app:myapptopologyKey:kubernetes.io/hostname坑9Secret 明文写在 YAML 里推送到 Git使用 Sealed Secrets 或 Vault# 安装 Sealed Secretshelm repoaddsealed-secrets https://bitnami-labs.github.io/sealed-secrets helminstallsealed-secrets sealed-secrets/sealed-secrets-nkube-system# 加密Secretkubeseal-oyamlsecret.yamlsealed-secret.yaml坑10命名空间没做资源配额Dev环境把生产资源耗尽apiVersion:v1kind:ResourceQuotametadata:name:dev-quotanamespace:developmentspec:hard:requests.cpu:4requests.memory:8Gilimits.cpu:8limits.memory:16Gicount/pods:20坑11没配terminationGracePeriodSeconds应用被强杀spec:terminationGracePeriodSeconds:60# 给应用60秒优雅退出时间containers:-name:myapplifecycle:preStop:exec:command:[/bin/sh,-c,sleep 5]# 等待LB摘除此Pod坑12 - 坑18核心原则速览坑号问题解决方案12etcd 没备份配置 etcd 自动备份到 S3/OSS13节点磁盘打满Pod 被驱逐配置 evictionHard 阈值及时清理镜像14日志直接写容器内重启丢失使用 DaemonSet 收集日志Filebeat/Fluentd15RBAC 给了 cluster-admin权限过大遵循最小权限原则16镜像拉取无重试冷启动失败配置 imagePullPolicy: IfNotPresent17单 Master 高可用差生产至少3个 Master 节点18升级 K8s 版本前未测试在独立集群先验证看 Changelog结语这18个坑没有一个是偶然发生的都有据可查。把这个 checklist 贴在你们团队的部署规范里可以避免80%的生产事故。