编排是在容器化技术出现后为了解决容器集群的管理而出现的一种技术。编排技术的出现使容器的管理更加容易和便捷。本章会介绍什么是编排以及编排的优点有哪些。
Google早在2010年之前就开始使用容器化技术了,在2013年Docker统一天下的时候,Google为了与Docker公司竞争,扶持了Docker的竞争对手——CoreOS。2014年,Google发现CoreOS在容器生态领域竞争不过Docker,于是决定改变战略,聚焦更具有商业价值的容器编排领域,转而推出Kubernetes容器集群编排工具,并于当年6月7日提交到GitHub上开源。Kubernetes的原型来自Google内部的Borg/Omega系统。
Docker公司雄心勃勃,2014年年底在DockerCon上发布了自己研发的Docker原生容器集群管理项目DockerSwarm,想与Kubernetes展开竞争。同时,Mesosphere公司的Mesos+Marathon(马拉松)项目也得到了很多公司的拥趸,此时容器编排大战逐步拉响,进入“三国鼎立”时代。直到2017年10月17日,Docker宣布支持Kubernetes,容器编排的战争随之结束。Kubernetes已经被广大技术公司所接受,占据了将近80%的市场份额。
随着云原生技术理念的普及,Kubernetes以及容器都成为云厂商的既定标准,以“云”为核心的软件研发思想逐步形成。
容器化之后,以Docker为例,可以通过CLI(Command Line Interface,命令行界面)来管理容器的生命周期,比如将容器提交到新镜像上、上传镜像到注册中心、终止运行中的容器、资源调度和部署、配置管理、资源分配、根据负载扩展或移除容器、流量路由、监控报警、滚动更新等。CLI虽然可以满足单个主机上管理容器的需求,但是面对集群、跨主机的容器管理就显得无所适从了。同时,大部分工作都需要人工操作,重复、低效且容易出错,容器编排工具的出现消除了部署和扩展应用过程中的很多手动操作,提供了一个管理容器生命周期和可扩展微服务架构的框架。随着企业的使用和社区的活跃,Kubernetes目前已经是企业实践的主流编排工具。
当使用容器编排工具时,需要使用YAML或JSON文件来描述应用程序的配置。配置文件会告知配置管理工具在哪里下载容器镜像、如何设置网络、如何保存日志等。容器编排工具同时会定义很多新的概念,如Node、Pod、Service、Deployment、Kubelet等以方便对容器进行操作,这里不做具体展开。下面介绍容器编排的优点。
通过标准化的YAML、配置中心、自定义CRD、可视化后台工具,可以屏蔽很多关于容器、编排本身的概念,大大降低用户的认知成本,降低容器管理的复杂性,从单机到大规模集群管理、从命令行维护到标准化配置、从白盒到黑盒、从无法度量到可视化控制,编排工具大大减轻了应用运维人员的工作量。
编排工具提供自动部署、自动重启、自动复制、自动扩缩容等能力,使容器和微服务有更好的灵活性。
以Kubernetes为例,一个成熟的集群通常有3个主节点,如果跨IDC可能需要更多的主节点来保证整个集群的高可用。同时对于微服务所在的Pod,一旦发现心跳异常,通过Deployment的限制可以快速弹起,保障固定实例正常运行,不会出现传统环境下挂了一台服务器几个月不知道的情况。
对于微服务实例节点比较少的环境,不用编排工具也可控,当开发或运维人员面临的是成百上千,甚至上万的微服务实例时,如果没有编排工具的管理,极有可能造成实例节点的漏发或误发。我所在的团队就曾因为开发人员手动操作失误,导致有1台服务器漏发,结果一部分线上流量流入旧版本服务,最后错误率飙升。这种问题往往定位起来非常麻烦。
编排工具提供了安全插件,通过RBAC(Role Based Access Control,基于角色的访问控制)限制不同的角色拥有不同的权限,对于企业的合规、安全生产有更好的支持。