云原生概览
1、云原生概念
从百度百科的介绍中我们可以拿到一些信息,云原生是基于分布部署和统一运管的 分布式云,以 容器、微服务、DevOps 等技术为基础建立的一套云技术产品体系。 大致可以发现就是一种基于云计算的方式,云本身就具备高弹性、分布式等特点,而后面提到的容器、微服务等的技术也是为了降低系统的复杂度,以提高整个系统的容错性的方案,总的来说就是在公有云、私有云、混合云等新型动态环境中,构建和运行可弹性扩展的应用 。

1.1 容器化
继虚拟机技术之后的就是容器化技术,也是一种资源隔离的方式。我们先来谈谈什么叫做 容器,就相当于一个包,这个包里面包含了程序的整体运行代码和运行环境所需要的一切资源,容器一旦构建完成,那么我们这个程序就可以直接 run 起来了。
容器化就是一种将应用和具体的底层环境隔离的方法,它将程序以及相关依赖环境和底层的基础设施隔离开来,允许用户以一个容器在多个不同操作系统下运行,而无需启动不同的虚拟机设备。
前面提到了一个虚拟机的技术,既然已有了一种虚拟化技术,为什么还要开发第二种的技术呢?不外乎就是一个性能方面的考虑,虚拟机在硬件层面进行虚拟化,占用大量的系统资源,这样在多应用环境下肯定是不被允许的,因此需要一种更加轻量的虚拟化技术,容器化应时而生。
1.2 微服务化
在传统的单体项目中一个应用的体积是比较大的,一旦内部的一个服务发生了错误,将会导致整个应用的错误,而错误的修改将会波及整个程序,重新部署应用也会有很大的时间开销,和我们的云原生的概念是驳论的。
为此需要将程序内部的每个应用进行模块拆分,将每个功能都提取出来,一旦一个功能挂掉了只需要重启对应的模块应用就可以了,整个系统还可以保持正常的运行状态。
每个模块应用就可以一个一个的容器来运行,也可以运行在不同的物理机器上,服务之间使用 HTTP 、RPC 来进行调用。对于每个服务也可以进行负载处理,降低单个服务的压力同时也提高系统的稳健性。
1.3 声明式 API
讲到声明式的 API 我们不得不说一下 命令式 API 这两者的区别,命令式讲的是我们开发人员对于内部的运作的可知的,需要怎么实现都需要我们去处理;而声明式就是说我们只需要设定设定最终的状态,中间的状态是透明的,整个系统只需要满足中最终状态即可,就像在 K8S 中自动维持 Pod 的数量一样。
1.4 不可变基础设施
容器化之后我们的应用都会变成一个个的容器在机器上运行提供服务,整个的容器是一体的,我们不能对其实时的修改变动,一个容器内部的应用功能发生改变,需要将原有的容器进行替换,这就是不可变基础设施的含义。
总的来说,云原生就是要结合云计算特点建立一个可弹性、易管理、易观察、容错、自动化、可预测的这样一套技术体系,来适应当前的应用多变、变更迅速的软件环境。
2、Docker 与 Kubernetes
云原生的一个很重要的点就是容器化,我们已经知道一个应用可以经过一系列的过程变成容器跑起来,那么怎么构建的这个容器,容器又是怎么跑起来的呢?带着这个问题我们开始了解下面的内容。
2.1 Docker

有的人可能听说过 Docker 是什么,但可能也有人没有没有听说过,也没有使用过,这里就对于 Docker 是一个什么东西做个简要的介绍,想要深入了解的可以观看后面的文章或者去观看另外一片专门为开发者介绍怎么使用 Docker 的文章。
Docker 利用现有的 Linux 容器技术,以不同方式将其封装及扩展——主要是通过提供可移植的镜像,以及一个用户友好的接口——来创建一套完整的容器创建及发布方案。Docker 平台拥有两个不同部分:负责创建与运行容器的 Docker 引擎,以及用来发布容器的云服务 Docker Hub。
上面那段话是 Docker 开发指南中对于其的概念介绍,总的来说就是一个提供容器运行能力的平台,我们可以通过 Docker 很好的、方便的管理我们的容器。它包含从构建镜像、运行容器、容器控制、容器编排等的一套系统过程。它的官方图片是一个驮着很多集装箱的鲸鱼,也确实如此,我们之前将容器比作一个一个的隔离的集装箱,而 Docker 就是管理这些集装箱的鲸鱼。
2.2 Kubernetes

Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
如果你没有使用过 Docker 来管理自己的容器的话,是很难明白 Kubernetes 的好处的,他们之间就像是一个迭代的产物一样。Docker 可以运行我们的容器,我们也可以对容器内容、运行状态这些进行查看,但是我们无法对整个 Docker 下的容器进行很好的管理,就例如我们想保证运行时的容器数量稳定,也就是一个容器会马上重启,Docker 中我们可以指定失败时重启的策略,但是我们无法对其进行很好的追踪控制;再例如想要几个容器之间相互通信并且保持稳定,需要这一组容器都在同一个 网卡 之中进行连接,需要我们手动维护,很麻烦。
正是在这样的背景下, Kubernetes 的出现成为必然,如果没有他出现,其他的管理工具也会出现,甚至是由 Docker 本身来提供这样的一个能力,因为云原生的概念就是需要适应整个大环境下的快速应用管理,对于服务的生命周期需要完全交给容器去控制。
Docker 本身也尝试去掌控编排的市场的,例如 Docker Compose、Docker Swarm 这些工具,但是最终在竞争中失利,目前市场的占有量比较小,份额也还是存在的。
3、云原生的生态环境
3.1 CNIA
CNIA 中国云原生技术生态图景是 CNIA 推荐的 Cloud Native 景观的路径,云原生应用,云原生编排及管理,云原生底层技术,云原生安全技术,通过其生态图可以帮助我们快速的了解对当前国内的一个云原生发展状况。

3.2 CNCF
全称 Cloud Native Computing Foundation(云原生计算基金会),成立于2015年12月11日,是一个开源软件基金会,它致力于云原生(Cloud Native)技术的普及和可持续发展。

- 感谢你赐予我前进的力量