ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

云原生详解:从容器、Kubernetes到微服务与落地实践

云原生详解:从容器、Kubernetes到微服务与落地实践 云原生这个词这几年几乎被说烂了。各种技术大会、招聘 JD、架构师述职 PPT 里都在讲从互联网大厂到传统企业的技术团队都在谈。但你真要问一句云原生到底是什么十个人能给出八种答案有人说用 Docker 和 Kubernetes 就是云原生有人说微服务化就是云原生还有人把 DevOps 挂在嘴边觉得上了 CI/CD 就算云原生。我见过不少团队把老系统拆成几十个微服务、塞进 K8s 集群里结果故障率不降反升排查问题比原来还要痛苦——这就是典型的只学了形态没搞懂本质。这篇文章我打算把云原生这件事从头到尾捋一遍。从它要解决的根本问题、核心的技术支柱到业界公认的 CNCF 全景图怎么读再到团队真正落地时应该先做什么后做什么都会展开讲清楚。不管你是刚开始接触云原生的开发、运维还是需要做技术决策的团队负责人这篇文章的目标只有一个——让你读完以后能真正搞懂云原生是什么、为什么非它不可、以及怎么落地才靠谱。1. 云原生不是一套技术栈而是一套治理思路1.1 先说说我踩过的伪云原生坑大概五年前我第一次负责把一个传统电商系统做容器化改造。当时我们团队的理解极其朴素把应用打成 Docker 镜像丢到 Kubernetes 集群里跑起来这不就是云原生了吗于是吭哧吭哧干了三个月把原先部署在十几台虚拟机上的单体应用塞进了容器。结果如何确实能跑但问题接踵而至——原来的定时任务在多个副本上同时执行了Session 状态存内存导致负载均衡后用户老是掉登录日志散落在各个容器里出了问题得用 kubectl logs 一个一个翻。后来我才真正意识到云原生不是把东西往容器里一塞就完事。那套单体应用从设计之初就跟云没关系它假设自己有固定 IP、有本地磁盘、有单机上的完整运行环境。把它塞进容器、交给编排系统管理之后环境变了它内部的很多隐式假设全部被打破。这个阶段我们做的只是上云不是云原生。1.2 CNCF给云原生下的定义以及它为什么这么绕云原生计算基金会CNCF给云原生下过一段非常著名的定义原话大致是云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中构建和运行可弹性扩展的应用。它的代表性技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。这段话很绕但你可以换个方式理解云原生是让软件系统从出生的那一刻起就默认自己会运行在云环境里并把云的优势——弹性、自动化、分布式、按需获取——完全利用起来。虚拟机时代我们通常把云当作一台远程的物理服务器来用而云原生要求我们把云当作一个整体操作系统来开发应用。这件事的本质是把传统那种先把应用写好再考虑部署在哪的思路强行扭转成应用从架构设计阶段就必须适配云端环境。所以你会发现云原生涉及的全是应用怎么拆微服务、应用怎么打包容器、应用怎么调度Kubernetes、应用怎么发布DevOps、应用怎么治理服务网格、应用怎么观测可观测性。每一个技术点都是围绕让应用在云上活得更好这件事展开的。所以与其问我要不要引入某项技术不如先问自己我的应用是不是已经默认自己生活在云上了2. 从单体到云原生的完整演进路径IOE、虚拟化到容器编排2.1 IOE架构时代IBM小型机、Oracle数据库和EMC存储的黄金十年想理解云原生得先知道我们是打哪儿过来的。十多年前企业核心系统的标准架构叫 IOE —— 也就是 IBM 的小型机、Oracle 的数据库、EMC 的集中式存储。这套架构的核心逻辑是我把所有业务逻辑都集中在一个强大的单点系统里靠硬件的高性能和数据库的高可靠性来支撑业务。一台小型机的处理能力不够没关系再加一台数据库做 RAC 集群。存储不够了上 EMC 的高端存储阵列。这种方案的优点是架构简单应用不用做任何拆分一个应用直接连数据库就行业务逻辑集中、开发效率高。但它的缺点也很致命。第一是贵小型机、Oracle 许可、高端存储的授权费用动辄几百万上千万谁用的谁知道。第二是扩展能力受限IOE 的扩展方式是纵向扩展也就是换更大的机器。可机器的性能天花板摆在那里就算你有钱当时特定型号小型机也有配置上限。第三是绑定严重IOE 的每一层都是专有系统出了问题你基本只能找原厂被捆绑得很紧。在当时这是没有办法的事。业务量就那么大数据库承载几千上万个并发已经非常吃力了。换句话说IOE 时代适合的是一个应用、一座城堡的模型城堡足够坚固就能撑住城里的所有居民。2.2 分布式架构阶段拆分、SOA与消息中间件互联网业务爆发之后情况变了。用户量从百万级涨到千万级、亿级单机再强也扛不住海量并发。于是行业开始转向分布式架构把应用按功能模块拆成多个子系统每个子系统独立部署、独立扩展子系统之间通过网络通信。这个阶段最著名的实践就是 SOA面向服务架构以及围绕它长出来的企业服务总线ESB、消息中间件如 Kafka、RocketMQ、RabbitMQ等。分布式确实解决了单点扩展的问题。你业务访问量大了可以把某个热点服务多部署几个实例前面挂个负载均衡把请求分散。数据库层面也做读写分离、分库分表。系统的容量上限一下被拉高了好几个量级。但代价也同步出现了分布式系统里网络是不可靠的节点是不可靠的节点之间的通信有延迟。以前应用在本地调用一个方法现在变成了远程调用一个服务可能超时、可能失败、可能返回乱序。为了保证数据最终一致你开始引入分布式事务业务代码里到处是补偿逻辑。为了定位一个请求跨了哪些服务你得上分布式链路追踪。这个阶段的架构复杂度比单体时代高了一个维度大量精力花在了驯服分布式固有的复杂性上。不过这个阶段虽然架构上变分布式了应用的运维和交付模式本质上还是老一套——点机器、装环境、部署包、手工配置。每套环境里的操作系统版本、JDK 版本、Tomcat 参数都不一定一样配置漂移是很常见的事。在我机器上是好的这句话成为那个年代开发与运维之间最大的矛盾来源。2.3 容器与Kubernetes由应用部署单元革命开始的质变说到容器得先提一个很多新人不注意的事实——容器技术本身并不是新东西Linux 的 chroot、namespace、cgroup 这些构建容器的底层机制十几年前就存在了Docker 的价值在于把使用容器的方式变简单了。它定义了一套镜像标准把应用、运行时、系统依赖、配置统统打包进一个可复用的、不可修改的镜像里。这一下子解决了大问题同一个镜像在开发环境怎么跑在测试、预发、生产环境就怎么跑。以往环境不一致导致的各种诡异问题直接消失了这是容器对软件工程最大的贡献——让环境本身变成了代码的一部分可以被版本管理、被审计、被复制。然后是 Kubernetes。它解决的不是单个容器怎么跑的问题而是大规模场景下几百上千个容器怎么调度、怎么弹性伸缩、怎么保证高可用的问题。Kubernetes 抽象出了节点和Pod这些概念用户只需要声明我要跑多少个副本、每个副本需要多少 CPU/内存、访问哪个端口剩下的由它来自动调度。节点挂了它会自动把 Pod 重新调度到别的节点副本数不够了它会自动扩容网络不通了它会帮你做服务发现和负载均衡。到这里你有没有发现一个关键转变在 IOE 时代和分布式阶段基础设施是资产你要小心翼翼地维护它生怕出故障到了容器和 Kubernetes 时代基础设施变成了可编程的资源池它随时可以被创建、销毁、重建业务不再需要关心它具体跑在哪一台机器上。这种思路就是后来常说的不可变基础设施——服务器一经创建就不再被修改任何变更都通过重建来完成。这个转变的重要性怎么强调都不为过它让成千上万的服务器管理变成了写代码和提交配置这么简单的操作。3. 云原生的六大支柱我一个个拆开讲3.1 微服务架构拆分的最小合理性微服务这个概念这些年被讲滥了讲歪了。很多人一提起微服务就想到拆把原来的单体应用按功能模块拆成一百个小服务然后各自独立开发、部署、扩展。愿望是好的但过度拆分带来的灾难性后果我在很多团队里见过——服务间调用链路深达十几层一次请求挂掉的原因可能出在任何一个环节联调成本、运维成本、监控成本全面飙升。我认为微服务最核心的价值不在于拆这件事本身而在于给每个模块一个独立的发布节奏和扩缩容边界。举例来说电商大促时商品浏览服务和订单创建服务面临的流量压力完全不同。如果它们耦合在一个单体里你只能把整个应用一起扩资源浪费非常严重拆开之后订单服务单独扩到 20 个副本商品服务扩到 5 个副本资源调度灵活得多。同时订单服务做了一次代码改动无需牵动商品服务重新发布发布风险面就收窄了。所以拆分的粒度一定要围绕团队边界 变更频率 资源需求差异三个维度来定。独立的微服务最好有独立的团队或者至少独立的负责人来维护否则拆了之后没人能说清楚它内部的业务逻辑。变更频繁、吞吐量差异大的模块拆开收益明显而那些极度稳定、资源消耗相近的模块强行拆开只会增加通信成本。拆到什么程度我的判断标准很朴素如果拆出来的服务你需要跨三个团队协调才能改一个字段那你就是拆过度了。3.2 容器化交付单元的统一标准刚才已经讲了容器在环境一致性上的价值这里我想再强调一个角度——容器作为交付单元的标准化意义。以前软件交付要么交一个 jar 包 / war 包要么交一个可执行的二进制再附带一份充满资深工程师才知道的部署文档比如先创建 /data/log 目录再把配置里的 IP 改成 xx.xx.xx.xx。这些手工步骤就是交付过程中最容易出问题的部分。容器镜像出现后交付物变成了一个标准的、自包含的镜像。镜像里应用代码、运行环境、配置、启动脚本全部打包完成。你把它推送到镜像仓库任何一台装有容器运行时的机器都可以直接拉取并启动它无需额外的环境配置。这是一个历史性的简化——软件交付从描述我应该被如何部署变成了我已经被打包好你只需要运行我。在实际落地时我建议团队关注几点镜像尽量小用多阶段构建分离编译环境和运行环境别把一堆构建工具链塞进生产镜像里镜像标签要可追溯最好和 Git 提交号或构建号一一对应生产环境出问题的时候你能确切知道线上跑的是哪一段代码基础镜像要有固定的升级流程和负责人因为镜像里的安全漏洞和依赖漏洞是持续存在的不是你打好一次就一劳永逸了。3.3 Kubernetes调度与编排Kubernetes 是整个云原生技术栈里最重、复杂度最高、也是最值得投入学习的一块。它本质上是一个分布式系统的调度操作系统负责解决三个问题把容器调度到合适的节点上、维持容器运行数量和健康状态、提供服务发现和负载均衡。用一个生活化的类比如果你把服务器集群想象成一个大型停车场每个停车位上可以停一辆或多辆车Pod停车场管理员就是 Kubernetes 的调度器。它会看每辆车容器需要多少车位CPU/内存再看看停车场的哪些区域节点有空位某辆车熄火了容器挂掉管理员立刻换上另一辆备用车重新创建 Pod车辆太少不够用的时候通知前台多放几辆车进来HPA 自动扩容。管理员怎么能做到这一切靠的是你在门口登记表上写的我希望这里有 3 辆车、每辆车需要 2 个车位、占用端口 8080——这就是声明式 API 的含义。你不用告诉它怎么调度你只需要声明我要什么剩下的交给 Kubernetes 自己判断。Kubernetes 的学习曲线很陡我不建议新团队一上来就啃全套源码或自己搭裸机集群。先用托管服务比如云厂商提供的托管集群把业务跑起来在使用的过程中学概念——什么 Deployment、Service、ConfigMap、PVC、HPA等你被真实问题逼着一个个去查的时候反而学得比看十遍文档都快。自己搭裸机集群如果没有专门的 SRE 团队光处理证书过期、etcd 备份、控制面高可用这些问题就会占掉你大半精力严重偏离业务的初衷。3.4 DevOps与CI/CD打通开发到上线的隔阂DevOps 这个词发展到现在已经有点被扭曲了。很多人觉得公司有个运维开发岗位写了点自动化脚本然后让运维去学会写代码就叫 DevOps 了。其实 DevOps 的本质是打破开发和运维之间的组织壁垒让一个团队对自己开发的软件从代码提交到生产运行的全生命周期负责——也就是常说的谁构建谁运行。它落到实践上最主要的抓手是 CI/CD持续集成、持续交付/部署。持续集成保证每次代码合并都自动触发构建和单测尽早暴露问题持续交付让代码随时处于可以发布的就绪状态持续部署更进一步让自动化发布成为常态。理想情况下一次全自动化的部署流水线包括开发代码 push → 触发镜像构建 → 跑单元测试和静态扫描 → 生成镜像并推送到仓库 → 部署到测试环境 → 跑集成测试 → 部署到预发环境 → 等待人工确认 → 灰度发布到生产。比较项目最实用的建议是流水线要先把自动化构建和自动化测试做扎实再追求自动化部署。我见过很多团队CI 那边倒是挺自动化但 CD 永远停留在构建产物自动产出、部署方式还是手工操作的阶段结果每次上线还得凌晨熬夜一堆人盯着流程既慢又脆弱。好的做法是尽早引入灰度发布、金丝雀发布、一键回滚让发布这个动作变成低风险、高频率的日常行为而不是一个月一两次的高危仪式。3.5 服务网格流量治理的下沉服务网格Service Mesh是云原生技术栈里概念性最强、落地成本也相对较高的部分。它在微服务之上加了一层专门处理服务间通信的基础设施层——通过 Sidecar 代理接管服务间的网络流量把重试、超时、熔断、限流、灰度路由、故障注入这些原本写死在业务代码里的功能全部下沉到代理层。我理解服务网格的方式是把它类比成快递业务中的物流网络。你作为商家只需要把包裹交给快递公司快递公司负责路由、分拣、配送、异常件处理商家完全感知不到物流网络内部的复杂运作。同理服务网格之于微服务就是一张内置了各种分布式通信最佳实践的物流网络。业务代码只需要关心调用某个服务这个语义剩下的可靠性和流量治理策略由代理层透明完成。但客观讲服务网格的落地门槛不小每个业务 Pod 要注入一个 Envoy 代理额外占用 CPU 和内存数据面组件和安全证书管理需要专门的团队投入遇到问题的时候排查链路会比直连方式复杂不少。小团队、服务数量几十个以内的场景我的建议是暂时可以不上服务网格用成熟的微服务框架比如 Spring Cloud、Dubbo自带的治理能力就够了。等团队规模变大、异构技术增多的时候再往网格迁移也不迟。3.6 可观测性从三根支柱到全栈采集云原生架构高度分布、高度动态一个请求可能会经过几十个微服务实例随时在创建销毁。在这种环境下传统的登录服务器看日志手段基本失灵了。可观测性的落地成为云原生时代必须具备的基础能力。做可观测性不要只想到日志这一件事。业界普遍认可的体系是三根支柱指标Metrics、日志Logs、链路追踪Traces。指标回答系统现在健康吗比如 QPS、错误率、CPU 利用率日志回答到底发生了什么具体到某一行错误输出的上下文链路追踪回答一次完整请求经过了哪些服务、每一跳花了多长时间把分布式调用串起来。这三者缺一不可而且它们的背后都需要一套统一的、标准化的采集方案。大多数云原生团队的常用路径是Prometheus 采集指标Grafana 做可视化面板ELK 或 Loki 处理日志Jaeger 或 SkyWalking 做链路追踪。如果预算和精力有限也可以先用一款全家桶式的可观测平台如云厂商的 APM 服务撑起全局再逐步补齐短板。我的经验是可观测性必须在微服务拆分的同一天开始建甚至应该提前部署好。等服务拆了一半再补监控你会发现大量历史数据是断档的想复盘故障都无从下手。4. CNCF全景图怎么读非技术管理者也能看懂的分类法4.1 全景图分层的逻辑提到云原生大家一定会看到那张巨大的 CNCF Cloud Native Landscape 全景图密密麻麻几百个 logologo 底下还套着 logo第一眼看过去非常劝退。但这张图其实是有清晰分类逻辑的你可以从下往上来理解它。最底层是基础设施层也就是支撑云原生运行的最基础资源——计算、存储、网络包括各种云平台。往上一层是运行时层容器运行时比如 containerd、存储、网络插件。再往上是编排管理层核心就是 Kubernetes它负责对这些运行时进行统一调度和管理。再往上是应用层包含数据库、消息队列、可观测性、安全等支撑应用运行的服务。图的左侧还有一条竖栏是 CI/CD 和平台工程相关的工具链。如果你不是技术专家读图时只需抓住一条主脉络云原生全景图无非描述的是在云上开发、交付和运维应用这个完整生命周期所需要的一切工具。从你的代码写到仓库开始到构建成容器镜像到部署到集群到流量调度到监控告警到日志排查到保障安全合规——每一个环节这幅图里都有对应的若干工具。4.2 哪些项目值得关注哪些只是生态繁荣CNCF 全景图上的项目多到令人发指但绝大多数团队用到的只是其中的一小部分。如果你不是专门做云原生基础设施研发的人我建议你从这几个项目开始Kubernetes毋庸置疑的核心整个云原生编排的底座。Prometheus监控指标采集的事实标准几乎任何一套云原生监控体系都建立在它之上。Envoy高性能的代理服务网格数据面的主力也可用于边缘网关。containerd容器运行时的主流实现一定意义上是 Docker 的底层。HelmKubernetes 的包管理工具用来打包和部署复杂应用。Argo 系列Argo CD、Argo WorkflowsGitOps 和 CI/CD 领域最热门的项目之一。至于那些网关、网络插件、存储插件、策略引擎项目如果你刚刚入门看一眼名字就行千万别陷入每个都要搞懂的焦虑中。全景图的真正价值是让你在需要解决某个具体问题时知道自己该去哪个分类下搜索而不是逼你把它全部读完。5. 实战视角从0到1建设云原生平台时我建议的落地顺序5.1 第一阶段先把交付链路容器化我对所有想要落地云原生团队的第一个建议都是别急着动微服务和 Kubernetes先把交付链路容器化跑通。这个阶段的目标很简单——让你团队开发出的每一个应用都能自动化地构建成一个容器镜像。具体要做的事包括统一基础镜像把 JDK / Python / Node 等运行时固定在特定版本上避免每个团队各自为政搭建镜像仓库并建立命名空间和镜像清理策略改造应用的配置管理方式把环境相关的配置从代码里剥离开统一放到配置中心或者环境变量里这样镜像才是真正一处构建、处处运行的。这个阶段做完你的团队至少已经体会到了环境一致性带来的巨大爽感以前开发环境好好的、测试环境必炸的魔咒破除了新同事入职拉个镜像就能把整套开发环境跑起来不用再对着几千字的部署文档折腾一天。这是全部后续改造的地基地基不牢后面全部要返工。5.2 第二阶段在Kubernetes上稳定运行交付链路打通之后再引入 Kubernetes。我强烈建议这个阶段先做无状态应用上容器编排比如 API 服务、Web 前端、任务型 worker。这些应用不持有本地数据或者只持有可以随时丢弃的缓存数据天然适合 Kubernetes 的动态调度。这一步要注意的事情非常多。第一是资源请求requests和资源限制limits一定要认真设置。你设置得太高集群资源利用率会很惨不设置或设得太低节点一旦过载整个集群都会变得不稳定。建议先跑一段时间监控根据每个服务真实的资源使用量逐步校准。第二是要规划好日志方案容器里写的普通日志文件容器一旦销毁就找不回来了必须把日志输出到标准输出由集群侧统一采集。第三是上线前就要演练好健康检查readinessProbe / livenessProbe配置不好会直接导致流量打到未就绪的 Pod 上本该提升可用性反而引入了故障。这个阶段的验收标准很简单业务稳定性不低于在虚拟机时代并且发布效率、资源利用率有可量化的提升。如果做到了说明你的团队已经具备在 Kubernetes 上做常态化生产和运维的能力了。5.3 第三阶段服务治理与可观测性无状态应用在 Kubernetes 上跑顺了之后就可以开始做进一步的微服务治理和全栈可观测性。这一阶段的重点是把线上系统的运行状态看明白。可观测性的落地顺序我给出的方案是指标先上日志同步跟上链路追踪等有明确排查诉求后再接入。Prometheus Grafana 的指标栈先搭起来统一采集集群和应用层的关键指标建立 CPU、内存、QPS、P99 延迟、错误率的核心监控大盘。日志侧不管是用 ELK 还是 Loki先保证日志集中可搜索。链路追踪我建议放在引入微服务迁移之后再上因为追踪的价值在于跨服务排查服务还没拆开的时候上了也是空转。服务治理方面如果业务并发增长遇到瓶颈优先考虑成熟的微服务框架如 Spring Cloud Alibaba、Dubbo 等用框架内建的注册发现、配置中心、限流熔断能力。这些方案在前面提到的服务网格落地难度更低团队学习成本更小稳定性也足够。5.4 第四阶段平台工程与内部开发者平台等前面的工作都做得差不多了你会发现 Kubernetes 本身用起来还是有不少摩擦——YAML 太繁琐、环境隔离不清晰、权限管理混乱、新项目接入成本高。于是业界兴起了平台工程这个概念本质上就是把你团队积累的云原生最佳实践固化成一个内部开发者平台IDP让普通业务开发不需要太理解 Kubernetes 底层细节也能按标准流程自助完成应用的部署和运维。常见的落地方式是把 Kubernetes 封装成应用模板 配置表单开发者只需要在平台上填项目名、选技术栈、填资源要求平台自动帮他把 Deployment、Service、Ingress、HPA 等一堆 YAML 生成出来。配置管理上通过 GitOps 的方式把整个环境状态作为代码统一管理任何改动都走 Git 提交和 CI/CD 流水线谁改了什么一目了然回滚也极其简单。这个阶段还有一个常被忽视的重点资源配额与成本管理。Kubernetes 的弹性能力是一把双刃剑——用得好可以根据流量自动扩缩容大幅降低成本用得不好服务狂奔流、几个有问题的发布瞬间把整个集群资源打爆月底账单出来能吓人一跳。这也是我为什么特别想强调一定要为每个团队、每个项目设置 Namespace 级别的 ResourceQuota 和 LimitRange从机制上限制单个项目能使用的最大资源量。最近有朋友跟我抱怨他们的云原生开发环境GPU 配额已不够预冻结其实就是典型的资源规划没跟上——GPU 是昂贵且稀缺的资源如果不在组织层面做好配额管理、分配审批和回收机制早晚会面临这种资源战。6. 常见误解与真实教训6.1 误区一用了Kubernetes就是云原生这是流传最广的误解。很多人对外宣称我们已全面云原生理由就是我们所有应用都已经容器化并跑在 K8s 上了。可你进去一看应用的配置还是启动时从本地文件读的日志还是写到容器本地磁盘没有弹性伸缩策略发布还得运维人工操作数据库还部署在几台临时用虚拟机拼起来的集群里——这顶多算容器化上云离云原生差得远。判断是不是云原生我更倾向于问这几个问题应用可以随时在多个可用区之间漂移吗遇到突增流量它能自动扩容吗发布频率能不能做到每周多次故障自愈是靠平台完成的吗如果答案都是否定的那你的 Kubernetes 可能只是一个更贵的虚拟机。6.2 误区二微服务拆得越碎越好我对微服务态度的转变来自一次惨痛的线上事故。一个订单相关的链路涉及十几个微服务某次一个底层服务的慢查询拖垮了整条链路由于缺少兜底的降级策略数据库连接池被打满上游服务全部连环超时。复盘的时候我们发现如果这坨逻辑还在单体应用里一个慢查询不会蔓延出如此大的爆炸半径。微服务的一个核心矛盾是它把开发期的灵活性提升了却把运行期的复杂性和故障可能性推高了。所以每一次拆分都要像一个外科手术一样审慎评估这个模块是否真的需要独立扩展是否真的需要独立的发布节奏拆分之后团队有没有能力做服务治理和链路追踪在实际中我认为大多数中小团队的最佳实践是适度微服务——核心业务域拆成十几个服务就够了几十个上百个服务的架构没有足够的 SRE 和度量体系支撑只会成为团队的沉重负担。6.3 误区三云原生只适合互联网公司这种说法也站不住脚。传统制造业、金融、医疗、政企这些行业确实没有互联网公司那么大的弹性流量的压力但云原生的价值对它们依然成立只是侧重点不同它们更需要的是环境的标准化、发布的自动化、故障的快速恢复以及最重要的——把应用从对特定硬件和专有厂商的依赖中解放出来。IOE 时代那种由专有硬件和专有数据库构成的系统不仅成本高昂而且几乎锁死了一个企业未来架构演进的可能性。搬到云原生架构上这些企业可以获得一个统一标准的基础设施底座在上面跑的不管是新开发的微服务还是被重构过的老系统都可以被同一个平台管理、监控和运维。哪怕你没有日均百万级流量的需求能用更低的成本、更稳妥的交付方式把软件系统做好这个逻辑在哪都成立。6.4 真实教训从GPU配额不足看资源管理的重要性前文提到的 GPU 配额不足问题我想在这里展开说说因为它非常典型地反映了云原生落地中的一个深层矛盾。做 AI 或者大数据领域的团队对 GPU 的需求几乎是无止境的可是 GPU 是稀缺资源一个组织的配额总量是有限的。一旦各个团队都在抢而平台侧又没有建立清晰的分时复用和预约机制就会出现想开发的团队抢不到资源抢到的团队又不一定用满的尴尬局面。云原生平台解决这个问题有两个思路。第一是动态伸缩和共享GPU 资源池化之后不跑任务的时候可以缩容到零任务来的时候再自动调度申请提高资源利用率。第二是配额治理和透明化每个团队能申请多少 GPU、当前用了多少、还有多少可用这些信息必须透明可见审批流程要自动化同时在共享队列里按照优先级进行调度。这个过程给我的感受很深——再好的技术栈如果资源治理跟不上被卡脖子的往往不是性能而是这些看起来特别琐碎的管理机制。7. 写在最后从工具导向转向能力导向我见过很多团队在云原生落地这件事上做反了——一开始就铺很大的摊子把所有流行组件都装上Kubernetes、服务网格、可观测平台、DevOps 工具链全上一遍但业务团队用不起来最后这些组件成了新的需要运维的遗产系统。在我看来云原生更准确的定位是逐步构建起来的一组组织能力而不是一群工具的堆砌。这种能力包含让应用从构建到发布全自动化、随时随地可重复部署的能力面对突增流量时基础设施能自动伸缩、自动容错的能力在高度分布式环境下依然能快速定位问题、快速恢复的能力以及让业务团队交付新功能的速度不再被基础设施拖后腿的能力。在具体路径上我的经验是从小处着手先把一个边缘应用完整地走通容器化 Kubernetes DevOps 流水线 可观测性的全闭环。让它成为团队里的活样板让每个人直观感受到新方式带来的效率提升。然后一点点把这套模式复制到更多应用上。遇到组织或流程上的阻力是正常的但不要因此退缩你可以选择先拿一两个开发体验最痛的应用做突破口用真实的效率数据说服其他人。技术只是一部分更关键的是团队思维方式的转变。当你的团队成员开始习惯性地思考我的应用在云上应该怎么存活时你的云原生之路才算真正走对了方向。希望这篇文章能让你在迈出这条路时少一些迷茫多一份笃定。
返回列表