我所理解的云原生(二)

1,533 阅读12分钟

前言

上篇《云原生的前世今生(一)》跟大家分享了 Pivotal 和 CNCF 对云原生的定义,这篇聊聊我自己对云原生的理解。

先抛结论,我理解的云原生是一种利用云计算交付优势来构建和运行应用的方法论,当你的应用按照云计算交付模式来构建的话,就能充分贴合云计算的弹性伸缩、分布式、自动化等特点,而且随着容器和 Kubernetes 技术的出现,这套原本只适用于公有云的架构思路,现在可以轻松在私有云、混合云、甚至单台服务器上搭建,开发人员只需要关心应用是如何创建的,无需理会在哪部署。

有些读者可能会觉得,云原生技术只适用于大公司,小公司可能玩不转。而我认为只要你想构建一个分布式、弹性伸缩、容错性好、易于管理、便于观察、在哪都能部署的应用,无论是大公司还是小公司,云原生技术都是一个不错的选择。

什么是云计算?

要想理解什么是云原生,需要先理解什么是云计算。 image.png

云计算简单来说就是云平台提供(包括服务器、存储、数据库、网络、软件、分析和智能)等云服务,通过因特网提供快速创新、弹性资源和规模经济。对于云服务而言,通常你可以根据业务需求的变化,随时增减服务和用量,从而帮助降低运营成本,使基础设施更加有效地运行。总的来说,云计算的本质是按需分配资源和弹性计算。云计算的优势有:

  • 费用:云计算让你无需在购买硬件和软件以及设置和运行现场数据中心(包括服务器机架、用于供电和冷却 的全天不间断电力、管理基础结构的专家)上进行资金投入。
  • 速度:大多数云计算服务作为按需自助服务提供,因此通常只需点击几下鼠标,即可在数分钟内调配海量计算资源,赋予企业非常大的灵活性,并消除了容量规划的压力。
  • 性能:云计算服务商会定期升级到快速而高效的硬件,保证云计算的性能最优。
  • 可靠性:云计算能够以较低费用简化数据备份、灾难恢复和实现业务连续性。
  • 安全性:许多云提供商都提供了广泛的用于提高整体安全情况的策略和技术。
  • 工作效率:云计算避免了大量的软硬件维护工作,让团队可以专注于业务目标。
  • 弹性伸缩:云计算最大的优点是弹性扩展能力。对于云而言,这意味着能够在需要的时候从适当的地理位置提供适量的资源。

什么是云原生应用?

随着提供云计算的厂商越来越多,使用云计算的成本也在逐步降低,再加上云计算的优势明显,所以越来越多的开发者在应用创建之初就选择云服务,而不再购置昂贵的服务器,这些自创建之初就被托管在云平台的应用,可称之为云原生应用。

云原生应用,是专门为在云平台部署和运行而设计的应用。云原生应用并非完全颠覆传统的应用,采用云原生的设计模式可以优化和改进传统应用模式,使应用更加适合在云平台上运行。

在云计算越来越流行的今天,云原生成了一个必然的导向。云原生存在的意义是解放开发和运维,而不是让开发和运维工作变得更加复杂和繁重。

其实,大部分传统应用即便不做任何改动,也可以在基于 Linux 操作系统内核的云平台上部署和运行,但是仅以能够部署和运行为主要目的,将云主机当作物理机一样使用,无法充分利用云平台的能力。

让应用能够利用云平台实现资源的按需分配和弹性伸缩,是云原生应用被重点关注的地方。云原生还关注规模,分布式系统应该具备将节点扩展到成千上万个的能力,并且这些节点应具有多租户和自愈能力。

本质上来说,云原生是一种设计模式,它要求云原生应用具备伸缩性和可用性,以及自动化部署和管理的能力,可随处运行,并且能够通过持续集成、持续交付工具提升研发、测试与发布的效率。

云原生的重要特性

云原生应用的特性很多,本文重点聊聊伸缩性和可用性。这两大特性可以拆解成4个关键词:负载均衡、可用冗余、容错转移、资源调配。

image (1).png

负载平衡:云平台通常用水平扩容的策略来调节计算能力,这就要求一个云原生应用,可以同时运行多个实例,且多个实例的状态是共享的、统一的,当应用的计算量激增时,云平台会主动为应用增加新的实例,以调节计算压力,在请求量降低时,云平台也会动态删除多余的实例,以保障资源最优。而在本地环境,如果需要更高的处理能力,只能更换到一个更强大的服务器上,或者对这个服务器进行升级,比如:增加内存、磁盘容量等等。

可用冗余:云平台通常用冗余的策略来保障应用的可用性,假设你的应用需要达到5个9的可用性(表示在1年时间里最多只能有5.26分钟的业务中断),那么在云平台上,通常会采用异地双机房*双实例的部署模式,当任意实例发生故障时,请求会立即切换到同机房的另一个实例上,当某个机房停电或光缆被挖断时,另一地域机房中的实例也能快速响。如果想进一步提高的可用性,还可以继续增加实例,并且尽量分散地域部署。而在本地环境,服务器偶尔宕机或停电,马上就会导致服务不可用超过5分钟。

容错转移:当一个服务器失效之后,云平台会迅速把应用迁移到另一台服务器,来恢复这个应用的可用性。对于一个典型的云数据中心来讲,通常都是有几十万台服务器的,即便只有1%的错误率,每天这个云数据中心的错误也是数以千计的,你的应用很有可能就部署在失效的那个服务器上,所以云原生应用需要做好随时被迁移到另一台服务器上的准备。

资源调配:应用迁移不光出现在服务器失效的时候,云平台有时也会主动调节不同服务器上的负载来达到一个资源优化,也就是说应用和服务器本身都没有问题,也有可能触发应用的迁移。而在本地环境,服务器宕机是一件很大的事情,会直接导致你的服务不可用,并且很难快速恢复。

云原生的蓬勃发展

为了满足云原生应用特性的要求,云平台需要具备哪些具体的能力呢?

image (2).png

1、快速、稳定地重新发布。无论是容错转移还是弹性伸缩,云平台需要能快速的把你的应用,重新发布到另外一台服务器上。在历史上人们有很多不同的解决方案:1)一开始是部署脚本+安装程序的形式,但书写一个兼容性良好的部署脚本是一个十分复杂的工作;2)后来人们提出了虚拟化概念,通过虚拟机的形式,把应用和所有类库以及底层操作系统全部打包成一个虚拟机镜像,部署时直接用镜像进行还原,这个方法虽然解决了兼容性问题,但又产生了部署效率问题,因为一个完整的虚拟机镜像,无论是在下载、还是在调度上,都需要很大的时间开销;3)再后来出现了容器技术,它统一解决了不同操作系统之间的兼容性问题,并给大家提供了一种轻量级的封装方式,支持把应用和它依赖的类库打包成一个尺寸较小的容器镜像,这种容器镜像不管是传输、还是重新发布,都可以达到很快的速度。

image (3).png

2、动态、灵活的网络。同样是容错转移或者是弹性伸缩,云原生应用的实例会不停的在数据中心进行迁移,实例在迁移的过程中要保证它和其他部件之间的连接稳定,所以需要动态、灵活的网络。1)一开始人们也是提供这种配置脚本,对不同的网络硬件书写特定的脚本来进行配置,这个工作同样也是非常复杂的;2)后来有了 SDN 软件定义网络的方式,就是说在硬件网络基础层的上面,通过软件来定义网络的一些功能,比如路由的分配等等;3)再后来出现了 kubernetes 和 Service Mesh,就是说在软件和硬件的网络架构上,可以再贴一层服务网格进行更灵活的、私有的、服务之间的连接配置。

image (4).png

随着容器和 Kubernetes 等云原生技术的出现,这套原本只适用于公有云的架构思路,现在可以轻松在私有云、混合云、甚至单台服务器上搭建,开发人员只需要关心应用是如何创建的,无需理会在哪部署。目前已经从 CNCF 毕业的云原生项目主要有:

项目名称GitHub Star官网地址项目描述
Kubernetes80k+kubernetes.io/是用于自动部署,扩展和管理容器化应用程序的开源系统。
Prometheus39k+prometheus.io/使用领先的开源监控解决方案为您的指标和警报提供支持。
etcd37k+etcd.io/是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络。
Helm20k+helm.sh/Helm is the best way to find, share, and use software built for Kubernetes.
Envoy18k+envoy.com/是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线。
Harbor15k+goharbor.io/Harbor 是一个开源注册表,它通过策略和基于角色的访问控制来保护工件,确保图像被扫描且没有漏洞,并将图像签名为受信任的。 Harbor 是 CNCF 毕业的项目,可提供合规性、性能和互操作性,帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致且安全地管理工件。
Jaeger14k+www.jaegertracing.io/end-to-end distributed tracing.
Vitess12k+vitess.io/是一个数据库集群系统,用于通过广义分片对 MySQL 进行水平扩展。
Fluentd10k+www.fluentd.org/Fluentd是一个开源的数据收集器,专为处理数据流设计,使用JSON作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发。
TiKV9k+tikv.org/TiKV 是一个分布式的 KV 系统,它采用 Raft 协议保证数据的强一致性,同时使用 MVCC + 2PC 的方式实现了分布式事务的支持。
containerd9k+containerd.io/是一种行业标准的集装箱运行时间,强调简单性、坚固性和便携性。它可作为 Linux 和 Windows 的守护神,可管理其主机系统的完整容器生命周期:图像传输和存储、容器执行和监督、低级存储和网络附件等。
Rook9k+rook.io/是一款云原生环境下的开源分布式存储编排系统,目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢复、监控以及资源管理。
CoreDNS8k+coredns.io/是一个灵活可扩展的 DNS 服务器,可以作为 Kubernetes 集群 DNS。
Linkerd7k+linkerd.io/出现是为了解决像twitter、google这类超大规模生产系统的复杂性问题。Linkerd不是通过控制服务之间的通信机制来解决这个问题,而是通过在服务实例之上添加一个抽象层来解决的。
Open Policy Agent5k+www.openpolicyagent.org/官方简称OPA, 为这类策略决策需求提供了一个统一的框架与服务。它将策略决策从软件业务逻辑中解耦剥离,将策略定义、决策过程抽象为通用模型,实现为一个通用策略引擎,可适用于广泛的业务场景

在国内,阿里云将云原生升级为技术战略,积极参与到云原生生态的建设,持续沉淀简单易用的云原生产品,并在自身业务中充分实践云原生,取得了非常不错的成效。

image (5).png

我们灵活运用这些云原生技术,配合 CNCF 云原生实践路线图 ,相信大家能轻松的构建自己的云原生应用。

参考

PS:关注我的公众号【劼哥舍】,一起学习成长