1.6.2 编排
你应该已经决定采用容器技术了,那就太好了!我们可以利用它们的可移植性,将其部署到任意提供容器运行时的基础设施中。我们还可以实现可重复性,所以把容器从开发环境转移至staging环境,再到生产环境时,我们不会遇到糟糕的意外情况。我们还可以对其进行快速扩展,因为它们是轻量级的,从而获取应用的高可用性。你是不是已经准备好在下一个云原生系统中就采用这项技术了呢?
在单台机器上供应和管理容器是非常简单的。但是,当我们开始处理几十或几百个容器,并在多台机器上进行扩展和部署时,我们就需要其他技术的辅助了。
当从虚拟服务器(IaaS模型)转换到容器集群(CaaS模型)时,我们也在转换自己的视角[17]。在IaaS中,我们关注单个计算节点,也就是虚拟机。在CaaS中,底层的基础设施已经被抽象了,我们所关注的是节点的集群。
[17] N. Kratzke, R. Peinl, “ClouNS—a Cloud-Native Application Reference Model for Enterprise Architects”, 2016 IEEE 20th International Enterprise Distributed Object Computing Workshop (EDOCW), 2016: 1–10。
伴随CaaS方案所提供的新视角,部署的目标不再是一台机器,而是一个机器集群。像Kubernetes这样的CaaS平台提供了很多特性来解决我们在云原生环境中所面临的所有重大问题,也就是跨集群编排容器。图1.11展示了这两种不同的拓扑结构。
图1.11 容器的部署目标是单台机器,而编排器的部署目标是一个集群
容器编排能够帮助我们实现很多任务的自动化:
■ 管理集群,在必要的时候启动和关闭机器。
■ 在集群中,将容器调度和部署到能够满足其CPU和内存需求的机器上。
■ 利用健康监控,动态扩展容器,以实现高可用性和韧性。
■ 为容器之间的通信搭建网络,定义路由、服务发现和负载均衡。
■ 将服务暴露到互联网中,建立端口和网络。
■ 根据特定的标准,为容器分配资源。
■ 配置在容器中运行的应用。
■ 确保安全,执行访问控制策略。
编排工具的指令是以声明式的方式实现的,例如,借助YAML文件。借助特定工具定义的格式和语言,我们通常会描述出想要达成的状态,比如我们想要在集群中部署Web应用容器的三个副本,并将它的服务暴露到互联网上。
容器编排的样例包括Kubernetes(它是一个CNCF项目)、Docker Swarm和Apache Mesos。在本书中,我们将学习如何使用Kubernetes来编排Spring应用的容器。