你的K8s集群还在“美式裸奔”?这3个经典坑,90%的团队都踩过
兄弟们,咱们聊点掏心窝子的。你搭建Kubernetes(简称K8s)的时候,是不是也照着网上那些“经典美国式”教程,一键部署,看着Pod跑起来,感觉爽到飞起?但过俩月,生产环境一上量,哎呦我去,节点CPU飙到99%,Pod像抽风一样重启,报警邮件能把邮箱塞爆。这时候你才明白,K8s经典美国式部署,那是人家硅谷大厂的标准玩法,咱们照搬过来,水土不服那是必然的。今天咱们不聊虚的,就扒一扒那些年我们一起踩过的“美式”大坑,看看怎么用“中式”智慧把它填平。
坑一:资源请求和限制,你是不是直接抄的文档默认值?
很多教程告诉你,在Deployment里写resources.requests和limits,但K8s经典美国式做法是“给足余量,宁滥勿缺”。结果呢?你的集群里,每个Pod都申请了2核4G,但实际只用了0.1核。剩下的资源全被“预占”了,新Pod排不上,老Pod闲着。这就像美国大兵打仗,一人背三天的口粮,结果后勤车全堵在路上。
咱们得学学“精打细算”。别拍脑袋定数值,先跑个压测,用kubectl top pod看看真实水位。比如,我们之前有个Java服务,文档建议limits给2G,实际压测发现1G绰绰有余。改完之后,集群利用率直接提升了35%。记住,资源配额是门生意经,不是慈善会。给多了是浪费,给少了是事故,动态调整才是王道。
坑二:健康检查只配了Liveness,你的服务“假死”过吗?
“美式”教程最爱说:“加个Liveness探针,挂了自动重启,完美!” 但现实是,你的服务可能没“挂”,它只是“卡住了”——比如数据库连接池满了,线程阻塞了。Liveness探针一检测,诶,进程还在,返回200,K8s觉得你活得好好的。但实际请求进来,全部超时。这就是典型的“僵尸服务”,比直接宕机更可怕。
核心解法是“三探针组合拳”。光有Liveness不够,必须配上ReadinessProbe(就绪探针)。它决定流量要不要打到这个Pod上。再高级点,加个StartupProbe(启动探针),防止服务启动慢被Liveness误杀。我们曾经有个网关服务,启动要30秒,Liveness默认10秒就探测,结果无限重启循环。加了StartupProbe,设置60秒宽限期,问题秒解。健康检查不是K8s的KPI,是你的服务生命线。
坑三:镜像标签用latest,你体验过“盲盒式”发布吗?
这是K8s经典美国式里最坑爹的一条:为了方便,镜像tag直接打latest。然后某天你更新了代码,push了新的latest,K8s滚动更新,Pod拉取新镜像。结果呢?新代码有Bug,你想回滚到上一个版本。你发现,你根本不知道上一个latest是哪个commit构建的。这就像开盲盒,你永远不知道这次发布的是惊喜还是惊吓。
正确的“中式”操作是“不可变标签”。用Git commit的短SHA作为镜像tag,比如myapp:7f3a2b1。这样每个版本都是唯一的,可追溯的。回滚?直接kubectl rollout undo,K8s自动帮你切到上一个ReplicaSet的镜像版本,干净利落。我们团队自从改用这个策略,发布事故的恢复时间从平均40分钟降到了5分钟以内。版本管理不是洁癖,是保命符。
说到底,K8s经典美国式那套东西,适合超大规模、基础设施极度标准化的场景。咱们中小团队,要的是灵活、可控、省钱。别迷信“最佳实践”,要找到“最适合实践”。
最后给你一个行动号召:今天就去检查一下你的集群,看看有多少Pod的limits是拍脑袋写的?有多少服务缺了ReadinessProbe?有多少镜像tag是latest?别让“美式”的傲慢,毁了你的“中式”业务。花半小时改掉这三个坑,你的K8s集群会感谢你,你的运维同事更会请你喝奶茶。