- A+
创建集群
当运行命令创建集群时,Docker Engine将以集群模式运行。
运行docker swarm init 在当前节点上创建一个单节点集群。设置集群如下:
- 将当前节点切换到集群模式
- 创建一个名为default的集群
- 将当前节点指定为集群的领导管理节点
- 使用主机名命名节点
- 配置管理者监听端口2377在活动的网络接口上
- 设置当前节点为Active状态,意味着可以从调度器接收任务
- 为参入集群的引擎启动内部分布式数据存储,来保持集群及其上运行的所有服务的一致性
- 默认情况下,为集群生成一个自签跟CA
- 默认情况下,为加入到集群的worker和manager节点生成一个令牌
- 创建一个名为ingress网络用于发布集群服务端口到外部
docker swarm init 命令输出了将新节点加入到集群的连接命令:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ docker swarm init Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
配置宣告地址
管理节点使用宣告地址来运行集群中其它节点访问Swarmkit API和overlay网络。集群的其它节点必须能访问管理节点的宣告地址。
如果没有指定地址,Docker将检查系统是否有单个IP地址,如果有,Docker默认使用这个IP地址来监听2377端口。如果有多个IP地址,必须明确指定--advertise-addr来启用管理者间通信和overlay网络。
1 |
$ docker swarm init --advertise-addr <MANAGER-IP> |
查看加入命令或者更新加入token
节点需要一个令牌来加入到集群。工作节点和管理节点的令牌是不同的。节点在加入集群时使用令牌。在节点加入到集群后,更新令牌不会影响集群成员资格。更新令牌可确保新加入的集群的节点无法使用旧的令牌。
查看工作节点加入集群命令和令牌:
1 2 3 4 5 6 7 8 9 |
$ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 This node joined a swarm as a worker. |
查看管理节点加入集群命令和令牌:
1 2 3 4 5 6 7 |
$ docker swarm join-token manager To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 |
执行docker swarm join-token --rotate 命令来为worker或者manager节点生成一个新的令牌。
1 2 3 4 5 6 7 |
$docker swarm join-token --rotate worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \ 172.17.0.2:2377 |
加入节点到集群
- 添加工作节点会增加容量。当将服务部署到集群时,引擎调度任务到可用节点上,不管是工作节点还是管理节点。当工作节点加入到集群时,可扩展集群处理任务规模不会影响管理者raft使用。
- 管理节点增加容错能力。管理节点执行集群编排和管理功能。在所有管理节点中,会选择出一个领导者,来执行编排任务。当该领导者故障了,其余的管理节点选择出一个新的领导者,并恢复对集群状态的编排和管理。默认情况下,管理节点也运行任务。
加入工作节点
1 2 3 4 5 |
$ docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 This node joined a swarm as a worker. |
docker swarm join命令执行以下操作:
- 将当前节点上Docker Engine切换成集群模式
- 从管理者请求一个TLS证书
- 使用主机名命名节点
- 基于集群令牌将当前节点加入到管理者监听的集群中
- 设置当前节点状态为Active,意味着可以从调度器接收任务
- 将ingress网络扩展到当前节点
加入管理节点
加入操作过程与worker相同。新加入的管理节点也参入raft共识,现有的领导者仍然是集群领导者。
Docker建议每个集群使用三个或者五个管理节点来实现高可用性。由于集群管理节点使用Raft共享数据,因此必须是奇数个管理节点。只要有一半以上的管理节点可用,集群才可以继续运行。
1 2 3 4 5 |
$ docker swarm join \ --token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6 \ 192.168.99.100:2377 This node joined a swarm as a manager. |
在集群中管理节点
列出节点
在管理节点上执行docker node ls命令:
1 2 3 4 5 6 7 8 |
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 46aqrk4e473hjbt745z53cr3t node-5 Ready Active Reachable 61pi3d91s0w3b90ijw3deeb2q node-4 Ready Active Reachable a5b2m3oghd48m8eu391pefq5u node-3 Ready Active e7p8btxeu3ioshyuj6lxiv6g0 node-2 Ready Active ehkv3bcimagdese79dn78otj5 * node-1 Ready Active Leader |
AVAILABILITY列显示调度器是否可以将任务分配给该节点:
- Active 调度器可以分配任务给该节点
- Pause 调度器不会向该节点分配新的任务,但是现有任务仍然运行
- Drain 调度器不会向该节点分配新的任务,同事,关闭现有任务,并在其他可用节点上运行他们
MANAGER STATUS列显示节点参入Raft共识:
- 空值 表示是工作节点,不参入集群管理
- Leader 主管理节点对集群进行所有管理和编排
- Reachable 参入raft共识,如果领导者不可用,有资格被选举为新的领导者
- Unavailable 该管理节点无法与其它管理者通信。如果管理节点变为不可用,你要么新加入一个管理节点到集群,要么将一个工作节点提升为管理节点
查看单个节点
在管理节点上执行docker node inspect 命令查看单个节点详细信息。默认输出json格式,可使用--pretty人性化格式打印结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ docker node inspect self --pretty ID: ehkv3bcimagdese79dn78otj5 Hostname: node-1 Joined at: 2016-06-16 22:52:44.9910662 +0000 utc Status: State: Ready Availability: Active Manager Status: Address: 172.17.0.2:2377 Raft Status: Reachable Leader: Yes Platform: Operating System: linux Architecture: x86_64 Resources: CPUs: 2 Memory: 1.954 GiB Plugins: Network: overlay, host, bridge, overlay, null Volume: local Engine Version: 1.12.0-dev |
更新节点
可以修改节点属性:
- 改变节点可用性
- 添加或者删除标签元数据
- 改变节点角色
更改节点可用性
- drain管理节点使其只关注与集群管理任务,不用于任务的分配
- drain节点使其下线维护
- pause节点使其不接收新的任务
- 恢复unavailable或者pause节点到可用状态
更改管理节点为Drain状态:
1 2 3 |
$ docker node update --availability drain node-1 node-1 |
添加或者删除标签元数据
节点标签提供了节点组织的灵活方法。还可以在服务约束中使用节点标签。在创建服务时,将任务限制在满足标签的节点上。
在管理节点上执行docker node update --label-add命令来为节点添加标签。--label-add 支持 或者 = 对。
1 2 3 |
$ docker node update --label-add foo --label-add bar=baz node-1 node-1 |
升级或者降级节点
可以将工作节点升级为管理节点。也可以将管理节点降级为工作节点。
不管如果升级或者降级,都必须确保集群内法定人数的管理节点。
在管理节点上操作:
1 2 3 4 5 6 7 8 9 |
$ 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. $ docker node demote node-3 node-2 Manager node-3 demoted in the swarm. Manager node-2 demoted in the swarm. |
docker node promote 和 docker node demote 命令可以分别使用 docker node update --role manager 和 docker node update --role worker 来代替。
退出集群
在节点上运行docker swarm leave命令将其从群集中删除。
1 2 3 |
$ docker swarm leave Node left the swarm. |
当一个节点离开群集时,Docker Engine停止在群集模式下运行。协调者不再将任务调度到节点。
如果节点是管理节点,将收到关于维护法定人数的警告。要忽略该警告使用--force。如果最后一个管理节点退出集群,集群将变得不可用了。需要采取灾难恢复措施了。
节点退出集群后,可以在管理节点上执行docker node rm命令,从节点列表中删除该节点。
1 |
$ docker node rm node-2 |
