近年来,云原生的热度与2014年的3D打印和2018年的区块链不相上下,令人感到似曾相识。因此,我想借此机会探讨一下云原生的概念。由于该概念尚未被明确界定,我的理解可能不够全面,如有不足之处,恳请大家指正。
云原生(CloudNative)的英文名可以拆解为“Cloud”和“Native”两个词:前者意指云,表明应用程序运行在云端,而非传统的数据中心或服务器;后者则意味着原生、土生土长,表示应用程序是专门为云环境设计的。因此,云原生的汉语名称选择了一个优美的词汇,而不是简单的“云土著”或“云当地”。
云原生是一种构建和运行应用程序的技术体系和方法论。这种体系在设计之初就充分考虑了云环境的特点,利用云平台的弹性和分布式优势。华为对符合云原生架构的应用程序进行了描述:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法和DevOps实现持续迭代与运维自动化,利用云平台设施实现弹性伸缩、动态调度和资源优化。

从华为的描述中,可以提炼出云原生的四个核心要素:容器化、微服务、DevOps和持续交付。这四个要素得到了广泛认可,也是Pivotal所总结的主要内容。不同的云计算供应商在这四个要素的基础上有着各自的延展与理解。
2013年,Pivotal公司的Matt Stine首次提出了云原生(CloudNative)这一概念。
2015年,《迁移到云原生架构》一书定义了云原生架构的特征:12因素、微服务、自敏捷架构、基于API的协作以及对脆弱性的承受能力。
同年,云原生计算基金会(CNCF)成立,并将云计算定义为容器化封装、自动化管理和面向微服务的结合。
2017年,Matt Stine将云原生架构的特性归纳为模块化、可观察性、可部署性、可测试性、可替换性和可处理性六大特征。
当时,Pivotal将云原生概括为DevOps、持续交付、微服务和容器的结合。
2018年,CNCF也更新了云原生的定义,加入了服务网格(Service Mesh)和声明式API的概念。
回顾云原生的发展历程,可以看到其定义逐步完善,尽管在概念上仍存在混乱和不统一的情况。目前,大多数云计算企业仍然习惯用DevOps、持续交付、微服务和容器来定义云原生。接下来,让我们简要理解一下这四个主要要素。
1、微服务
微服务是可以独立发布的应用服务,能够作为单独的组件进行升级、灰度发布或重用。每个服务可以由专门的团队独立完成,依赖方只需明确输入和输出接口即可进行开发,团队结构也因此更为精简,沟通成本低、效率高。
2、DevOps
DevOps是开发(Dev)与运维(Ops)的结合,实际上是一个涵盖过程、方法与系统的统称。DevOps强调团队之间通过自动化工具的协作与沟通,来高效管理软件生命周期,从而更快、更频繁地交付稳定的软件。

3、持续交付
敏捷开发要求持续交付,因为敏捷开发需要时刻有一个新版本可以上线,因此需要支持频繁发布。持续交付旨在快速响应客户需求的变化,通常会出现多个版本同时提供服务的情况,因此需要支持灰度发布和金丝雀发布等方式。
4、容器化
Docker是当今软件行业中最受欢迎的容器项目,它实现了应用的隔离,将微服务及其所有配置、依赖关系和环境变量迁移到一个新的、无差别的运行环境中,从而具备良好的移植性。然而,Docker未能在分布式应用的部署和编排方面给出最佳解决方案,包括网络和存储的处理。
进一步探讨云原生与本地部署的区别:
1、编程语言
传统的本地部署应用通常使用C/C++或企业级Java编写,而云原生应用则倾向于使用以网络为中心的新兴语言,如Go和Node.js。
2、持续交付
传统的本地部署应用需要停机进行更新;而云原生应用则需保持最新状态,支持频繁变更和持续交付,通常采用蓝绿部署策略。
3、动态扩展
传统的本地部署应用无法动态扩展,往往需要冗余资源以应对流量高峰,而云原生应用则可利用云的弹性实现自动伸缩,从而优化成本和效率。
4、网络限制
传统本地部署应用对网络资源(如IP和端口)存在依赖,甚至硬编码;而云原生应用对网络和存储没有此类限制。
5、自动化
传统的本地部署应用通常需要手动部署和运维,而云原生应用则实现了全自动化。
6、移植性
传统的本地部署应用通常依赖特定的系统环境,而云原生应用则不与任何具体系统环境硬连接,而是依赖抽象的基础设施,从而实现良好的移植性。
7、服务架构
传统应用通常是单体(巨石)结构或有强依赖关系,而云原生应用则基于微服务架构,服务模块化设计更为合理。
