Swarm Cluster

Swarm cluster集群是一组运行Docker并加入到集群中的机器。之后可继续执行docker命令,不过现在它们是由集群管理器在集群上执行。集群中的机器可以是物理的,也可以是虚拟的,加入集群后被称为节点。

可以使用不同的策略来控制容器运行的节点。确保每台机器只获得指定容器的一个实例。

节点类型
  • managers
  • workers

swarm-diagram.png

managers节点
  • 是集群中唯一能够执行命令的机器
  • 维护集群状态
  • 调度services
  • swarm 模式HTTP API端点

swarm 管理器使用 Raft 来实现维护整个 swarm 集群一致的内部状态
如果是测试的目的可以只运行一个 swarm 管理节点。如果单管理器的 swarm 出问题下线了,服务仍然会运行,不过你需要创建一个新的集群来恢复它。
要利用 swarm 模式的容错功能,建议创建奇数的管理节点。当有多个管理节点时,如果一个leader节点宕机,其余的manager节点将选择一个新的leader,并恢复集群状态的编排和维护。默认情况下,管理器节点也运行任务。

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

Worker 节点是 Docker Engine 的实例,其唯一目的是运行容器。 Worker 节点不参与Raft 分布状态,不作调度的决策或提供 swam 模式的 HTTP API 服务。
为了防止调度程序将任务放置在多节点集群中的管理器节点上,可以将manager节点的状态设为Drain ,调度程序优雅地停止节点上的任务,并在活动节点上调度任务。调度程序不会将新任务分配给状态为Drain的节点。

改变节点角色

当管理节点下线时可能会想把 worker 节点提升为管理节点,可以通过docker node promote 来把一个 worker 节点提升为管理节点 详细信息

也可以把管理节点降级为worker节点 详细信息


创建一个集群

启动一个swarm manager节点
  1. 添加docker damon的网络监听

    [root@localhost ~]# vim /usr/lib/systemd/system/docker.service
    
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock
  2. 初始化swarm manager节点

    [root@localhost ~]# docker swarm init --advertise-addr 192.168.126.128
    Swarm initialized: current node (ne4zc6ntfqi608w0svyd8u68h) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    [root@localhost ~]# 
    
    --advertise-addr 允许集群中的其他节点访问Swarmkit API和覆盖网络。swarm中的其他节点必须能够访问此地址。
    
    以worker节点加入集群的命令可以通过 docker swarm join-token worker 获得
    以manager节点加入集群的命令可通过docker swarm join-token manager 获得
    
    • 将当前节点切换到群集模式。
    • 创建一个名为default的集群。
    • 指定当前节点为群集的leader manager节点。
    • 用机器主机名命名节点。
    • 将管理器配置为监听端口2377上的活动网络接口。
    • 将当前节点设置为Active,这意味着它可以从调度程序接收任务。
    • 为参与集群的引擎启动内部分布式数据存储,以维护集群及其上运行的所有服务的一致视图。
    • 默认情况下,为群集生成一个自签名根CA。
    • 默认情况下,为worker和manager节点生成令牌以加入集群。
    • 创建一个名为ingress的覆盖网络,用于发布集群外部的服务端口。
    • 为您的网络创建一个覆盖的默认IP地址和子网掩码

2376 docker守护进程端口
2377 集群管理端口

添加一个工作节点
  1. 添加docker damon的网络监听 略
  2. 加入集群

    [root@localhost ~]# docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377
    This node joined a swarm as a worker.
    [root@localhost ~]# 
    docker swarm join命令执行以下操作
    • 将当前节点上的Docker引擎切换到群集模式。
    • 从管理器请求TLS证书
    • 用机器主机名命名节点
    • 基于swarm令牌在manager监听地址上将当前节点连接到swarm。
    • 将当前节点设置为活动可用性,这意味着它可以从调度程序接收任务。
    • 将入口覆盖网络扩展到当前节点。
查看集群
  1. 在swarm manager节点执行

    [root@localhost ~]# docker node ls
    ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    l2o08alsqh7az4d4tov1pwjcw     localhost.localdomain   Ready               Active                                  18.09.6
    ne4zc6ntfqi608w0svyd8u68h *   localhost.localdomain   Ready               Active              Leader              18.09.6
    AVAILABILITY 表示调度程序是否可以将任务分配给节点
    • Active 可以将任务分配给节点
    • Pause 调度程序不向节点分配新任务,但现有的任务仍然运行
    • Drain 调度程序不向节点分配新任务,已经存在的任务也将被调用到Active节点上
    MANAGER STATUS
    没有值表示不参与群集管理的工作节点
    • Leader 为集群做出所有的集群管理和编排决策
    • Reachable 表示节点参与Raft仲裁的manager节点。如果leader节点不可用,则该节点有资格成为新的leader
    • Unavailable 表示节点是一个无法与其他manager通信的节点。如果manager节点变为此状态应该加入一个新的manager节点到集群中,或者将一个工作节点提升为一个manager
查看节点详细信息
  1. docker node inspect

    docker node inspect self --pretty (查看当前节点的详细信息)
    
    [root@node1 ~]# docker node inspect i8so3iawiupkswhqsguiw7l91 --pretty
    ID:         i8so3iawiupkswhqsguiw7l91
    Hostname:               node2
    Joined at:              2019-06-11 04:46:29.827796972 +0000 utc
    Status:
     State:         Ready
     Availability:          Active
     Address:       192.168.49.136
    Manager Status:
     Address:       192.168.49.136:2377
     Raft Status:       Reachable
     Leader:        No
    Platform:
     Operating System:  linux
     Architecture:      x86_64
    Resources:
     CPUs:          1
     Memory:        1.777GiB
    Plugins:
     Log:       awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
     Network:       bridge, host, macvlan, null, overlay
     Volume:        local
    Engine Version:     18.09.6
    TLS Info:
     TrustRoot:
    -----BEGIN CERTIFICATE-----
    MIIBaTCCARCgAwIBAgIUdZKOgCJWeabnUvO3g/aPe9dO040wCgYIKoZIzj0EAwIw
    EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTkwNjExMDMwNTAwWhcNMzkwNjA2MDMw
    NTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
    A0IABCIrZHQWBQCOmVZ1wk3iz5dUSSinyK5+O/2kI/SP0dFhyYkV3fwQTIjRp3xg
    5gHkosPXJzsWD28ozkV4Gmlx9gWjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
    Af8EBTADAQH/MB0GA1UdDgQWBBRBQ7wdTOzgK8zl15i4+GKYM2GJSDAKBggqhkjO
    PQQDAgNHADBEAiAtkLmwd2f7gADeyX82Yc/0KjJOmQnVQkOsZuP+rdVQjwIgLd52
    yom4uvNZpJ7O3u7uNi/dO7fB5v8tGjZ+Vm3Ouo8=
    -----END CERTIFICATE-----
    
     Issuer Subject:    MBMxETAPBgNVBAMTCHN3YXJtLWNh
     Issuer Public Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIitkdBYFAI6ZVnXCTeLPl1RJKKfIrn47/aQj9I/R0WHJiRXd/BBMiNGnfGDmAeSiw9cnOxYPbyjORXgaaXH2BQ==
    
更新节点属性
  • 改变节点可用性
  • 添加或删除标签元数据
  • 更改节点角色
改变节点可用性
  • 清空管理节点,以便只执行swarm管理任务,并且无法进行任务分配。
  • 清空一个节点,以进行维护。
  • 暂停节点,使其无法接收新任务。
  • 恢复不可用节点或暂停节点的可用状态。
举例:

[root@node1 ~]# docker node update --availability drain node1
node1
Add or remove label metadata

节点标签提供了一种灵活的节点组织方法。可以再服务中使用节点标签,以限制task分配的节点。
在manager节点上运行docker node update --label-add 向节点添加标签元数据。--label-add支持 或者=

[root@node1 ~]# docker node update --label-add aaa --label-add bbb=222 --label-add ccc node1
node1

--label-add 可以多次使用
Promote or demote a node

可以将节点角色有worker节点升为manager节点,或者将manager节点降级为worker节点。

【注意】无论提升或降级节点的原因是什么,都必须始终维护集群中管理器节点的仲裁。

  1. 若要提升一个或一组节点,从manager节点运行docker node promote:

    $ docker node promote node-3 node-2
    
    Node node-3 promoted to a manager in the swarm.
    Node node-2 promoted to a manager in the swarm.
  2. 要降级一个或一组节点,从manager节点运行docker node demote:

    $ docker node demote node-3 node-2
    
    Manager node-3 demoted in the swarm.
    Manager node-2 demoted in the swarm.
脱离集群
  1. 在node节点执行

    [root@localhost ~]# docker swarm leave
    Node left the swarm.
  2. 节点离开群集后,可以在manager点上运行docker节点rm命令,将节点从节点列表中删除。

    $ docker node rm node-2

集群配置完毕!

参考
https://docs.docker.com/engine/swarm/
https://blog.51cto.com/13555423/2310922

转载于:https://www.cnblogs.com/mldblue/articles/10990921.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐