"我们要上云原生。"
这句话我至少听过 50 次。说的人都很坚定,但每次追问一句"为什么",得到的答案惊人地一致——"友商上了"、"领导要求的"、"技术总监推荐的"。没有人回答"我们当前遇到了什么问题,云原生的哪一项能力能解决"。
这种回答方式让我警觉。云原生不是新衣服,穿上就好看。它是一组工程能力,对应的是具体的痛点。痛点不匹配,能力再强也是负担。
云原生不是"K8s + 微服务 + DevOps"
我以前也是这么理解的。把"上云原生"等同于"上 K8s + 拆微服务 + 搞 CI/CD"。这套组合拳打出去,确实能立竿见影看到项目"现代化"了。但我做了几年之后回头看,这套组合拳只解决了一类问题:规模问题。
当你的系统是几百个服务、几千个 Pod、每天几百次发布——你确实需要 K8s,需要服务网格,需要渐进式交付,需要可观测性的全套栈。这些是规模逼出来的,不是理念逼出来的。
但如果你只有十几个服务、几十个 Pod、每周发布两次——硬上 K8s 不会让你"现代化",只会让你"复杂化"。你的运维成本涨 5 倍,问题定位难度涨 10 倍,团队需要学的新概念涨 20 倍。最后产出是"看起来很先进,实际上跑得比单体还慢"。
我见过太多这样的项目。开动员大会时意气风发,半年后团队怨声载道——因为没人能在出问题时 5 分钟内定位。
三个朴素的判断
这几年我慢慢形成了三个判断——什么时候该上、什么时候不该上、什么时候该退半步。这三个判断不是真理,是经验,但比任何"云原生宣言"都管用。
判断一:这个痛点,是规模问题还是理念问题?
规模问题——并发上万、部署频率每天多次、跨地域容灾、流量峰值不可预测。这些是云原生的强项,K8s 的弹性、服务网格的流量治理、Service Mesh 的多语言支持——这些工具就是为这种规模造的。
理念问题——"我们要用最新技术"、"我们要对标业界领先"、"我们要有技术品牌"。这些不是云原生能解决的,是组织文化问题。技术解决不了文化问题,但文化问题常常伪装成技术问题来骗预算。
区分这两个问题,比任何架构图都重要。
判断二:组织能跟上吗?
云原生是一组能力,不是一组工具。能力是要人掌握的。一个团队用传统的方式做了三年,切换到云原生至少需要一年适应。这一年里,团队的产能会下降 30% 到 50%,故障率会短暂上升。
如果你的组织正在一个关键时期——产品上线、业务扩张、人员招聘——这时候切换云原生是找死。最理性的做法是:等业务稳定期再切换;或者并行运行,渐进迁移。
我见过最聪明的一次迁移:某团队用了一年时间,先在新业务上用云原生,验证成熟后再迁老业务。整个过程没有发生一次"全站不可用"的事故。这不是技术胜利,是组织胜利。
判断三:你能放弃一些东西吗?
云原生的代价是"放弃一些确定性"。单体时代,你知道每次部署会发生什么。云原生时代,你必须接受"有时会出现你理解不了的状态"——某个 Pod 突然被驱逐了、某个 Service 的负载均衡突然变了、某个节点突然不可达但 30 秒后又好了。
如果你所在的是金融、医疗、航空——这些"零容忍"的领域——云原生的某些特性可能不适合。需要做严格的"云原生适配性评估",不是直接上。
反过来,如果你的系统是"出错能赔钱但不会出人命"——那云原生的弹性、灰度、容错反而比"确定性"更值钱。
我理想中的云原生架构
如果让我从零设计一个云原生架构,我会怎么做?
我会先写一份"问题清单"——当前和未来两年里,系统会遇到的规模、效率、可靠性、成本问题。每条问题对应一项云原生能力。问题对应不上的能力,不上。
然后我会做"渐进式引入"——先上一两个能力,验证成熟;再上下一个。比如先上 K8s,但不拆微服务;先上 CI/CD,但不引入服务网格。每次引入都要有"明确的成功标准"和"明确的退出策略"。
我会把"可观测性"作为第一项能力引入——不是因为它最 fancy,而是因为它是最容易被忽视、最影响效率、最难后补的能力。Trace、Metric、Log 三件套不齐全,所有其他的云原生能力都是黑盒。
最后,我会保留一个"撤退路径"——云原生的每一项能力,都有"可以退回去"的方案。K8s 跑不动可以回 VM,Service Mesh 太重可以回 SDK 集成,可观测性栈太贵可以先用开源版。这个"撤退路径"不是懦弱,是工程理性。任何不能撤退的架构选择,都是赌博。
回到最初的问题
"我们要上云原生吗?"——这个问题问错了。正确的问题是:"我们当前遇到的具体问题是什么?云原生的哪一项能力能解决?我们的组织准备付出多少成本来掌握它?"
三个问题答不上来,再响亮的口号也是泡沫。三个问题都答上来了,你会发现——其实你不需要"上云原生",你需要的是解决那三个具体问题。云原生只是恰好是其中一种解法而已。
还没想明白的事
有一个问题我到现在都没想清楚:云原生的终局是"所有应用都跑在 K8s 上",还是"云原生变成一种基础设施而不是技术栈"?
前者的判断是——K8s 是 Linux 之后的下一个操作系统级别的抽象,所有应用最终都会跑在上面。后者的判断是——云原生会"下沉"到云厂商,用户根本不知道也不用知道 K8s 的存在,就像现在很少有人关心自己的应用跑在哪个 Linux 发行版上。
如果后者是真的,那现在花大力气学 K8s 是不是有点傻?这条路我想得越多越觉得答案不那么显然。你们怎么看?