Vis/skjul meny Yingchi Blog

Cloud Native 云原生 | 概念解读

定义的探索之路

都在提「云原生」的概念,但是真正理解这个概念的又有多少人呢?每次浏览一些社区的时候(不乏一些专业的技术社区),看到有些朋友在讨论云原生相关的话题,有些时候总感觉他们对于云原生的理解还是有那么一点问题。

很多朋友直接就认为部署在云端的应用就叫做云原生应用,一般出现在刚接触云计算与云原生概念的群体中,这个明显是错误的认识,或者说就是「概念滥用」,再有就是懂一些容器化相关概念的内行人士,他们认为,云原生应用是通过容器技术构建,部署在 Kubernetes 这种容器编排平台上的,才能是云原生应用,这听起来像那么回事了,但是呢,还是不够严谨,只是从云原生应用的实现层面来讲的,但是对于其核心概念还是没解释,比如 Cloud Native 的 Native 具体体现在什么上?

其实也不能怪大家伙没搞明白啥是云原生,其实就连最早发起云原生概念的这群人自己也是在逐渐摸索。

来看 CNCF 最初对云原生的定义:

The CNCF defines “cloud-native” a little more narrowly, to mean using open source software stack to be containerized, where each part of the app is packaged in its own container, dynamically orchestrated so each part is actively scheduled and managed to optimize resource utilization, and microservices-oriented to increase the overall agility and maintainability of applications.

简而言之,云原生的最初定义就是,满足以下特性的应用:

  • 采用容器化技术构建;
  • 动态编排调度;
  • 面向微服务;

明显,这是一个比较狭义的定义,其实说白了就是讲了一个容器生态技术,还称不上真正的云原生。

然后,到了2017年, 云原生应用的提出者之一的 Pivotal 在其官网上将云原生的定义概况为DevOps持续交付微服务容器这四大特征,这也成了很多人对 Cloud Native 的基础印象。

2018年6月11日,CNCF 给出了 Cloud Native 的明确定义,大家可以参考 Github,CNCF Cloud Native Definition v1.0,这个定义也成了如今大家最为熟悉的定义,英文原文如下:

Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.

These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.

The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.

中文版本的翻译:

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

这个定义简单来说包含这几个要点:

  • 基于容器、服务网格、微服务、不可变基础设施和声明式 API 等技术构建的可弹性扩展的云环境应用;
  • 高容错性、易管理和易观察的松耦合系统;
  • 云原生基于开源的生态系统,与云厂商提供的服务保持中立,

注意里面有个很重要的概念,叫做不可变基础设施,这个看起来让人一头雾水的概念,其实很简单。Immutable Infrastructure 直译过来就是「不可变基础设施」。不可变基础设施里的「不可变」非常类似于程序设计中的不可变变量(Immutable Variable)概念,就是在完成赋值后就不能发生更改,比如 Go 语言中的 string,你不要想着通过”+“在原有的 string 上进行拼接,不可变变量本身是不可以更改的,拼接后的字符串其实是一个新的字符串变量,而不是基于旧字符串的更改,具有这样的特性这种变量可以在并发环境下安全的使用。对于基础设施的不可变性,最基本的就是指运行服务的服务器在完成部署后,就不在进行更改。说白了,就是如果想要更改旧的组件,唯一的方式就是通过新的资源代替它,而不是在原有组件上修改,这就是所谓的不可变基础设施。

Cloud Native 的重新解读

官方定义虽然就写在这里了,但是我觉得还应该有更进一步的分析来让大家理解,所以,结合前面官方的定义,我们现在重新再来认识云原生这个概念。回到 Cloud Native 这个词组,我们拆解开来看:

Cloud

很好理解,云,就是指的云计算环境,这是最基本的条件,按照官方的定义,应该是公有云、私有云和混合云等新型动态环境,也就是说,云原生的概念不会限定你基于哪一种具体的云环境,在几乎任意一种云环境下,都不影响云原生应用标准实现。云本质可以看作是一种提供稳定计算存储资源的对象,为了实现这点,像虚拟化、弹性扩展、高可用、高容错性、自恢复这些都是云的基本属性,云原生作为一种云计算,这是所具备的第一层含义

Native

Native 的本意指的是「原住民;土著」,Native 最大的特点就是原本生活在此且对此环境的高度适应,可以理解为两层意思,一个是限定不能是后期移入,另一个是要对环境适应,就像生活在北极的因纽特人,只有他们才可以称得上是北极地区的 Native,但是换做其他人,哪怕你再能抗寒,你也称不上是 Native。那么对于 Cloud Native 中的 Native,我们就很容易理解了,作为一个 Cloud Native 应用,首先,你这个应用架构天生就是为云环境而设计的,无论是服务的调用方式,服务的治理架构等,从一开始就应该从根本上为云环境而考虑,从适应性角度,就比如说,部署在 Pod 中的服务,很有可能随着 Pod 挂掉而挂掉,这在云环境中是个很常见且很正常的事,因为云环境资源的调度是非常灵活的,但是放在传统环境中,应用挂掉是个难以接受的事情,因此应用要适应云环境有时另外一个层面的要求。也就是说,对于一些按照传统应用模式开发,修修补补打包成镜像跑在 Kubernetes 上的应用,其实只是算一些「伪 Cloud Native」

总结

至此,我相信对于 Cloud Native 的概念已经算是讨论清楚了,首先理解官方给出的定义很关键,我们必须要知道云原生的核心技术支撑还是容器、微服务这些概念,核心环境是公有云、私有云和混合云这些各种各样的云环境,然后关键还是回到对于 Cloud 和 Native 两个词的理解上。

最后可以重新捋一遍概念,云原生指的是遵循敏捷开发原则,使用高度自动化的研发工具专门针对云环境特点而开发的应用,这些应用采用自动化的,可扩展的,和高可用的架构,在此基础上工程师能够实现对应用的高效观察与管理,并可以通过自动化的手段对系统做出改进。

参考