很多工程师在从传统运维或 Docker 转向 Kubernetes (K8s) 时,都会经历一段强烈的“挫败期”:
我明明精通 Linux,Docker 玩得很溜,后端代码也写得好好的,为什么一上 K8s 就各种报错?连个简单的服务都跑不通?
其实,这真不是你菜。根本原因在于:Kubernetes 从来就不是一个简单的“容器管理工具”,它是一套独立的、完整的分布式系统操作系统。 它的设计哲学与我们过去几十年的运维习惯是背道而驰的。为了少走弯路,我总结了 K8s 入门必经的 12 个“深坑”。这些坑,每一个都对应着一次思维的阵痛与蜕变。
第一阶段:认知崩塌(思维模式的转变)
这几个坑最致命,因为它们挑战的是你的直觉。
01. 最致命的坑:把 K8s 当成“高级 Docker”
-
❌ 新手直觉:“Pod 不就是容器吗?挂了我 SSH 进去修一下就好了。”
-
✅ K8s 真相:Pod 是用来被销毁的,而不是被修复的。 在 K8s 的设计里,Pod 是“易碎品”(Ephemaral)。
-
- Pod 不是虚拟机,它没有“身份”。
- Pod 随时可能因为节点故障、资源调度而被杀掉重建。
- 切记:一旦你产生了“我要 SSH 进容器里改个配置/装个软件”的念头,你就已经违背了不可变基础设施(Immutable Infrastructure)的原则。
02. “万能银弹”坑:以为上了 K8s 就高枕无忧
- ❌ 新手直觉:“系统不稳定?上 K8s 吧,它能自动修复。”
- ✅ K8s 真相:Kubernetes 是放大器。 它会放大优良设计的优势,也会无限放大糟糕设计的缺陷。如果你的应用本身不支持优雅停机、没有重试机制、状态管理混乱,上了 K8s 只会死得更快、更惨。
03. 终极哲学坑:没意识到这是“范式迁移”
-
❌ 新手直觉:试图用脚本思维去理解 K8s。
-
✅ K8s 真相:这是一场从“宠物”到“牲畜”的思维革命。
-
- 传统思维:机器是昂贵的、可靠的,我们要精心呵护(Pet)。
- 云原生思维:计算资源是廉价的、不稳定的,随时可以替换(Cattle)。
- K8s 逼迫你回答一个问题:你的代码,是为“不稳定的世界”而写的吗?
第二阶段:机制陷阱(被忽视的复杂性)
这几个坑,往往是因为低估了 K8s 抽象层的复杂度。
04. YAML 之坑:那不是配置文件,是“许愿单”
- ❌ 新手直觉:“写个 YAML 而已,跟写 Nginx 配置差不多吧?”
- ✅ K8s 真相:YAML 是 API 对象声明。 你写的不是“步骤”,而是“期望状态”(Desired State)。缩进错一格,或者
command覆盖了 Dockerfile 的ENTRYPOINT,或者args覆盖了CMD,都会导致诡异的行为。你必须精准地告诉 K8s 你想要什么,而不是怎么做。
05. Service 之坑:Pod 跑着 ≠ 服务能用
-
❌ 新手直觉:“Pod 状态是 Running,日志也正常,为什么 curl 不通?”
-
✅ K8s 真相:Pod 负责“生存”,Service 负责“社交”。 这是两套完全解耦的抽象。
-
- Selector 标签写错一个字母,Service 就找不到后端 Pod。
containerPort和servicePort傻傻分不清。- 切记:在 K8s 里,没有 Service 的 Pod 是一座孤岛。
06. 网络之坑:不要依赖 Pod IP
- ❌ 新手直觉:“我看了一下 Pod IP 是 10.1.x.x,我把它配到数据库白名单里。”
- ✅ K8s 真相:Pod IP 是整个集群里最不值钱的东西。 Pod 重启后 IP 一定会变(除非用特定网络插件)。如果你在代码或配置里硬编码了 Pod IP,你的系统在下一次发布时就会瘫痪。请永远通过 DNS 和 Service Name 通信。
07. 存储之坑:你以为你有“硬盘”,其实你没有
- ❌ 新手直觉:“我在容器
/data目录下写了文件,为什么重启就丢了?” - ✅ K8s 真相:容器的文件系统是临时的。 除非你显式声明了 PVC (PersistentVolumeClaim) 并挂载,否则 Pod 一旦重启,写入容器层的数据就会烟消云散。对于数据库类应用,不懂 StatefulSet 和 PVC,就是灾难。
第三阶段:生产幻觉(以为能跑就是好)
这几个坑,通常发生在上线后的第一周。
08. 资源限制坑:OOM 的罪魁祸首
-
❌ 新手直觉:“我节点有 64G 内存,Pod 怎么会 OOM?”
-
✅ K8s 真相:K8s 调度不看物理机剩余资源,只看你声明的 Requests/Limits。
-
requests写小了,Pod 被调度到拥挤的节点,由于争抢资源被饿死。limits写小了,应用突发流量内存飙升,直接被内核 OOM Kill。- 不写资源限制?那是给集群埋雷。
09. 健康检查坑:探针写错,比没写更危险
-
❌ 新手直觉:“加上 LivenessProbe,服务挂了能自动重启,完美。”
-
✅ K8s 真相:你分得清“我活着”和“我能工作”吗?
-
- Liveness (存活探针):探测死锁。如果你把数据库连接检查写在这里,一旦数据库抖动,K8s 就会疯狂重启你的所有 Web 服务,导致雪崩。
- Readiness (就绪探针):探测服务能力。只有通过这个,Service 才会把流量切进来。
- 混用这两个探针,是新手引发生产事故的 Top 3 原因。
10. 扩容幻想坑:无状态的谎言
- ❌ 新手直觉:“扛不住了?
kubectl scale --replicas=10!” - ✅ K8s 真相:K8s 能帮你复制进程,但不能帮你复制逻辑。 如果你的应用有本地缓存、有定时任务(CronJob)、或者依赖顺序消费消息,盲目扩容只会导致数据不一致、任务重复执行或锁竞争。
11. 日志黑洞坑:日志去哪了?
- ❌ 新手直觉:习惯性想去
/var/log找日志文件。 - ✅ K8s 真相:日志是流(Stream)。 Pod 标准输出的日志由 Docker 引擎接管,如果不配置日志收集系统(如 EFK、Promtail),Pod 删除后,日志彻底消失。没有离线的日志收集策略,排查历史故障就是痴人说梦。
12. 学习焦虑坑:试图一次吃成胖子
- ❌ 新手直觉:一上来就死磕 Operator, Istio, CNI 原理。
- ✅ K8s 真相:二八原则。 K8s 概念极多,但 80% 的日常工作只需要 20% 的核心概念(Pod, Deployment, Service, ConfigMap, Secret, PVC)。先用这几个把业务跑起来,其他的(如 CRD, NetworkPolicy)等到遇到了痛点再学也不迟。
写在最后
看完这 12 个坑,你可能会觉得 Kubernetes 简直是“反人类”。但当你跨过这些坑,真正理解了它背后的 “声明式 API”、“控制循环”、“不可变基础设施” 等设计哲学后,你会发现:
Kubernetes 不是在折磨你,它是在强迫你构建一个更健壮、更现代化、更能适应不确定性的分布式系统。