管理swarm(17) – 管理节点

在swarm的生命周期中,你可能需要查看或更新节点,如:

  • 列出swarm中的节点
  • 查看单个节点详信息
  • 更新节点
  • 脱离swarm
  • 列出节点

    在管理节点在执行docker node ls来列出swarm中的节点:

    1. $ docker node ls
    2.  
    3. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    4. 46aqrk4e473hjbt745z53cr3t    node-5    Ready   Active        Reachable
    5. 61pi3d91s0w3b90ijw3deeb2q    node-4    Ready   Active        Reachable
    6. a5b2m3oghd48m8eu391pefq5u    node-3    Ready   Active
    7. e7p8btxeu3ioshyuj6lxiv6g0    node-2    Ready   Active
    8. ehkv3bcimagdese79dn78otj5 *  node-1    Ready   Active        Leader

    AVAILABILITY显示出调度器是否能分配任务给这个节点:

  • Active意味着调度器可以分配任务给节点
  • Pause意味着调度器不能分配任务给节点,不过已存在的任务仍然继续运行
  • Drain意味着调度器不能分配任务给节点。调度器关闭已存在的任务并调度它们到其它可用节点
  • MANAGER STATUS列显示节点是否参与到Raft一致性:

  • 没有值表示worker节点不参与到swarm管理
  • Leader表示该节点是主要管理节点,负责全部的swarm管理工作和编排决策。
  • Reachable表示该节点是一个管理节点并参与到Raft一致性。如果leader节点变为不可用,该节点有资格被选为新的leader。
  • Unavailable表示该节点是一个管理节点,不过目前不能与其它管理节点通信。如果一个管理节点变为不可用,你应该加入一个新的管理节点或者提升一个worker节点为管理节点。
  • 查看单个节点详细信息

    你可以在管理节点上执行docker node inspect 来查看单个节点的详细信息。默认输出来json格式,你可以传递–pretty参数来输出较易读的格式,如:

    1. docker node inspect self –pretty
    2.  
    3. ID:                     ehkv3bcimagdese79dn78otj5
    4. Hostname:               node-1
    5. Joined at:              2016-06-16 22:52:44.9910662 +0000 utc
    6. Status:
    7.  State:                 Ready
    8.  Availability:          Active
    9. Manager Status:
    10.  Address:               172.17.0.2:2377
    11.  Raft Status:           Reachable
    12.  Leader:                Yes
    13. Platform:
    14.  Operating System:      linux
    15.  Architecture:          x86_64
    16. Resources:
    17.  CPUs:                  2
    18.  Memory:                1.954 GiB
    19. Plugins:
    20.   Network:              overlay, host, bridge, overlay, null
    21.   Volume:               local
    22. Engine Version:         1.12.0-dev

    更新节点

    更新节点状态

    更新节点的状态可以:

  • drain一个管理节点,可以使该节点只完成swarm管理任务,而不接收来自调度器的任务并停止已存在的任务
  • drain一个节点,你可以下线该节点来进行维护工作
  • pause一个节点,使它不再接收新任务
  • restore一个不可用或暂停的节点为可用状态
  • 例如,设置一个管理节点为Drain:

    1. $ docker node update –availability drain node-1
    2.  
    3. node-1

    添加或删除标签元数据

    节点标签提供了一种灵活的节点组织方法。 你还可以在服务约束中使用节点标签。 在创建服务时应用约束,以限制调度器为服务分配任务的节点。
    在管理节点上运行docker node update –label-add以将标签元数据添加到节点。 –label-add标志支持或 = 对。
    每添加一个节点标签需要传递一次label-add参数:

    1. $ docker node update –label-add foo –label-add bar=baz node-1
    2.  
    3. node-1

    升级或降级节点

    你可以升级一个worker节点为管理节点。这个在管理节点变为不可用或者你想下线管理节点来维护会比较有帮助。当然,你也可以降级一个管理节点为worker节点。
    不管你降级和升级节点是出于什么原因,你应该始终确保swarm中管理节点数量为奇数。
    在管理节点执行docker node promote来升级一组worker节点:

    1. $ docker node promote node-3 node-2
    2.  
    3. Node node-3 promoted to a manager in the swarm.
    4. Node node-2 promoted to a manager in the swarm.

    在管理节点执行docker node demote来降级一组节点:

    1. $ docker node demote node-3 node-2
    2.  
    3. Manager node-3 demoted in the swarm.
    4. Manager node-2 demoted in the swarm.

    docker node promote和docker node demote分别是docker node update –role manager和docker node update –role worker命令等效。

    脱离节点

    要从swarm删除一个节点,首先要执行docker swarm leave命令。
    例如从swarm脱离一个worker节点:

    1. $ docker swarm leave
    2.  
    3. Node left the swarm.

    当一个节点脱离swarm时,Docker Engine不再以swarm模式运行。orchestrator不再调度任务给该节点。
    当节点脱离swarm之后,你可以在管理节点执行docker node rm命令来从节点列表中删除该节点。
    例如:

    1. docker node rm node-2
    2.  
    3. node-2

    管理swarm(16) – 将节点加入到swarm

    当你首次创建一个swarm时,你就放置了一个Docker Engine到swarm中。为了充分利用swarm模式的优势,你可以添加节点到swarm:

  • 添加worker节点来增加集群容量。当你部署一个服务到swarm,Engine调度任务到可用的节点中(不管是worker节点或者是manager节点)。当你添加一个worker节点到swarm中,你增加了swarm的规模来处理更多的任务而不会影响到管理器raft的一致性
  • 多个manager节点可以增强集群容错能力。manager节点执行swarm的编排和集群管理功能。在manager节点中,单个leader节点执行编排任务。当leader节点出现故障,余下的manager节点选出一个新的leader节点并恢复编排和维护swarm状态。默认情下,manager节点也执行任务。
  • 在添加节点到swarm之前你必须安装Docker Engine 1.12或之后的版本。

    添加worker节点

    要获取添加worker到swarm的命令,在manager节点上执行:

    1. $ docker swarm join-token worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377

    在要添加到swarm的worker节点上执行如下命令来加入到swarm:

    1. $ docker swarm join
    2.   –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    docker swarm join做了如下工作:

  • 切换当前节点的Docker Engine为swarm模式
  • 从manager节点请求一个TLS证书
  • 以机器主机名命名节点
  • 基于swarm token和manager节点监听的地址来添加当前节点到swarm
  • 设置当前节点为Active状态,意味着它可以接收从调度器分配的任务
  • 将ingress覆盖网络扩展到当前节点
  • 添加manager节点

    当你执行docker swarm join并传递manager token,跟worker节点一样Docker Engine切换到swarm模式。新添加的manager节点也参与到raft一致性当中。新的节点应该是可访问的,但之前的leader节点仍然不变。
    Docker推荐3个或5个manager节点的集群来实现高可用。因为swarm模式的manager节点使用Raft共享数据,必须是奇数的manager节点数。只要超过一半的manager节点可用,swarm就可以继续工作。
    要获取添加manager到swarm的加入命令,执行:

    1. $ docker swarm join-token manager
    2.  
    3. To add a manager to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6
    7.     192.168.99.100:2377

    在要添加到swarm的manager节点上执行:

    1. $ docker swarm join
    2.   –token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a manager.

    管理swarm(15) – 以swarm模式运行Docker Engine

    当你首次安装并开始使用Docker Engine,默认情况下swarm模式是关闭的。当你激活swarm模式,你开始可以使用docker service命令来管理服务。
    有两种方法来激活swarm模式:

  • 创建一个新的swarm,本文将介绍
  • 加入一个已存在的swarm
  • 当你在你本地机器运行docker engine的swarm模式,你可以基于你之前创建的镜像或其它可用镜像来创建和测试服务。在生产环境中,swarm模式提供了集群管理的容错功能来保持你服务一直可用。
    本文假设你已经在你机器安装了Docker Engine 1.12或更高版本。

    创建一个swarm

    当你运行创建swarm的命令,Docker Engine就开始以swarm模式运行了。
    执行docker swarm init命令在当前节点创建一个单节点的swarm。Docker Engine设置swarm的步骤为:

  • 切换当前节点进入swarm模式
  • 创建一个名为default的swarm
  • 将当前节点指定为该swarm的leader管理器节点。
  • 以机器主机名命名节点
  • 配置管理节点监听端口2377
  • 设置当前节点为Active状态,意味着当前节点可以接收来自调度器的任务
  • 创建一个内部的分布式数据存储来维护swarm的一致状态
  • 默认下为swarm生成一个自签名根CA证书
  • 默认下生成一个token用来worker和manager节点加入swarm
  • 创建一个名为ingress的覆盖网络用来发布服务端口,以连接swarm外部网络
  • docker swarm init命令的输出提供了worker节点加入swarm的命令:

    1. $ docker swarm init
    2. Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    8.     192.168.99.100:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    配置advertise地址

    管理节点使用一个advertise地址来允许swarm中的其它节点进入Swarmkit API和覆盖网络。其它节点必须能够通过advertise地址连接管理节点。
    如果你没有指定一个advertise地址,Docker会检查系统是否只有一个IP地址,如果是,Docker就使用这个IP地址监听2377端口。如果系统有多个IP地址,你就必须指定一个正确的–advertise-addr来启用内部管理间通信和覆盖网络。

    1. $ docker swarm init –advertise-addr <MANAGER-IP>

    注意有时候其它节点连接管理节点的地址不绑定在管理节点本身系统上,即使用ifconfig看不到能用于连接管理节点的地址时,也需要手动指定正确的advertise地址。例如在云服务器中有多个不同的区域,主机有用于内部通过的内部地址和用于外部通过的外部地址。在这种情况下,需要指定其它节点能连接管理节点的地址。

    查看join命令或更新swarm join token

    节点需要一个秘密token来加入swarm。worker节点用来加入swarm的token与manager节点的token不一样。节点只在加入swarm的时候使用token。当在一个节点加入swarm后更新token不会影响节点的swarm成员资格。更改token只是为了确保其它新的节点不能使用旧的token来尝试加入swarm。
    要获取用于worker节点加入swarm的token,执行:

    1. $ docker swarm join-token worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377
    8.  
    9. This node joined a swarm as a worker.

    要获取用于manager节点加入swarm的token,执行:

    1. $ docker swarm join-token manager
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377

    传递–quiet参数只打印token:

    1. $ docker swarm join-token –quiet worker
    2.  
    3. SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c

    我们建议在以下情况来更新token:

  • 如果token不小心进入到了版本管理系统,群组聊天或打印到了日志文件中
  • 如果你怀疑节点已被入侵
  • 如果你想确保没有新的节点可以加入swarm
  • 除此之外,我们建议你定时的更新token。建议至少6个月更新一个token。
    运行swarm join-token –rotate以使旧token无效并生成新token。 指定更新的是worker节点token还是manager节点:

    1. $docker swarm join-token  –rotate worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44
    7.     172.17.0.2:2377

    管理swarm(14) – 服务介绍

    要在Docker Engine swarm模式中部署一个应用程序镜像,你需要创建一个服务。通常时候,一个服务对于一些规模比较大的应用程序的一个微服务镜像。例如服务比较包含一个HTTP服务器,一个数据库或者你想运行在分布式环境的可执行程序。
    当你创建一个服务,你可以指定使用哪个容器镜像和在容器中运行的命令。你也可以定义服务的选项,包括:

  • 可在swarm外部访问服务的端口
  • 在swarm中服务之间可以互相通信的覆盖网络
  • CPU和内存限制和预留
  • 滚动更新策略
  • 运行在swarm的镜像副本的数量
  • 服务,任务和容器

    当你部署服务到swarm,swarm管理器接收你对服务期望状态的定义。然后它为你服务在swarm中的节点调度一个或多个副本任务。这些任务在swarm的节点上彼此独立地运行。
    例如假设你想负载均衡三个HTTP服务器实例。下面的图表展示了三个HTTP服务器副本。三个HTTP实例中的每一个是swarm中的一个任务。
    虚拟化技术
    一个容器是孤立的进程。在swarm模式模型中,每个任务调用一个容器。任务包含着容器。一旦容器运行正常,调度器就会把相此容器相关联的任务识别为在线状态。否则容器停止或有异常,则任务显示为终止。

    任务和调度

    任务是swarm内调度的原子单位。当你通过创建或更新服务声明一个期望状态的服务,调度器通过调度任务来实现期望的状态。例如,你指定一个服务始终保持运行三个HTTP实例。调度器就创建三个任务。每个任务运行一个容器。容器是任务的实例化。如果一个HTTP容器之后出现故障停止,此任务被标志为失败,调度器就会创建一个新的任务来生成一个新容器。
    任务是一个单向机制。它单向地执行一系统状态,assigned, prepared, running等。如果一个任务失败了,调度器就会删除这个任务和它的容器,然后创建一个新的任务来替换它。
    下面的图表显示swarm模式是如何接收服务创建请求和调度任务到worker节点的。
    虚拟化技术

    副本和全局服务

    有两种类型的服务部署,副本和全局。
    对于副本服务,你可以指定运行相同任务的数量。例如,你决定部署三个HTTP实例的副本,每个提供相同的内容。
    一个全局服务是在每个节点上运行一个相同的任务。不需要预先指定任务的数量。每次你增加一个节点到swarm中,协调器就会创建一个任务,然后调度器把任务分配给新节点。比如你希望在每个节点上运行监控代理,病毒扫描器等。
    下面的图表显示以黄色标注的三个副本的服务和灰色标注的一个全局服务。
    虚拟化技术

    管理swarm(13) – 节点介绍

    从Docker Engine 1.12版本起开始引进swarm模式来创建一个或多个Docker Engines的集群,称为swarm。一个swarm包含一个或多个节点:运行在Docker Engine1.12或更高版本的swarm模式下的物理的或虚拟的机器。
    有两种类型的节点:managers和workers。
    虚拟化技术

    Manager节点

    manager节点处理集群管理任务:

  • 维护集群状态
  • 调度服务
  • 提高swarm模式的HTTP API服务
  • swarm管理器使用Raft来实现维护整个swarm集群一致的内部状态。如果是测试的目的可以只运行一个swarm管理节点。如果单管理器的swarm出问题下线了,服务仍然会运行,不过你需要创建一个新的集群来恢复它。
    要利用swarm模式的容错功能,Docker建议根据你对高可用的要求来创建奇数的管理节点。当你有多个管理节点时,可以不用停机从故障的管理节点中恢复。

  • 三个管理节点的swarm最大允许一个管理节点宕机
  • 五个管理节点的swarm最大允许两个管理节点宕机
  • N个管理节点的swarm最大允许(N-1)/2个管理节点宕机
  • Docker推荐最多创建7个管理节点
  • Worker节点

    Worker节点是Docker Engine的实例,其唯一目的是运行容器。Worker节点不参与Raft分布状态,作调度的决定或提供swam模式的HTTP API服务。
    你可以创建单个管理节点的swarm,不过你不能只有一个Worker节点而没有管理节点。默认情况下,所有的管理节点也是Worker节点。在单管理节点的集群中,你可以运行命令如docker service create,然后调度器会把所有的任务放到本地执行。
    如果你想阻止调度器把任务分配到多个节点的集群的管理节点上,你可以设置管理节点的状态为Drain。调度器就不会继续把任务分发这些节点上执行。

    改变角色

    你可以通过执行docker node promote来把一个worker节点提升为管理节点。例如,你当你的管理节点下线时你可能会想把worker节点提升为管理节点。

    管理swarm(12) – swarm实践 –使用swarm模式的routing mesh路由请求

    Docker Engine的swarm模式使得服务发布端口让服务在swarm外部可用变得容易。所以的节点都参与到routing mesh中,意味着任何的节点(即使该节点没有服务在运行)都可以作为入口,都能路由请求。
    为了能在swarm中使用ingress网络,你需要在节点之间开放如下端口:

  • TCP/UDP端口7946 – 用来发现容器网络
  • UDP端口4789 – 容器ingress网络
  • 当然你也必须在swarm节点之间和做任意外部资源(如外部负载均衡)之间开放published端口。

    发布服务端口

    在创建服务时使用–publish参数来发布一个端口:

    1. $ docker service create
    2.   –name <SERVICE-NAME>
    3.   –publish <PUBLISHED-PORT>:<TARGET-PORT>
    4.   <IMAGE>

    是容器内监听的端口。是对外发布的端口,外部通过此端口能访问到容器内的应用程序。
    例如,以下的命令是发布nginx容器内的80端口到swarm所有节点的8080端口:

    1. $ docker service create
    2.   –name my-web
    3.   –publish 8080:80
    4.   –replicas 2
    5.   nginx

    当你访问任意节点的8080端口,swarm的负载均衡会把你的请求路由到一个任意节点的可用的容器上。routing mesh在swarm节点的所有IP上监听published端口。
    虚拟化技术
    你可以使用以下命令来为已存在的服务发布一个端口:

    1. $ docker service update
    2.   –publish-add <PUBLISHED-PORT>:<TARGET-PORT>
    3.   <SERVICE>

    使用docker service inspect来查看服务的published端口。如:

    1. $ docker service inspect –format="" my-web
    2.  
    3. [{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]

    发布一个TCP端口或UDP端口

    默认情况下,以上发布的端口都是TCP端口。你可以指定发布一个UDP端口。当你TCP和UDP两个端口都发布时,Docker 1.12.2及更早版本要求你为TCP端口添加/tcp后缀。

    只发布TCP端口

    下面的两个命令是一样的。

    1. $ docker service create –name dns-cache -p 53:53 dns-cache
    2.  
    3. $ docker service create –name dns-cache -p 53:53/tcp dns-cache

    发布TCP和UDP端口

    1. $ docker service create –name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache

    只发布UDP端口

    1. $ docker service create –name dns-cache -p 53:53/udp dns-cache

    配置一个外部负载均衡

    你可以配置一个外部负载均衡来路由请求到swarm服务。例如,你可以配置HAProxy来路由请求到一个published端口为8080的nginx服务。
    虚拟化技术
    在这个示例中,在负载均衡和所有swarm节点之间需要开放8080端口。
    你可以配置负载均衡负载请求到swarm的任何节点。例如HAProxy的配置文件/etc/haproxy/haproxy.cfg:

    1. global
    2.         log /dev/log    local0
    3.         log /dev/log    local1 notice
    4. …snip…
    5.  
    6. # Configure HAProxy to listen on port 80
    7. frontend http_front
    8.    bind *:80
    9.    stats uri /haproxy?stats
    10.    default_backend http_back
    11.  
    12. # Configure HAProxy to route requests to swarm nodes on port 8080
    13. backend http_back
    14.    balance roundrobin
    15.    server node1 192.168.99.100:8080 check
    16.    server node2 192.168.99.101:8080 check
    17.    server node3 192.168.99.102:8080 check

    当你访问HAProxy负载均衡的80端口时,它会把你的请求转发到swarm节点。然后swarm节点的routing mesh把请求路由到一个可用的服务上。

    管理swarm(11) – swarm实践 –下线节点

    在之前的章节,所以的节点状态都为ACTIVE了。swarm管理器能分配任务到任何ACTIVE的节点,所以目前为止所有的节点都可以接收任务。
    不过有时候如维护期间,你需要设置一个节点为DRAIN状态,也就是下线节点。DRAIN状态的节点不再接受来自swarm管理器发来的新任务。也意味着管理器停止DRAIN状态节点的任务然后再在ACTIVE节点上新起一个副本任务来替代之前的任务。
    1.登录manager1机器。
    2.查看目前所有的节点都为Active状态。

    1. $ docker node ls
    2.  
    3. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    4. 1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active
    5. 38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Active
    6. e216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader

    3.如果你没有运行之前滚动更新的步骤,那么先执行如下命令创建redis服务:

    1. $ docker service create –replicas 3 –name redis –update-delay 10s redis:3.0.6
    2.  
    3. c5uo6kdmzpon37mgj9mwglcfw

    4.执行docker service ps redis查看swarm管理器把任务分配到了哪些节点:

    1. $ docker service ps redis
    2.  
    3. ID                         NAME     SERVICE  IMAGE        LAST STATE          DESIRED STATE  NODE
    4. 7q92v0nr1hcgts2amcjyqg3pq  redis.1  redis    redis:3.0.6  Running 26 seconds  Running        manager1
    5. 7h2l8h3q3wqy5f66hlv9ddmi6  redis.2  redis    redis:3.0.6  Running 26 seconds  Running        worker1
    6. 9bg7cezvedmkgg6c8yzvbhwsd  redis.3  redis    redis:3.0.6  Running 26 seconds  Running        worker2

    在这个示例中,swarm管理器为每个节点分配一个任务。
    5.执行docker node update –availability drain 来下线一个节点:

    1. docker node update –availability drain worker1
    2.  
    3. worker1

    6.查看这个节点的状态:

    1. $ docker node inspect –pretty worker1
    2.  
    3. ID:         38ciaotwjuritcdtn9npbnkuz
    4. Hostname:       worker1
    5. Status:
    6.  State:         Ready
    7.  Availability:      Drain
    8. …snip…

    下线的节点显示Drain状态。
    7.执行docker service ps redis来查看swarm管理器是如何重新分配redis任务到其它可用节点的:

    1. $ docker service ps redis
    2.  
    3. ID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR
    4. 7q92v0nr1hcgts2amcjyqg3pq  redis.1       redis:3.0.6  manager1  Running        Running 4 minutes
    5. b4hovzed7id8irg1to42egue8  redis.2       redis:3.0.6  worker2   Running        Running About a minute
    6. 7h2l8h3q3wqy5f66hlv9ddmi6   _ redis.2   redis:3.0.6  worker1   Shutdown       Shutdown 2 minutes ago
    7. 9bg7cezvedmkgg6c8yzvbhwsd  redis.3       redis:3.0.6  worker2   Running        Running 4 minutes

    swarm管理器停止已下线节点的redis任务并在其它Active节点创建一个新任务来维持设定redis副本数。
    8.执行docker node update –availability active 来上线已下线的节点:

    1. $ docker node update –availability active worker1
    2.  
    3. worker1

    9.查看上一步更新节点的状态:

    1. $ docker node inspect –pretty worker1
    2.  
    3. ID:         38ciaotwjuritcdtn9npbnkuz
    4. Hostname:       worker1
    5. Status:
    6. State:          Ready
    7. Availability:       Active
    8. …snip…

    当设置节点重新为Active状态时,在以下几种情况会重新接收新任务:

  • 在增大服务规模期间
  • 在滚动更新期间
  • 当设置另一个节点为Drain状态时
  • 当一个任务在另一个Active节点失败时
  • 管理swarm(10) – swarm实践 – 滚动更新服务

    在上一篇文章中你更新了服务的实例数。在本文中,我们尝试部署一个Redis 3.0.6的容器服务。然后使用滚动更新把它升级到Redis 3.0.7。
    1.登录manger1机器。
    2.部署Redis 3.0.6到swarm和配置swarm为10秒更新延迟:

    1. $ docker service create
    2.   –replicas 3
    3.   –name redis
    4.   –update-delay 10s
    5.   redis:3.0.6
    6.  
    7. 0u6a4s31ybk7yw2wyvtikmu50

    在服务部署时你配置了滚动更新策略。
    –update-delay参数配置更新服务任务之间的延迟时间或一组任务之间的延迟时间。你可以以秒s,分m,时h单位来配置延迟时间。所以10m30s表示10分钟30秒的延迟。
    默认情况下,调度程序一次执行一个更新任务。你可以传递–update-parallelism参数来配置调度程序同时执行的最大更新服务任务数。
    默认情况下,当单个更新任务返回RUNNING的状态时,调度器调度继续其它任务直到所有任务更新完成。如果在更新任务期间的任何时候一个任务返回FAILED,调度器暂停更新。你可以在docker service create或docker service update时使用–update-failure-action来控制其行为。
    3.查看redis服务:

    1. $ docker service inspect –pretty redis
    2.  
    3. ID:             0u6a4s31ybk7yw2wyvtikmu50
    4. Name:           redis
    5. Mode:           Replicated
    6.  Replicas:      3
    7. Placement:
    8.  Strategy:      Spread
    9. UpdateConfig:
    10.  Parallelism:   1
    11.  Delay:         10s
    12. ContainerSpec:
    13.  Image:         redis:3.0.6
    14. Resources:

    4.现在开始更新redis容器。swarm管理器根据UpdateConfig策略来对节点应用更新:

    1. $ docker service update –image redis:3.0.7 redis
    2. redis

    默认情况下调度器应用滚动更新的步骤如下:

  • 停止第一个任务。
  • 对已停止的任务执行更新。
  • 启动已经完成更新的容器。
  • 如果更新任务返回RUNNING,等待一个指定的延迟然后停止下一个任务。
  • 如果在任何时候任务返回FAIlED,停止更新。
  • 5.执行docker service inspect –pretty redis命令来查看当前状态:

    1. $ docker service inspect –pretty redis
    2.  
    3. ID:             0u6a4s31ybk7yw2wyvtikmu50
    4. Name:           redis
    5. Mode:           Replicated
    6.  Replicas:      3
    7. Placement:
    8.  Strategy:      Spread
    9. UpdateConfig:
    10.  Parallelism:   1
    11.  Delay:         10s
    12. ContainerSpec:
    13.  Image:         redis:3.0.7
    14. Resources:

    如果更新暂时,下面是service inspect的输出:

    1. $ docker service inspect –pretty redis
    2.  
    3. ID:             0u6a4s31ybk7yw2wyvtikmu50
    4. Name:           redis
    5. …snip…
    6. Update status:
    7.  State:      paused
    8.  Started:    11 seconds ago
    9.  Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
    10. …snip…

    执行docker service update 命令来重启已暂停的更新,例如:

    1. docker service update redis

    6.执行docker service ps 来查看滚动更新:

    1. $ docker service ps redis
    2.  
    3. ID                         NAME         IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERROR
    4. dos1zffgeofhagnve8w864fco  redis.1      redis:3.0.7  worker1    Running        Running 37 seconds
    5. 88rdo6pa52ki8oqx6dogf04fh   _ redis.1  redis:3.0.6  worker2    Shutdown       Shutdown 56 seconds ago
    6. 9l3i4j85517skba5o7tn5m8g0  redis.2      redis:3.0.7  worker2    Running        Running About a minute
    7. 66k185wilg8ele7ntu8f6nj6i   _ redis.2  redis:3.0.6  worker1    Shutdown       Shutdown 2 minutes ago
    8. egiuiqpzrdbxks3wxgn8qib1g  redis.3      redis:3.0.7  worker1    Running        Running 48 seconds
    9. ctzktfddb2tepkr45qcmqln04   _ redis.3  redis:3.0.6  mmanager1  Shutdown       Shutdown 2 minutes ago

    在swarm更新完所有的任务前,你会看到有些节点运行着redis:3.0.6,而有些运行redis:3.0.7。

    管理swarm(9) – swarm实践 – 删除服务

    1.登录manager1机器。
    2.执行docker service rm helloworld来删除helloworld服务。

    1. $ docker service rm helloworld
    2.  
    3. helloworld

    3.执行docker service inspect 命令来验证swarm管理器是否已经把服务删除了。CLI会返回提示服务不存在:

    1. $ docker service inspect helloworld
    2. []
    3. Error: no such service: helloworld

    管理swarm(8) – swarm实践 – 调节服务副本数

    本文介绍如何调节服务副本数。
    1.登录manager1机器。
    2.执行如下命令来设置指定服务的副本数:

    1. $ docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

    例如:

    1. $ docker service scale helloworld=5
    2.  
    3. helloworld scaled to 5

    3.执行docker service ps 查看更新的任务列表:

    1. $ docker service ps helloworld
    2.  
    3. ID                         NAME          SERVICE     IMAGE   LAST STATE          DESIRED STATE  NODE
    4. 8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 7 minutes   Running        worker2
    5. c7a7tcdq5s0uk3qr88mf8xco6  helloworld.2  helloworld  alpine  Running 24 seconds  Running        worker1
    6. 6crl09vdcalvtfehfh69ogfb1  helloworld.3  helloworld  alpine  Running 24 seconds  Running        worker1
    7. auky6trawmdlcne8ad8phb0f1  helloworld.4  helloworld  alpine  Running 24 seconds  Accepted       manager1
    8. ba19kca06l18zujfwxyc5lkyn  helloworld.5  helloworld  alpine  Running 24 seconds  Running        worker2

    你可以看到swarm已经创建了4个新任务来把Alpline Linux实例缩放到5个。这些任务分布到swarm中的三个节点。其中一个运行在manager1上。
    4.在其中一个节点运行docker ps来查看运行的容器。
    如下示例显示任务运行在manager1上:

    1. $ docker ps
    2.  
    3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    4. 528d68040f95        alpine:latest       "ping docker.com"   About a minute ago   Up About a minute                       helloworld.4.auky6trawmdlcne8ad8phb0f1