一、前提
1.在网络方面,需要在路由器和防火墙中开放如下端口:
- 2377/tcp:用于客户端与 Swarm 进行安全通信。
- 7946/tcp 与 7946/udp:用于控制面 gossip 分发。
- 4789/udp:用于基于 VXLAN 的覆盖网络。
2.每个节点都需要安装docker,并且能够与 Swarm 的其他节点通信。
二、初始化 Swarm
初始化第一个管理节点 -> 加入额外的管理节点 -> 加入工作节点 -> 完成。
示例包含 3 个管理节点(m1,m2,m3)和 3 个工作节点(w1,w2,w3),可根据需要自行调节。
1.初始化管理节点
登录m1,在 m1 上执行 docker swarm init
命令,会初始化一个新的 Swarm,并将自身设置为第一个管理节点;
$ docker swarm init
Swarm initialized: current node (etrbzwgp7npvlgwuqyv3qs9he) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-1bmlq98xom4s7yvgcc14gy4hd X.X.X.X:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在 m1 上执行 docker node ls
命令,列出 Swarm 中的节点此时m1作为Swarm 中唯一的节点,并且作为 Leader;
在 m1 上执行 docker swarm join-token
命令,用来获取添加新的工作节点和管理节点到 Swarm 的命令和 Token;
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-1bmlq98xom4s7yvgcc14gy4hd X.X.X.X:2377
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-a5rbcczr6qddzoae402n4nmjd X.X.X.X:2377
2.加入管理节点
分别登录m2,m3,执行
docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-a5rbcczr6qddzoae402n4nmjd X.X.X.X:2377
$ docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-a5rbcczr6qddzoae402n4nmjd X.X.X.X:2377
This node joined a swarm as a manager.
3.加入工作节点
分别登录w1,w2,w3,执行
docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-1bmlq98xom4s7yvgcc14gy4hd X.X.X.X:2377
$ docker swarm join --token SWMTKN-1-12zoaeu59wmxemqosdx8fu4ueqqp5cuos9k4jo8whoixypmdfg-1bmlq98xom4s7yvgcc14gy4hd X.X.X.X:2377
This node joined a swarm as a worker.
4.完成
在任意一个管理节点上执行 docker node ls
命令来列出 Swarm 节点。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
etrbzwgp7npvlgwuqyv3qs9he * iZ2ze9u81t8mufyn3qrv1oZ Ready Active Leader 20.10.6
......
......
......
......
......
至此,已经成功创建了 6 个节点的 Swarm,其中包含 3 个管理节点和 3 个工作节点。
三、节点标签
1.添加标签
在任意一个管理节点上执行 docker node update --label-add lableName=lable HOSTNAME
命令来给节点加标签。
$ docker node update --label-add role=web iZ2ze9u81t8mufyn3qrv1oZ
iZ2ze9u81t8mufyn3qrv1oZ
2.查看标签
执行 docker node inspect HOSTNAME
命令去查看节点标签。
$ docker node inspect iZ2ze9u81t8mufyn3qrv1oZ
[
{
"ID": "etrbzwgp7npvlgwuqyv3qs9he",
"Version": {
"Index": 24
},
"CreatedAt": "2021-06-16T09:57:05.865315794Z",
"UpdatedAt": "2021-06-17T06:16:28.962012984Z",
"Spec": {
"Labels": {
"role": "web" # 人工添加的标签
},
"Role": "manager",
"Availability": "active"
},
......
至此,节点标签已配置完成。节点标签只在 Swarm 集群之内生效。
3.删除标签
执行 docker node update --label-rm lableName HOSTNAME
命令可以删除标签。
$ docker node update --label-rm role iZ2ze9u81t8mufyn3qrv1oZ
iZ2ze9u81t8mufyn3qrv1oZ
四、服务发布
服务发布时添加约束条件,使服务能够部署到指定的服务器上。
version: '3.3'
services:
node1:
......
deploy:
placement:
constraints:
- node.labels.role == web