K8s 入门必踩的 12 个坑:不是你菜,是设计哲学变了

41 阅读6分钟

很多工程师在从传统运维或 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 不是在折磨你,它是在强迫你构建一个更健壮、更现代化、更能适应不确定性的分布式系统。