1.1 云原生平台、架构及开发流程
云原生整体概念思路不外乎“统一”二字。这里的“统一”包含三部分内容,分别是统一基础平台、统一软件架构、统一开发流程。
基于统一的基础平台、软件架构以及开发流程,数字化转型和云化转型能够把重心放在业务应用上。从而使得数字化转型的目标重新回归到业务应用本身,最终通过云原生来提升业务应用的迭代速度,促进业务创新。
1.1.1 云原生之统一基础平台
容器是云原生的标准软件发布格式。在很多技术资料和书籍上,往往会与虚拟化技术做对比,它们的对比如下。
• KVM等虚拟化技术是在操作系统级别上进行虚拟和隔离,每一个虚拟机都是独立的操作系统。
• 容器是在同一个操作系统中实现了轻量级的虚拟化。容器本质上是同一个操作系统中的进程隔离,所以它是轻量级的;容器比虚拟机更省资源,资源利用率更高。
容器技术的设计理念很好、作用也很大。容器技术的好处远不止轻量级的虚拟化;还体现在:它实现了同一个软件可在不同的平台上运行。
这个好处是不是很熟悉?这其实就是Java最初流行起来的原因。
二十多年前,一个应用程序只能在一个平台上运行。在Windows平台上运行的,就不能在Linux平台上运行,除非把代码放在不同的平台上进行重新编译。JVM通过在不同的操作系统上仿真出相同的计算机功能,从而实现了同一个Java程序包可以在不同的平台上正常地运行。Python语言为了实现这一点,开发出了VirtualEnv,把依赖包都随着程序发布,才解决了多平台运行的问题。
在全面云化的时代,如果一个应用程序在不同的平台或操作系统版本中运行都需要重新编译打包甚至调试,那么这种极度影响效率的情况是不能容忍的。把一个软件打包成一个容器镜像,这个容器镜像在任何环境下都可以运行,所带来的好处是巨大的。这就是说,容器镜像统一了软件包的基础格式,是一个事实标准。
容器镜像运行起来是一个一个的程序,如何实现多个程序合成一个大的分布式应用呢?答案很简单,程序之间互相调用就行。就像传统的分布式应用,多配置几台服务器,一台服务器装一个程序,程序之间通过socket或其他协议通信。基于Docker的分布式应用也是如此,区别只是网络虚拟化了,CPU和内存资源也虚拟化了。
但是永远不要低估分布式应用的复杂性。假设搭建了一套分布式集群,运行了一套分布式应用,但出现了以下两个问题:
• 这个集群中的某个机器出故障了(如断电了、硬盘坏了等),怎么去排查故障,怎么去修复?
• 这个集群中某一部分业务由于访问量增加,需要扩充支撑能力,怎么扩充?
针对这两个问题,答案也很简单。那就是派人过去检查机器,修复或者重装;负载过大了,就改应用的架构,上面套上负载均衡性,采用可扩展的架构。这些都是传统的办法,这些解决办法的缺点也很明显,就是修复太慢、太费人力、成本高、对业务影响大。就如一个网站,等扩展架构都做好了,用户也就都流失了。
Kubernetes是容器编排系统,它首要的目的就是为了解决上面这个例子里的两个问题:
• 分布式容器应用的可靠性。在服务器或容器应用出现问题的情况下,自动感知,自动将容器应用在集群内的其他机器里重新运行起来。
• 分布式容器应用的可扩展性。通过启动相同的容器应用,自动提升应用的负载支撑能力。
结合Kubernetes集群提供的能力,基于容器部署的应用得到了集群化部署能力,可靠性以及可扩展性能力提升。此外Kubernetes集群通过多种底层技术支持了从小规模3台集群部署,到大规模数千台直至上万台的集群部署规模。这些底层技术包括:分布式一致性高可靠性etcd存储技术、控制节点和工作节点分离技术,以及标准化的网络接口和存储接口等。
总之,基于容器和Kubernetes技术构成了云原生架构下统一的基础平台。这个平台支撑了标准的软件包发布格式和标准的软件包运行环境。
1.1.2 云原生之统一软件架构
在云原生架构体系中,软件架构都是采用微服务架构。微服务架构的概念是:
微服务是可以独立部署的、小的、自治的业务组件,业务组件彼此之间通过消息进行交互。微服务的组件可以按需独立伸缩,具备容错和故障恢复能力。
由于微服务架构有下面这几个优势,已经成为云计算时代应用的标准应用架构。
• 支持快速上线。由于业务组件的自治性和独立性,新的功能和应用能够迅速地发布上线,而不用担心对系统其他功能带来大范围的影响。可以通过服务组件重用重组,快速地形成和发布新的应用。
• 支持独立扩容和恢复。有针对性地对应用中的某些服务进行扩容,解决性能的瓶颈。可以独立替换或恢复微服务中的某个组件。
快速上线意味着速度和效率;独立扩容和恢复意味着系统的安全、稳定和可扩展。采用微服务架构体系的应用在开发效率、稳定性、可扩展性上具备了很强的优势,使其成为云化应用的标准架构。
微服务架构中的核心功能组件包括网关、微服务治理、服务注册、配置管理、限流和熔断、负载均衡、自动扩容、自动故障隔离、自动业务恢复、监控和日志组件等。
微服务架构本质上与容器及Kubernetes技术无关。Java体系中的Spring Cloud就提供了诸如网关Zuul组件、Ribbon负载均衡组件、Eureka服务注册组件、LCM扩容组件、Hystrix业务恢复组件。利用Spring Cloud的能力可以实现一套完善的微服务架构。Spring Cloud被大量的Java开发人员所拥护,这是它的优势,但是Spring Cloud的劣势也很突出,那就是限制编程语言和编程技术。
微服务架构设计的关键原则见表1-1。
表1-1 微服务架构设计关键原则
(续)
由于云原生的核心目的是提升业务应用的迭代速度、促进业务创新,使用微服务架构能够实现服务间的解耦,使得单个服务能够独立地升级和扩展。在云原生环境下,微服务架构是统一的、标准的软件架构。
1.1.3 云原生之统一开发流程
DevOps是Development(开发)和Operations(运维)的组合,应重视软件开发人员和运维人员的沟通与合作,通过自动化流程来使得软件构建、测试、发布更加迅速和可靠。
DevOps与前述的云原生、微服务、容器等技术应用没有直接的关系。可以说,没有微服务和容器等技术,一样可以朝着自动化的构建、测试和发布流程上行进。但是,长久以来,DevOps只是在流程指导上给出了方向,至于落地的方法论和工具链,并没有很成功。只有在CI/CD流程的个别环节上独立发展出一些比较成功的产品,例如Jenkins及一些自动化测试工具。究其原因,还是在软件应用基础架构上,没有完善的技术支撑和技术体系,软件的运行环境、软件的部署和维护流程、软件的形态和架构千差万别。DevOps落地需要大量定制化,由此导致对应工具链的落地难度很大。
基于容器和Kubernetes的平台提供了云原生应用的标准发布和运行环境;基于容器的微服务架构定义了云原生应用的标准架构。通过这些技术,对软件应用在架构、支撑服务和支持组件、基准平台上都进行了标准化;同时解决了升级,扩容,稳定性,私有云、公有云、混合云统一基础架构等问题。
微服务架构的重要目标就是快速发布。这就在敏捷文化、自动化工具链上对流程提出了高要求。
云原生强调自动化以能够提升开发效率和运维效率。在这个基础上,利用DevOps的自动化、协作、敏捷特性,在软件的开发、测试、部署、运维流程上,提升了开发效率、降低了沟通成本、提升了部署和上线速度。DevOps是云原生应用在开发、测试和发布流程中的必要手段,并且成了云原生应用的标准开发流程。