Kubernetes 复杂度论:从一场面试题说起

最近经历了一场面试,面试官抛出了一个看似常规的问题:“你认为什么情况下应该使用 Kubernetes,而什么情况下使用 Kubernetes 是没有必要的、徒增复杂度?”

这个问题当时回答得还算流畅,但之后它反而在我脑海里盘旋了许久。这个问题之所以“刺耳”,是因为它跳出了“怎么用 K8s”的技术细节,直指架构设计的核心权衡:我们引入一个技术栈,到底是为了解决业务的真实痛点,还是仅仅为了满足技术团队的“先进性焦虑”?

很多团队把 Kubernetes 当作现代化研发的标配起点,但现实往往是残酷的:你不是上了 Kubernetes 就自动获得了 Google、AWS、Azure 等云厂商般的基础设施能力;你是上了 Kubernetes 之后,才刚刚开始背负起治理分布式系统的沉重代价。

Kubernetes 本质:复杂度的“交换”而非“消除”

Kubernetes 的核心价值从来不在于“跑容器”——Docker Compose 也能跑,甚至 systemd 也能跑。它的核心价值在于控制平面(Control Plane):它提供了一套声明式的 API,允许我们描述系统的“期望状态”,并由系统自动将“实际状态”收敛到期望状态。

这是一种复杂度的交换

  • 我们得到的是:标准化的应用交付模型、自动化的调度与自愈、统一的资源抽象。
  • 我们支付的是:维护一个分布式系统的运维成本,以及必须引入的网络(CNI)、存储(CSI)、安全策略、证书管理、可观测性等一整套庞大的生态组件。

如果你系统的复杂度本身还没有达到需要“控制平面”来治理的程度,那么引入 K8s 就纯粹是在做加法,而且加的是负债。

一个反模式故事:把“部署问题”误判为“平台问题”

我曾见过一个典型的“过度设计”案例,相信很多做基础设施的工程师都不陌生。

背景: 一个初创团队,业务刚起步,只有 3 个后端服务、1 个前端项目,加上 MySQL 和 Redis。流量平稳,偶尔发版。

决策: 为了“拥抱云原生”,团队决定直接上 Kubernetes。搭建了一套高可用的控制平面,配置了 Ingress Controller,上了 Cert-manager,还有一堆 Prometheus Operator。

结果(半年后)

  1. 发布没有变快,反而变慢了:原本简单的 git pull && restart 变成了冗长的 CI/CD Pipeline 构建镜像、推镜像、更新 YAML。开发人员不仅要写代码,还要学习什么是 Pod、Service、Ingress。
  2. 排障门槛指数级上升:以前服务挂了看日志;现在服务挂了,可能是 Liveness Probe 失败、可能是 OOMKilled、可能是 CNI IP 池耗尽、也可能是 CoreDNS 解析超时。
  3. 基础设施腐化:因为没有专职的 SRE,集群版本落后社区 4 个大版本没人敢升,证书过期导致全站宕机,甚至出现过 etcd 脑裂。

这个团队真正需要的,其实可能只是一套写得好的 Ansible Playbook,或者一个简单的 PaaS 服务。

决策信号:什么时候 Kubernetes 是“刚需”

判断是否应该引入 Kubernetes,核心标准是:你的痛点是否已经从“单点运维”演变成了“规模化治理”

当以下信号出现得越多,K8s 的收益就越明显:

1. 规模化与协作复杂度激增

当服务数量从个位数增长到几十个,涉及多个团队协作时,由于环境差异、依赖冲突导致的“上线难”成为瓶颈。此时,K8s 提供的统一交付标准(Pod/Deployment)和命名空间隔离,能显著降低协作摩擦成本。

2. 弹性与调度成为硬性要求

如果你的业务有明显的波峰波谷,需要自动扩缩容(HPA/VPA);或者你需要运行 AI 训练等对调度策略有特殊要求(如 Gang Scheduling)的工作负载,手动管理资源已不现实,这时 K8s 的调度器价值巨大。

3. 多租户与统一治理

当一个基础设施平台需要支持多个业务线,且必须在网络(NetworkPolicy)、权限(RBAC)、资源(Quota)上做严格隔离时,K8s 是目前业界最成熟的标准化多租户底座。

4. 真正准备好做“平台工程”

这是最重要的一点。Kubernetes 适合那些愿意投入人力做平台的组织。这意味着有人负责集群生命周期管理、封装 Helm Chart 模板、建设可观测性体系。只有这样,K8s 才能成为研发效率的杠杆。

决策信号:什么时候 Kubernetes 是“过度设计”

反之,如果符合以下特征,请谨慎行事:

  • 单体架构或极少微服务:系统拓扑简单,依赖关系清晰,Systemd 或 Docker Compose 足矣。
  • 团队缺乏运维专长:没有懂网络底层(iptables/nftables/eBPF)、懂存储、懂容器运行时的专职工程师。K8s 出了问题就是黑箱。
  • 需求仅仅是“发布容器”:云厂商的 Serverless 容器服务(如 AWS Fargate, Google Cloud Run)是更好的选择,它们提供了容器的好处,却屏蔽了集群管理的痛苦。

结语:让技术回归解决问题

那场面试最后,我意识到:成熟的架构师不是手里拿着锤子看什么都是钉子,而是知道什么时候该把锤子放下。

Kubernetes 是一个强大的武器,但它也是一头吞噬运维精力的巨兽。在决定把它领回家之前,请确保你真的需要它来替你打仗,并且你有足够的粮草来喂养它。

来源