过去两年我一直在推动公司的云原生转型,从最开始只有几个人尝试,到现在整个技术团队都在使用云原生技术栈。这个过程中我们走了很多弯路,踩了很多坑,也积累了很多经验。本文总结了云原生普及过程中的最佳实践,包括如何制定转型策略、如何选择技术栈、如何建设团队能力、如何推进落地、如何衡量效果等方面的经验。如果你也在推动云原生转型,希望这些经验能帮你少走弯路。
一、我们的云原生转型背景
先简单介绍一下我们公司的情况和为什么要做云原生转型。
我们公司是一家中等规模的互联网公司,技术团队大约两百人。两年前我们的技术栈还是比较传统的,应用部署在物理机和虚拟机上,用的是单体架构加少量微服务,运维主要靠手动操作和脚本,发布频率低,故障恢复慢。
随着业务的发展,这种传统的技术架构越来越难以满足需求。业务迭代速度越来越快,要求我们能够快速发布快速响应。系统规模越来越大,要求我们能够弹性扩缩容应对流量波动。系统复杂度越来越高,要求我们能够更好地管理和监控系统。
在这样的背景下,我们开始考虑云原生转型。云原生的容器化、微服务、DevOps、持续交付、弹性伸缩等特性,正好能够解决我们面临的问题。
但云原生转型不是一件容易的事情。它不仅仅是技术栈的升级,更是开发流程、运维方式、组织架构、团队文化的全面变革。在转型的过程中我们遇到了很多困难和挑战,也积累了很多经验和教训。
二、制定转型策略
云原生转型的第一步是制定合适的转型策略。策略对了事半功倍,策略错了事倍功半。
1. 自上而下和自下而上结合
云原生转型需要自上而下和自下而上结合。
自上而下是指需要得到管理层的支持和认可。云原生转型需要投入资源,需要改变流程,需要跨部门协作,这些都需要管理层的支持。如果管理层不认可不支持,转型很难推进下去。
我们最开始推动云原生的时候,管理层是有疑虑的。他们担心新技术不稳定,担心转型影响业务,担心投入产出比不高。我们做了很多工作,包括技术调研、试点验证、ROI分析、风险评估,最终说服了管理层,得到了他们的支持。
自下而上是指需要得到一线开发和运维人员的认可和参与。云原生最终是要靠一线人员来落地的,如果他们不认可不参与,转型就是空中楼阁。
我们通过技术分享、培训、试点项目等方式,让一线人员了解云原生的好处,让他们参与到转型过程中来。当他们亲身体会到云原生带来的好处之后,就会主动地推动转型。
自上而下提供方向和资源,自下而上提供动力和执行,两者结合才能成功。
2. 先试点后推广
云原生转型不要一上来就全面铺开,要先试点后推广。
我们选择了一个非核心的业务系统作为试点。这个系统规模不大,影响面小,即使出了问题也不会造成太大的损失。我们用这个系统来验证云原生技术栈,摸索最佳实践,培养团队能力。
试点项目持续了三个月,我们把这个系统从传统的部署方式迁移到了Kubernetes上,实现了容器化、自动化部署、监控告警等。试点项目很成功,发布效率提升了三倍,故障恢复时间从几小时缩短到了几分钟,运维成本降低了一半。
试点项目的成功给了我们信心,也给了管理层和其他团队信心。在试点项目的基础上,我们总结了经验和最佳实践,制定了推广计划,逐步在全公司推广云原生。
先试点后推广的好处是风险可控,可以在小范围内验证技术和方法,积累经验培养人才,然后再大规模推广。这样可以避免全面铺开之后出现大面积问题,导致转型失败。
3. 制定明确的目标和里程碑
云原生转型要有明确的目标和里程碑,不能走一步看一步。
我们制定了三年转型目标:第一年完成技术栈验证和试点,培养核心团队;第二年完成核心系统迁移,推广到50%的团队;第三年完成全公司云原生转型,建立完善的云原生技术体系和文化。
每个阶段都有明确的里程碑和衡量指标。比如第一年的里程碑是完成试点项目,培养10名云原生核心工程师,建立基础的CI/CD流水线。衡量指标包括发布频率、部署时间、故障恢复时间、运维成本等。
有了明确的目标和里程碑,团队就有了方向和动力,也能够衡量转型的进展和效果。定期回顾目标达成情况,及时调整策略和计划,确保转型朝着正确的方向推进。
三、选择技术栈
云原生技术栈非常丰富,选择合适的技术栈非常重要。技术栈选得好,转型顺利;技术栈选得不好,会走很多弯路。
1. 选择成熟稳定的技术
云原生领域新技术层出不穷,但不是所有新技术都适合在生产环境使用。我们的原则是优先选择成熟稳定的技术,谨慎使用新技术。
比如容器编排我们选择了Kubernetes,这是目前最成熟最主流的容器编排平台,社区活跃,生态完善,人才储备多。我们没有选择其他比较小众的编排平台,虽然那些平台可能在某些方面有优势,但成熟度和生态都不如Kubernetes。
容器运行时我们选择了Docker,虽然后来出现了containerd、CRI-O等新的运行时,但Docker最成熟最稳定,团队也最熟悉。等新技术成熟稳定之后再考虑迁移。
服务网格我们没有一开始就上。服务网格是云原生的新兴技术,功能很强大,但复杂度也很高,而且在2020年的时候还不算非常成熟。我们先在小规模试点,等技术成熟团队能力跟上之后再考虑大规模使用。
选择成熟稳定的技术可以降低风险,减少踩坑。新技术可以关注和试点,但不要急于在生产环境大规模使用。
2. 避免过度设计
云原生技术栈很丰富,很容易陷入过度设计的陷阱。什么技术都想上,什么功能都想要,结果系统变得非常复杂,维护成本很高,团队也吃不消。
我们的原则是按需使用,够用就好。先把最核心最基础的功能做好,再根据实际需求逐步增加新的技术和功能。
比如最开始我们只做了容器化和自动化部署,这是云原生最基础的功能。等这些做好了团队熟悉了,再逐步增加服务发现、配置中心、监控告警、日志收集等功能。微服务也是先从简单的拆分开始,等团队具备了微服务的能力之后再做更复杂的拆分。
避免过度设计可以降低系统复杂度,降低维护成本,让团队能够循序渐进地掌握云原生技术。不要为了技术而技术,技术是为业务服务的,要根据业务需求来选择技术。
3. 建立技术标准和规范
云原生技术栈复杂,如果没有统一的标准和规范,各个团队各自为政,技术选型混乱,最终会导致系统难以维护,知识无法共享。
我们建立了统一的技术标准和规范。包括容器镜像规范、Kubernetes部署规范、CI/CD流程规范、监控告警规范、日志规范、安全规范等。所有团队都必须遵循这些标准和规范。
比如容器镜像规范规定了基础镜像的选择、镜像的构建方式、镜像的大小限制、镜像的安全扫描等。Kubernetes部署规范规定了Pod的资源限制、健康检查、优雅终止、配置管理等。CI/CD流程规范规定了代码提交、构建、测试、部署的标准流程。
建立标准和规范的好处是显而易见的。系统一致性好,维护成本低,知识可以共享,人员可以流动。新团队上手快,不需要从零开始摸索。出了问题排查也更容易,因为大家都是按照统一的标准来做的。
当然标准和规范不是一成不变的,要根据实践经验不断更新和完善。我们定期回顾标准和规范的执行情况,根据实际情况进行调整。
四、建设团队能力
云原生转型最大的挑战不是技术,而是人。技术可以买可以学,但人的能力和思维方式的转变需要时间。建设团队能力是云原生转型的关键。
1. 培训和知识分享
云原生是一个全新的技术领域,大部分开发和运维人员都没有相关经验。必须通过系统的培训和知识分享来提升团队的能力。
我们建立了完善的培训体系。包括入门培训、进阶培训、专项培训等。入门培训面向所有技术人员,介绍云原生的基本概念和技术栈。进阶培训面向有一定基础的人员,深入讲解Kubernetes、微服务、DevOps等技术。专项培训针对特定的技术领域,比如服务网格、可观测性、安全等。
我们还建立了知识分享机制。每周组织一次技术分享,由团队成员分享自己在云原生实践中的经验和心得。每月组织一次技术沙龙,邀请外部专家来分享。建立了内部的知识库和文档库,把实践经验和最佳实践沉淀下来供大家学习。
培训和知识分享是一个长期的过程,不能指望一两次培训就能让团队掌握云原生。要持续投入,不断提升团队的能力。
2. 建立核心团队
云原生转型需要建立一个核心团队,作为转型的推动者和技术支持者。
我们从各个团队选拔了一批对新技术感兴趣、学习能力强的工程师,组成了云原生核心团队。这个团队负责云原生技术的研究和验证,制定技术标准和规范,提供技术支持和咨询,推动云原生在各个团队的落地。
核心团队是云原生转型的中坚力量。他们是技术专家,能够解决复杂的技术问题。他们是布道师,能够传播云原生的理念和知识。他们是推动者,能够帮助各个团队解决落地过程中的问题。
核心团队的成员不是固定的,而是流动的。核心团队的成员会到各个业务团队去实践,把云原生技术带到业务团队中。业务团队的骨干也会加入核心团队,学习云原生技术之后再回到业务团队推动落地。这种流动机制可以让云原生的知识和能力在整个组织中传播。
3. 转变思维方式
云原生转型不仅是技术能力的提升,更是思维方式的转变。
传统的思维方式是,开发负责写代码,运维负责部署和运行,两者是分离的。开发写完代码就交给运维,出了问题运维先处理,处理不了再找开发。这种模式下开发不关心生产环境的运行情况,运维不了解代码的内部逻辑,出了问题互相推诿。
云原生的思维方式是DevOps,开发和运维一体化。开发不仅要写代码,还要关心代码在生产环境的运行情况,参与部署和运维。运维不仅要维护系统,还要参与开发过程,提供自动化工具和平台。开发和运维共同对系统的交付和运行负责。
这种思维方式的转变是很难的,需要时间和实践。我们通过机制设计来推动这种转变。比如让开发团队负责自己系统的部署和运维,出了问题开发团队自己处理。建立On-Call机制,开发人员也要值班处理生产问题。把系统的可用性和发布频率纳入开发团队的绩效考核。
思维方式转变了,云原生转型才能真正成功。否则即使技术栈升级了,人的思维方式没变,还是老一套做法,转型就会流于形式。
五、推进落地
制定了策略选好了技术培养了人之后,最重要的就是推进落地。落地是云原生转型最关键也最困难的环节。
1. 提供平台和工具,降低使用门槛
要让各个团队愿意使用云原生,就要降低使用门槛。如果每个团队都要自己从零开始搭建Kubernetes集群、搭建CI/CD流水线、搭建监控系统,那使用门槛就太高了,很多团队会望而却步。
我们建设了统一的云原生平台,把底层的基础设施和通用工具都封装好,各个团队只需要专注于业务开发。平台提供了容器服务、CI/CD服务、监控告警服务、日志服务、配置管理服务、服务发现服务等。团队只需要按照规范把应用容器化,然后通过平台部署上去就行了,不需要关心底层的实现细节。
我们还提供了丰富的工具和脚手架。比如应用初始化脚手架,一键生成符合规范的应用骨架。部署工具,一键部署应用到Kubernetes。监控工具,自动接入监控告警。这些工具大大降低了云原生的使用门槛,让团队能够快速上手。
平台和工具的建设是一个持续的过程。我们根据团队的反馈不断完善平台功能,优化用户体验,让平台越来越好用。
2. 建立迁移方法论,指导团队迁移
把现有的应用从传统部署方式迁移到云原生平台上,是云原生落地的重要工作。迁移不是简单地把应用打包成容器部署到Kubernetes上就行了,还需要做很多改造工作。
我们总结了一套应用迁移的方法论,指导各个团队进行迁移。方法论包括迁移评估、应用改造、容器化、部署配置、测试验证、灰度发布、全量迁移等步骤。每个步骤都有详细的操作指南和检查清单。
迁移评估阶段评估应用的复杂度、迁移难度、风险和收益,制定迁移计划。应用改造阶段对应用进行云原生改造,比如配置外置、无状态化、健康检查接口、优雅终止等。容器化阶段编写Dockerfile,构建容器镜像。部署配置阶段编写Kubernetes部署配置,设置资源限制、健康检查、自动扩缩容等。测试验证阶段在测试环境验证应用的功能和性能。灰度发布阶段先切一部分流量到新的部署,验证没问题之后再全量迁移。
有了这套方法论,各个团队在迁移的时候就有章可循,不需要从零开始摸索。迁移的效率和质量都大大提高了。
3. 建立支持机制,帮助团队解决问题
在云原生落地的过程中,各个团队肯定会遇到各种各样的问题。如果问题得不到及时解决,团队就会失去信心,转型就会受阻。
我们建立了完善的支持机制。核心团队提供技术支持,各个团队遇到问题可以随时咨询。我们建立了支持工单系统,团队提交问题之后核心团队会在规定时间内响应和解决。我们还建立了即时通讯群,团队可以在群里提问,核心团队成员和其他有经验的成员都会帮忙解答。
对于重点团队和重点项目,我们还会派驻核心团队成员现场支持。核心团队成员加入到业务团队中,和业务团队一起工作,帮助他们解决迁移过程中的问题,指导他们按照最佳实践来做。等业务团队具备了独立操作的能力之后,核心团队成员再撤出。
这种支持机制非常重要。它让各个团队在遇到问题的时候知道找谁,知道问题能够得到解决,从而有信心继续推进云原生转型。
4. 建立激励机制,鼓励团队积极转型
云原生转型会给团队带来额外的工作量,学习新技术、改造应用、迁移系统,这些都需要投入时间和精力。如果没有适当的激励,团队可能会缺乏动力,甚至会抵触转型。
我们建立了激励机制来鼓励团队积极转型。把云原生转型的进展和成果纳入团队的绩效考核,对转型做得好的团队给予奖励。设立云原生专项奖金,对在云原生实践中有突出贡献的个人和团队给予物质奖励。组织云原生技能认证,通过认证的工程师在晋升和调薪时给予优先考虑。
我们还注重非物质激励。对转型做得好的团队和个人进行公开表彰,分享他们的经验和成果,让他们获得成就感和荣誉感。给核心团队成员更多的成长机会,比如参加技术大会、外出培训、承担更重要的项目等。
激励机制让团队有动力积极参与云原生转型,而不是被动地接受。当团队从转型中获得了实实在在的好处之后,就会从"要我转"变成"我要转"。
六、衡量效果
云原生转型的效果需要量化衡量,不能凭感觉说成功了或者失败了。建立合理的衡量指标体系,定期评估转型效果,及时发现问题调整策略。
1. 交付效率指标
交付效率是云原生转型最重要的衡量指标之一。云原生的核心目标之一就是提升交付效率,让业务能够快速迭代快速响应市场变化。
我们衡量交付效率的指标包括:
- 发布频率:单位时间内的发布次数。云原生转型后发布频率应该显著提升
- 部署时间:从代码提交到上线的时间。云原生转型后部署时间应该大幅缩短
- 变更前置时间:从需求提出到上线的时间。云原生转型后前置时间应该缩短
- 发布失败率:发布失败的比例。云原生转型后发布失败率应该降低
- 变更恢复时间:出了问题之后恢复的时间。云原生转型后恢复时间应该大幅缩短
这些指标参考了DevOps的DORA指标,是衡量交付效率的行业标准。我们定期统计这些指标,和转型前对比,和行业基准对比,评估转型的效果。
2. 系统稳定性指标
云原生转型不仅要提升交付效率,还要保证系统稳定性。不能为了追求快速发布而牺牲系统稳定性。
我们衡量系统稳定性的指标包括:
- 系统可用性:系统正常运行的时间比例。云原生转型后可用性应该提升或者至少不降低
- 故障次数:单位时间内的故障次数。云原生转型后故障次数应该减少
- 故障影响范围:故障影响的用户数和业务量。云原生转型后故障影响范围应该缩小
- 平均恢复时间:从故障发生到恢复的平均时间。云原生转型后恢复时间应该缩短
- 告警准确率:告警的准确程度,误报率应该降低
这些指标可以全面衡量系统的稳定性。云原生的弹性伸缩、自愈能力、灰度发布等特性,应该能够提升系统稳定性。
3. 成本指标
云原生转型需要投入成本,但长期来看应该能够降低总体成本。成本指标也是衡量转型效果的重要方面。
我们衡量成本的指标包括:
- 基础设施成本:服务器、存储、网络等基础设施的费用。云原生的资源利用率提升应该能够降低基础设施成本
- 运维成本:运维人员的人力成本。云原生的自动化应该能够降低运维成本
- 故障成本:故障造成的业务损失。云原生提升系统稳定性应该能够降低故障成本
- 转型投入成本:转型过程中的人力、培训、工具等投入。需要和转型带来的收益对比
成本分析要全面,不能只看基础设施成本的降低,还要考虑转型的投入成本和长期收益。云原生转型的ROI分析是管理层非常关心的。
4. 团队能力指标
云原生转型的一个重要成果是团队能力的提升。团队能力虽然不像交付效率和成本那样容易量化,但也需要衡量。
我们衡量团队能力的指标包括:
- 云原生技能认证人数:通过云原生技能认证的工程师数量
- 培训覆盖率:接受过云原生培训的工程师比例
- 自主运维能力:能够独立完成应用部署、监控、故障排查的团队比例
- 最佳实践采纳率:采纳云原生最佳实践的团队和应用比例
- 技术分享次数:团队内部和跨团队的技术分享次数
这些指标可以从侧面反映团队云原生能力的提升情况。团队能力提升了,云原生转型才算真正成功,因为技术可以迁移,但能力是自己的。
七、踩过的坑和教训
在云原生转型的过程中我们踩了很多坑,也得到了很多教训。在这里分享几个比较典型的。
1. 不要为了微服务而微服务
我们最开始推进云原生的时候,有一个误区就是觉得云原生就是微服务,所有应用都要拆成微服务。结果有一个团队把一个本来运行得很好的单体应用强行拆成了十几个微服务,拆完之后问题百出。服务之间调用复杂,分布式事务难处理,部署和运维成本大增,团队根本hold不住。
后来我们叫停了这种盲目拆分,让那个团队把服务重新合并,回到了单体加少量服务的架构。这个教训让我们认识到,微服务不是云原生的必要条件,单体应用也可以容器化部署在Kubernetes上,也可以享受云原生带来的好处。微服务拆分要根据业务需求和团队能力来决定,不能为了微服务而微服务。
2. 不要忽视安全
云原生转型初期我们把主要精力放在了功能和效率上,忽视了安全。结果有一次出现了安全事件,一个容器镜像里有高危漏洞,被攻击者利用入侵了系统。虽然及时发现和处理了没有造成太大损失,但给我们敲响了警钟。
从那以后我们把安全纳入了云原生转型的重要内容。建立了容器镜像安全扫描机制,所有镜像构建之后都要自动扫描,有高危漏洞的镜像不能部署。建立了Kubernetes安全基线,限制容器的权限,启用网络策略,加强访问控制。建立了密钥管理机制,密钥不硬编码在代码和镜像里,通过专门的密钥管理服务管理。
安全是云原生不可忽视的方面。容器和Kubernetes虽然提供了一定的隔离能力,但如果配置不当也会有安全风险。必须从一开始就把安全考虑进去,不能等出了问题再补救。
3. 不要低估迁移的复杂度
我们最开始估计应用迁移的工作量的时候太乐观了,以为把应用打包成容器部署到Kubernetes上就行了。结果实际迁移的时候发现复杂度远超预期。很多老应用有各种各样的问题,比如配置硬编码、依赖本地文件系统、状态保存在本地、启动脚本复杂、依赖特定的操作系统环境等。改造这些应用需要大量的工作。
有一个老应用我们原计划两周迁移完成,结果实际花了两个月。因为这个应用依赖很多老的库和组件,容器化之后各种兼容性问题,改了很多代码才跑起来。
这个教训让我们认识到,应用迁移的复杂度不能低估。迁移之前要做好充分的评估,了解应用的依赖和特性,制定详细的迁移计划。对于特别复杂的老应用,可能需要先做应用现代化改造,再进行容器化迁移,或者暂时不迁移,继续运行在传统环境中。
4. 不要忽视可观测性
云原生环境下系统变得更加分布式更加动态,传统的监控方式难以满足需求。我们最开始迁移了一批应用到Kubernetes上之后,发现出了问题很难排查。容器是动态创建和销毁的,IP地址经常变化,传统的基于主机的监控方式不好用了。日志分散在各个容器里,出了问题不知道看哪个容器的日志。服务之间调用关系复杂,出了问题不知道是哪个服务的问题。
后来我们花了很大力气建设可观测性体系。建立了统一的监控系统,基于Prometheus和Grafana,监控容器、服务、业务各个层面的指标。建立了统一的日志系统,基于ELK,收集所有容器的日志,支持全文检索和关联分析。建立了分布式链路追踪系统,基于Jaeger,追踪请求在各个服务之间的调用链路和耗时。
可观测性是云原生的基础。没有完善的可观测性,系统就是黑盒,出了问题根本无法排查。必须在迁移应用的同时同步建设可观测性体系,不能等出了问题再补。
八、写在最后
云原生转型是一个长期的系统工程,不是一蹴而就的。它涉及技术、流程、组织、文化等方方面面,需要持续投入不断推进。
回顾我们这两年的云原生转型历程,有成功的经验也有失败的教训。总结起来最重要的几点是:制定合适的转型策略,自上而下和自下而上结合,先试点后推广;选择成熟稳定的技术,避免过度设计,建立统一的标准和规范;重视团队能力建设,培训和知识分享,建立核心团队,转变思维方式;建设平台和工具降低使用门槛,建立迁移方法论指导团队迁移,建立支持和激励机制推动落地;建立衡量指标体系,量化评估转型效果;避免常见的坑,不要为了微服务而微服务,不要忽视安全和可观测性,不要低估迁移复杂度。
云原生技术还在快速发展中,新的技术和工具不断涌现。我们的云原生转型也还在继续,还有很多工作要做。但只要方向正确方法得当,持续投入不断改进,就一定能够取得成功。
如果你也在推动云原生转型,希望我们的经验和教训能够给你一些参考,帮你少走弯路。也欢迎你分享你的经验和心得,大家一起交流一起进步。
最后用一句话结束本文:"云原生不是终点,而是一种持续演进的理念和实践。转型的路上没有捷径,只有脚踏实地一步步往前走。"愿每一个正在推进云原生转型的团队,都能找到适合自己的道路,取得成功。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录