在处理分布式系统时,单纯利用容器构建服务还远远不够。我们需要考量架构方面的选择,并利用正确工具加以协助。
应用程序架构正由大型整体时代朝着分布式设计模式推进。这一趋势中的核心驱动因素之一,在于云计算及其极为可观的规模化容量的出现。对于已经习惯了构建并管理整体式应用的企业而言,这段转型之旅要求大家重新学习部分旧有设计技术并配合一系列新型模式。下面,我们将一同了解转向分布式应用模式时需要掌握的那些架构学问。
·调度/编排管理: 从管理数百个实例到管理数千个实例,我们需要有能力以无缝化方式跨越各主机对服务实例/容器进行编排/调度。为了应对这一规模扩展,工作负载的调度与编排成为实现分布式系统的重要前提。Docker Swarm、Kubernetes、Mesos以及Marathon等工具正是这一领域的领先代表。
·服务发现/注册:基于容器的服务不断上线与下线,因此我们需要一套管理机制进行服务的注册/注销并在运行时当中发现服务端点。Consul、Zookeeper、etcd、Confd以及Eureka等产品都能够很好地完成这项任务。其中大多数产品还支持将输入流量在各服务实例之间进行负载均衡。
·系统状态管理/集群管理:随着集群规模的扩张,我们需要对集群的系统状态进行管理,具体包括各服务的服务资源、实例数量、主机位置以及负载内容等等。要实现这一目标,大家需要利用集群管理工具追踪系统状态。这类方案选项包括Docker Swarm Agents、Kubernetes Nodes/Masters、Mesos Slaves以及Containership等等。
·数据存储:容器存储具有临时性特征,意味着任何存在时长高于容器生命周期的数据都必须以外部方式持久存储。Docker Volume Plugin、Flocker、Kubernetes Persistent分卷等都是解决此类问题的理想选项。
·网络:由于各容器运行在不同的进程当中,因此我们有必要管理并隔离各服务之间的访问。由于多套容器可运行在同一主机之上,因此为了安全地共享网络资源,我们需要进行容器隔离以建立安全分组。同样的,各容器还需要发现托管于其它主机之上的服务,并利用简单模式进行访问。Flannel、Weaveworks以及Calico在这一领域表现出色。
·监控/审计/记录:面对成千上万套运行中的容器,对其进行监控/审计/记录显然不是件容易的事。数据/日志记录需要从各容器中提取出来加以分析。在这方面,Loggly、Fluentd、log entries、datadog以及ELK堆栈都是很好的选择。
除了这些,我们在构建分布式应用时还需要考虑容器系统与容器运行时等问题。另外,应用运行时、部署管理、DNS、安全性、SSO/OAuth、API Gateways、断路机制、性能/可扩展模式等亦属于应当关注的重点议题。