创建集群
当运行命令创建集群时,Docker Engine将以集群模式运行。
运行docker swarm init 在当前节点上创建一个单节点集群。设置集群如下:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
- 将当前节点切换到集群模式
- 创建一个名为default的集群
- 将当前节点指定为集群的领导管理节点
- 使用主机名命名节点
- 配置管理者监听端口2377在活动的网络接口上
- 设置当前节点为Active状态,意味着可以从调度器接收任务
- 为参入集群的引擎启动内部分布式数据存储,来保持集群及其上运行的所有服务的一致性
- 默认情况下,为集群生成一个自签跟CA
- 默认情况下,为加入到集群的worker和manager节点生成一个令牌
- 创建一个名为ingress网络用于发布集群服务端口到外部
docker swarm init 命令输出了将新节点加入到集群的连接命令:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ 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网络。集群的其它节点必须能访问管理节点的宣告地址。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
如果没有指定地址,Docker将检查系统是否有单个IP地址,如果有,Docker默认使用这个IP地址来监听2377端口。如果有多个IP地址,必须明确指定--advertise-addr来启用管理者间通信和overlay网络。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ docker swarm init --advertise-addr <MANAGER-IP>
查看加入命令或者更新加入token
节点需要一个令牌来加入到集群。工作节点和管理节点的令牌是不同的。节点在加入集群时使用令牌。在节点加入到集群后,更新令牌不会影响集群成员资格。更新令牌可确保新加入的集群的节点无法使用旧的令牌。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
查看工作节点加入集群命令和令牌:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ 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.
查看管理节点加入集群命令和令牌:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ 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节点生成一个新的令牌。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$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使用。
- 管理节点增加容错能力。管理节点执行集群编排和管理功能。在所有管理节点中,会选择出一个领导者,来执行编排任务。当该领导者故障了,其余的管理节点选择出一个新的领导者,并恢复对集群状态的编排和管理。默认情况下,管理节点也运行任务。
加入工作节点
$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
docker swarm join命令执行以下操作:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
- 将当前节点上Docker Engine切换成集群模式
- 从管理者请求一个TLS证书
- 使用主机名命名节点
- 基于集群令牌将当前节点加入到管理者监听的集群中
- 设置当前节点状态为Active,意味着可以从调度器接收任务
- 将ingress网络扩展到当前节点
加入管理节点
加入操作过程与worker相同。新加入的管理节点也参入raft共识,现有的领导者仍然是集群领导者。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
Docker建议每个集群使用三个或者五个管理节点来实现高可用性。由于集群管理节点使用Raft共享数据,因此必须是奇数个管理节点。只要有一半以上的管理节点可用,集群才可以继续运行。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ docker swarm join \
--token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6 \
192.168.99.100:2377
This node joined a swarm as a manager.
在集群中管理节点
列出节点
在管理节点上执行docker node ls命令:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ 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列显示调度器是否可以将任务分配给该节点:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
- Active 调度器可以分配任务给该节点
- Pause 调度器不会向该节点分配新的任务,但是现有任务仍然运行
- Drain 调度器不会向该节点分配新的任务,同事,关闭现有任务,并在其他可用节点上运行他们
MANAGER STATUS列显示节点参入Raft共识:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
- 空值 表示是工作节点,不参入集群管理
- Leader 主管理节点对集群进行所有管理和编排
- Reachable 参入raft共识,如果领导者不可用,有资格被选举为新的领导者
- Unavailable 该管理节点无法与其它管理者通信。如果管理节点变为不可用,你要么新加入一个管理节点到集群,要么将一个工作节点提升为管理节点
查看单个节点
在管理节点上执行docker node inspect 命令查看单个节点详细信息。默认输出json格式,可使用--pretty人性化格式打印结果。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ 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
更新节点
可以修改节点属性:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
- 改变节点可用性
- 添加或者删除标签元数据
- 改变节点角色
更改节点可用性
- drain管理节点使其只关注与集群管理任务,不用于任务的分配
- drain节点使其下线维护
- pause节点使其不接收新的任务
- 恢复unavailable或者pause节点到可用状态
更改管理节点为Drain状态:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ docker node update --availability drain node-1
node-1
添加或者删除标签元数据
节点标签提供了节点组织的灵活方法。还可以在服务约束中使用节点标签。在创建服务时,将任务限制在满足标签的节点上。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
在管理节点上执行docker node update --label-add命令来为节点添加标签。--label-add 支持 或者 = 对。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
$ docker node update --label-add foo --label-add bar=baz node-1
node-1
升级或者降级节点
可以将工作节点升级为管理节点。也可以将管理节点降级为工作节点。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/
不管如果升级或者降级,都必须确保集群内法定人数的管理节点。
在管理节点上操作:
$ 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命令将其从群集中删除。
$ docker swarm leave
Node left the swarm.
当一个节点离开群集时,Docker Engine停止在群集模式下运行。协调者不再将任务调度到节点。
如果节点是管理节点,将收到关于维护法定人数的警告。要忽略该警告使用--force。如果最后一个管理节点退出集群,集群将变得不可用了。需要采取灾难恢复措施了。
节点退出集群后,可以在管理节点上执行docker node rm命令,从节点列表中删除该节点。
$ docker node rm node-2

评论