管理swarm(3) – swarm实践 – 环境准备

在我们开始试验swarm的功能时,先来搭建所需的环境。

三个联网的主机

swarm实践我们使用三台联网的主机来作为swarm的节点。这三台主机可以是你PC,数据中心或云服务提供商的三台虚拟机。本实践使用如下机器名:

  • manager1
  • worker1
  • worker2
  • Docker Engine 1.12或更高版本

    本实践需要每台主机的Docker Engine的版本为1.12或更高版本。
    在每台运行的主机上安装Docker Engine并验证其版本。你可以按照如下方法来获取最新版本的Docker Engine。

    在Linux主机安装Docker Engine

    如果你正在使用的是基于Linux系统的物理主机或者云提供商的主机,可以按照官方提供的Linux安装说明来安装最新版本的Docker Engine。

    在Mac或Windows主机安装Docker Engine

    或者,在一台Mac安装Docker或在一台Windows安装Docker。你可以在这台机器上测试单节点和多节点的swarm,不过你需要使用Docker Machine来测试多节点的swarm。

  • 你可以使用Docker for Mac或Docker for Windows测试swarm模式单节点的功能,包括初始化单节点的swarm,创建服务和缩放服务。
  • 目前你不能单独使用Docker for Mac或Docker for Windows测试多节点的swarm。不过你可以使用Docker Machine来创建swarm节点。
  • 管理器机器的IP地址

    必须为管理器主机的可用网卡分配一个IP地址。所有的swarm节点必须能够通过这个IP地址与管理器主机连接。
    由于其它节点通过这个IP地址与管理器节点通信,所以你应该使用固定的IP地址。
    你可以在Linux或macOS在使用ifconfig命令来查看可用的网卡列表。
    如果你用的是Docker Machine,你可以通过docker-machine ls或docker-machine ip 命令来获取管理器主机的IP。例如docker-machine ip manager1.
    本实践使用manager1 IP为192.168.99.100。

    主机间开放的端口

    主机间必须开放如下端口:

  • TCP端口2377 – 用于集群管理通信
  • TCP和UDP端口7946 – 用于各节点之间的通信
  • TCP和UDP端口4789 – 覆盖网络流量
  • 管理swarm(2) – swarm模式关键概念

    本文介绍Docker Engine 1.12的集群管理和编排功能唯一的一些概念。

    Swarm

    使用Swarmkit嵌入Docker Engine中的集群管理和编排功能。Docker Engine参与到集群时是运行在swarm模式下。你可以通过初始化一个swarm或加入一个已存在的swarm来激活Docker Engine进入swarm模式。
    一个swarm是用来部署服务的Docker Engine集群。Docker Engine CLI包括了管理swarm的命令,例如增加和删除节点。CLI也包括你部署服务到swarm和管理服务编排的命令。
    当你在swarm模式外运行Docker Engine,你执行的是容器命令。当你以swarm模式运行Engine,你执行的是编排服务的命令。

    节点

    一个节点是Docker Engine参与到swarm中的一个实例。
    为了部署你的应用到swarm,你需要提交一个服务定义到管理器节点。管理器节点将称为任务的工作单元分派给worker节点。
    管理器节点也完成编排和集群管理功能以维护swarm的期望状态。管理器节点选择单个领导节点来执行编排任务。
    Worker节点接收和执行来自管理器节点分派的任务。默认下管理器节点也是worker节点,不过你可以配置管理器节点为只管理节点。
    agent将其分配的任务的当前状态通知给管理器节点,使得管理器能够维护期望的状态。

    服务和任务

    一个服务是在worker节点执行任务的定义。它是swarm系统的中心结构和用户与swarm交互的主要根源。
    创建服务时,你可以指定要使用的容器映像以及在运行容器中执行的命令。在复制服务模型中,swarm管理器根据你在期望状态中设置的比例在节点之间分发特定数量的副本任务。对于全局服务,swarm在集群中每个可用节点上为该服务运行一个任务。一个任务携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单位。管理器节点根据服务规模中设置的副本数量将任务分配给worker节点。一旦一个任务分配给一个节点,它就不能移动到其它节点了。它只能在分配的节点上运行。

    负载均衡

    swarm管理器在入口使用负载均衡来连接你的服务。swarm管理器可以自动为服务分配一个PublishedPort或者你为服务配置一个PublishedPort。你可以指定任意可用的端口。如果你不指定,swarm管理器会在30000-32767范围为你的服务分配一个端口。外部组件(如云负载均衡器)可以访问集群中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行任务。Swarm模式有一个内部DNS组件,它自动为每个服务分配一个DNS名称。swarm管理器使用内部负载均衡器,根据服务的DNS名称在集群内的服务之间分配请求。

    管理swarm(1) – swarm模式概述

    要Docker Engine在swarm模式下使用,需要从https://github.com/docker/docker/releases安装Docker Engine v1.12.0或更高的版本。或者安装最新版本的Docker for Mac或Docker for Windows Beta。
    Docker Engine 1.12引入了本地管理Docker Engines集群的swarm模式,称为swarm。使用Docker CLI创建一个swarm,部署应用服务到swarm和管理swarm行为。

    主要功能

  • 集群管理与Docker Engine集成:使用Docker Engine CLI来创建一个你能部署应用服务到Docker Engine的swarm。你不需要其他编排软件来创建或管理swarm。
  • 分散式设计:Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时扮演自己角色。你可以使用Docker Engine部署两种类型的节点,管理器和worker。这意味着你可以从单个磁盘映像构建整个swarm。
  • 声明性服务模型: Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,你可以描述由消息队列服务和数据库后端的Web前端服务组成的应用程序。
  • 伸缩性:对于每个服务,你可以声明要运行的任务数。当你向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需状态。
  • 期望的状态协调:swarm管理器节点持续监控群集状态,并调整你描述的期望状态与实际状态之间的任何差异。 例如,如果设置运行一个10个副本容器的服务,这时worker机器托管其中的两个副本崩溃,管理器则将创建两个新副本以替换已崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker。
  • 多主机网络:你可以为服务指定覆盖网络(overlay network)。 当swarm管理器初始化或更新应用程序时,它会自动为容器在覆盖网络(overlay network)上分配地址。
  • 服务发现:Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行中的容器。 你可以通过嵌入在swarm中的DNS服务器查询在swarm中运行中的每个容器。
  • 负载平衡:你可以将服务的端口暴露给外部的负载均衡器。 在内部,swarm允许你指定如何在节点之间分发服务容器。
  • 安全通信:swarm中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。 你可以选择使用自签名根证书或来自自定义根CA的证书。
  • 滚动更新:在上线新功能期间,你可以增量地应用服务更新到节点。 swarm管理器允许你控制将服务部署到不同节点集之间的延迟。 如果出现任何问题,你可以将任务回滚到服务的先前版本。