云原生(Cloud Native)是近几年云计算领域炙手可热的话题,大家都在讨论和实践云原生,但是大部分人对云原生的认识还处于混沌状态,就是无法准确的说出来什么才是云原生,不是因为我们语言的表达能力的限制,而是他有很多种定义来表达,但都差强人意,大家都在描述和定义他,导致全球很多大厂也对云原生有着不同的定义,我起初怀疑我们都像是盲人摸象,没有人准确的看到全貌,或者是需要一个上帝视角才可以准确的说出云原生的定义,包括我自己也对云原生的准确定义在不断地探索,直到我看到了一个云原生非常准确的定义。原来不是因为语言限制我们无法准确表达描述一个事物,而是因为我们语言底层的逻辑与思考抽象能力不够深邃,才有各种各样的描述,因为你没有触摸到底层,事物最底层的逻辑其实才是真实唯一在运作的逻辑。
我们来看下到底什么是云原生:
云原生概念起初由 Pivotal 公司的 Matt Stine 于 2013 年提出,经过多次更新,目前被定义为包括容器化、自动化管理、面向微服务、服务网格和声明式 API,到2015年国际云原生计算基金会CNCF成立,并对云原生的定义进行了多次更新,最新定义为 DevOps 持续交付 微服务 容器。
CNCF官方定义:
云原生技术使组织能够在新式动态环境(如公有云、私有云和混合云)中构建和运行可缩放的应用程序。 容器、服务网格、微服务、不可变基础结构和声明性 API 便是此方法的范例。
Amazon的定义:
云原生一词是指从一开始就设计为驻留在云中的应用程序。 云原生涉及云技术,例如微服务、容器编排工具和自动扩缩。 支持云的应用程序不具备云原生应用程序的灵活性、弹性或可扩展性。
Oracle的定义:
云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。
从各个大厂以及官方的概念定义中看,偏向描述性定义,大部分人都还是会觉得云里雾里,用户只要这样构建或者是使用了这样的技术就应该是云原生架构,其实这样说也没有错,但是还是没有触及云原生的核心,大部分人明白做云原生的目的,云原生本身是需要巨大的前期投入的,在投入产出比面前,一定是经过全面思考收益会大于投入才会去做。
结合前面各个厂商对云原生的定义,我们在从云原生(CloudNative)的组合词上来看,Cloud表示应用程序位于云中,应用是云化部署,私有云共有云都可;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台PaaS服务的弹性与分布式优势。
结合前面定义描述不断深入剖析,到目前为止最接近云原生本质的定义描述:
云原生架构是基于云原生技术的一组架构原则和设计模式的集合,旨在将云应用中的非业务代 码部分进行最大化地剥离,从而让云设施接管应用中原有的大量非功能特性(如弹性、韧性、安全、 可观测性、灰度等),使业务不再有非功能性业务中断困扰的同时,具备轻量、敏捷、高度自动化 的特点。
上面这一段话将云原生的形式,标准,目的,特性全部准确的交代清楚了。下面我们一起看下云原生中关键的技术、应用特点、以及构建原则。
基于云原生架构的主要技术包括:
1.微服务 传统的大的单体应用拆分为更小的组件或者模块,这个组件或者模块就叫微服务。拆分为纵向拆分,从底层的 IT 基础设施到数据库,到应用中间件,再到软件程序部署包都能做到完全独立,可以单独的进行需求设计、开发、打包和部署,实现各个微服务之间一个彻底的松耦合。
2.DevOps DevOps 是一组过程、方法与系统的统称,可以理解为持续集成和持续交付,将软件生命周期过程中的需求分析到程序设计、开发、编译、构建、打包和部署,从测试环境到生产环境整个过程实现全部的自动化。
3.容器云 容器本身是一个比虚拟机更轻量化的资源隔离单位。可以更好的打包部署调度应用。应用创建、销毁、调度的速度也比传统虚拟机快。实现应用的快速弹性伸缩和高可用。
基于云原生架构的应用特点包括:
1.代码结构发生巨大变化:不再需要掌握文件及其分布式处理技术,不再需要掌握各种复 杂的网络技术,简化让业务开发变得更敏捷、更快速。
2.非功能性特性大量委托给云原生架构来解决:比如高可用能力、容灾能力、安全特性、 可运维性、易用性、可测试性、灰度发布能力等。
(3)高度自动化的软件交付:基于云原生的自动化软件交付可以把应用自动部署到成千上万 的节点上。
3.云原生的原则 云原生具有以下原则:
(1)服务化原则:通过服务化架构把不同生命周期的模块分离出来,分别进行业务迭代。
(2)弹性原则:弹性是指系统的部署规模可以随着业务量的变化而自动伸缩。
(3)可观测原则:通过日志、链路跟踪和度量等手段,使得多次服务调用的耗时、返回值和 参数都清晰可见。
(4)韧性原则:软件所依赖的软硬件组件出现各种异常时,软件表现出来的抵御能力。
(5)所有过程自动化原则:让自动化工具理解交付目标和环境差异,实现整个软件交付和运 维的自动化。
(6)零信任原则:不应该信任网络内部和外部的任何人/设备/系统,需要基于认证和授权重 云原生架构设计理论与实践