2.6 如何理解编排
自从容器技术变为热门,我们总能看到编排这个词。到底什么是编排系统?它跟Kubernetes有什么关系呢?本节我们来一起讨论并研究编排。
2.6.1 通俗地理解编排
1.编排是什么
编排这个词,如果用Google翻译,搜索的结果是单词Orchestration。但是Orchestration的中文却是管弦乐编曲。在管弦乐演奏中,肯定需要通过某种方式完成多种乐器之间的协调配合,这种方法也叫作编排。有编排的场景存在多种组件事务,而且这些组件事务具有一定的独立性。个人理解,编排就是按照某种机制让各种组件自动化配合运作,然后得到我们想要的结果,如图2-13所示。
2.编排与自动化
初学者经常会把编排理解为自动化,其实这两个概念是有区别的。编排更注重组建配合产生良好的结果,而自动化更注重组件运行的方式和效率。但是在IT世界里,编排是离不开自动化的,没有实现自动化的编排只是一种工作流,有了自动化,编排才能运行。好比在生产车间里,每个环节如果都靠人力来运作,虽然每个工人一丝不苟、按部就班,但是这仅仅体现了工作流的机械性,没有体现出高效性,这样的编排没有灵魂。
图2-13 Orchestration乐队配合
编排贯穿整个IT环境,横穿Web服务器、数据库、中间件、负载均衡器等。这里涉及多个层次,不同的技术领域,IT管理者需要站在一个高纬度去认识生产系统,设计出一套复杂的编排机制。
3.编排的意义
有些人或许会产生疑问,编排的意义在哪里?它能带来什么收益?
我们可以把编排理解为一种IT工作流,它能把IT系统都串接起来,然后自动化运作。那这样不是一劳永逸吗?在输入和输出要求都不变的情况下或许真的能一劳永逸,但是现实的情况往往不是这样。公司的业务更新迭代,IT支撑环境也会不停更新迭代,没有一种IT环境能一直保持不变。但是,编排的思想却贯彻整个IT发展,每一个发展阶段都有不一样的编排思路。
在物理机时代,人力运维“编排”(搬、挪)物理机;在虚拟机时代,人们用脚本、CMDB、OpenStack heat等“编排”虚拟机;在如今的容器时代,人们用Kubernetes、微服务编排容器。
套用网上的一句话:编排旨在简化并优化重复性的频发流程,以确保准确、快速地完成软件部署。产品上市速度越快,成功概率越大,只要流程是重复性的,便可通过自动运行相关任务来优化流程,消除重复操作。编排流程可用图2-14表示。
图2-14 编排流程
2.6.2 Kubernetes与编排
Kubernetes是容器资源管理、调度平台,换句话说,它就是容器资源的编排系统。那么容器编排都有哪些动作和流程呢?总的来说有以下六大部分。
●资源调度
●资源管理
●服务发现
●健康检查
●自动伸缩
●更新升级
1.资源调度
在分布式系统里,资源调度是非常重要的,Kubernetes通过Scheduler组件对Pod进行调度。Scheduler调度器作为Kubernetes的三大核心组件之一,承载着整个集群资源的调度功能,根据特定调度算法和策略,将Pod调度到最优工作节点上,从而更合理和充分地利用集群计算资源,使资源更好地服务于业务的需求。资源调度是一套分布式系统最基本的核心指标。设想一下,如果连资源都不能调度好,上层的服务还如何正常使用。
2.资源管理
资源一般分为计算资源、网络资源、存储资源。计算资源通常是CPU、MEM(当然现在还有GPU资源),Kubernetes通过可压缩和不可压缩的机制来区分计算资源,这里CPU资源是可压缩的,MEM资源是不可压缩的。Kubernetes主要是通过requests和limits参数来灵活控制Pod对资源的使用。
3.服务发现
所有资源的分配、支撑都是为了运行服务。因为Pod的IP不是固定的,所以外部的程序或者内部的程序想要访问Kubernetes里面的某个Pod,肯定需要一种固定的访问方式,这种方式叫作Service。创建的服务只有能轻松简单地被发现、被访问,调用才能更加高效。
4.健康检查
计算机世界里没有哪种服务能一直保持正常运行。总有各种内在、外在因素影响服务的稳定运行。那么监控检测服务是否能正常运行就尤为重要,在Kubernetes里一般用liveness和readiness探针机制来做健康检查(2.4节也有提到探针的用法)。
5.自动伸缩
在运维环境里,资源的扩容和管理是一件令人头疼的事。工程师很难精确把握业务需要多少资源,多了少了都会影响成本和平台的稳定性。所以,假如有一套机制能根据当前负载的状态,动态、精准地扩容资源,对工程师来说是一个福音。虚拟机时代之前,这是非常难实现的,因为涉及环境的快速迁移和复制。容器化时代很自然地解决了这个问题,Kubernetes里使用Horizontal Pod Autoscaling(Pod横向扩容机制)来保证资源能按需扩容。
6.更新升级
程序会随着业务发展不断迭代,我们可以架设一套完整的CI/CD来完善程序的发布、更新机制。Kubernetes目前在CI/CD里占据很重要的地位,如图2-15所示。另外,Kubernetes的内部控制器ReplicationController与Deployment也为服务的滚动和平滑升级提供了很好的机制。
图2-15 CI/CD流程图
编排其实是一直存在的,从最初的物理机时代,到如今的Kubernetes自编排,这些工具和系统在解放人力的同时也节省了成本。