Docker学习(10) Docker Swarm
- Swarm有两个核心组件
- 安全集群
- 编排引擎
Docker Swarm——简介
- Docker Swarm包含两个方面:
- 企业级的docker的安全集群
- 微服务应用的编排引擎
集群方面
- 将一个或多个docker节点组织起来,使得用户能够以集群的方式管理
- Swarm默认内置:
- 分布式集群存储、加密网络、公用TLS、安全集群接入令牌、
- 一套简化的数字证书管理的API
- 用户可以添加或删除节点
编排方面:
- 提供一套丰富的API使得部署和管理的微服务应用变得简单
- 通过将应用定义在声明式配置文件中,可以使用原生的docker完成部署。
- 可以执行滚动升级,回滚以及扩缩容操作。
Docker Swarm——详解
Swarm介绍
- Swarm是由一个或多个docker节点组成的
- 节点被分配为管理节点(Manager)或工作节点(Worker)
- 管理节点负责集群的控制面——进行诸如监控集群状态、分发任务至工作节点
- 工作节点负责接收管理节点的任务并执行。
- Swarm的配置和状态信息保存在一套位于所有管理节点的分布式etcd数据库中,该数据库运行于内存中,并保存数据的最近状态。
- Swarm使用的TLS进行通讯加密,节点认证和角色授权,在后台运行。
搭建Swarm安全集群
- 3个管理节点和3个工作节点
主机名 | IP |
---|---|
mgr1 | 192.168.13.138 |
mgr2 | 192.168.13.139 |
mgr3 | 192.168.13.140 |
wrk1 | 192.168.13.141 |
wrk2 | 192.168.13.142 |
wrk3 | 192.168.13.143 |
- 每个节点安装docker,并且可以相互通信。配置域名解析
lhf@mgr1:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 mgr1
mgr1 192.168.13.138
mgr2 192.168.13.139
mgr3 192.168.13.140
wrk1 192.168.13.141
wrk2 192.168.13.142
wrk3 192.168.13.143
- 网络方面需要在路由器和防火墙开放端口
- 2377/tcp:用于客户端与docker进行通讯
- 7946/tcp与7946/udp:用于控制面gossip分发
- 4789/udp:用于基于VXLAN的覆盖网络
- 搭建Swarm称之为初始化Swarm,大体流程
- 初始化第一个管理节点——加入额外的管理节点——加入工作节点
- 初始化一个全新的管理节点
- 不包含任何swarm中的docker节点,称之为单引擎模式。一旦加入swarm集群,就切换到swarm模式
- 将mgr1初始化为一个全新的swarm
lhf@mgr1:~$ docker swarm init \
> --advertise-addr 192.168.13.138:2377 \
> --listen-addr 192.168.13.138:2377
Swarm initialized: current node (jnx5231xf6jpjuqo5hyzjo5x4) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9kyktqukrh19zf3wv2coc3hld 192.168.13.138:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- docker swarm init 将自身设置为第一个管理节点。同时使用该节点启动swarm模式
- --advertise-addr 指定其他节点来连接当前管理节点的IP和端口
- --listen-addr 指定用于承载Swarm流量的IP和端口
- 列出swarm的节点
lhf@mgr1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
jnx5231xf6jpjuqo5hyzjo5x4 * mgr1 Ready Active Leader 19.03.4
- 添加新的工作节点和管理节点
lhf@mgr1:~$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9kyktqukrh19zf3wv2coc3hld 192.168.13.138:2377
lhf@mgr1:~$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9624stu8q8fy2c46227704t9v 192.168.13.138:2377
- 登录到wrk1节点,使用包含工作节点接入Token的docker swarm join命令接入Swarm
lhf@wrk1:~$ docker swarm join \
> --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9kyktqukrh19zf3wv2coc3hld \
> 192.168.13.138:2377 \
> --advertise-addr 192.168.13.141:2377 \
> --listen-addr 192.168.13.141:2377
This node joined a swarm as a worker.
- 在wrk2和wrk3重复上述操作将两个节点作为工作节点加入Swarm中
- wrk2节点
lhf@wrk2:~$ docker swarm join \
> --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9kyktqukrh19zf3wv2coc3hld \
> 192.168.13.138:2377 \
> --advertise-addr 192.168.13.142:2377 \
> --listen-addr 192.168.13.142:2377
This node joined a swarm as a worker.
- wrk3节点
lhf@wrk3:~$ docker swarm join \
> --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9kyktqukrh19zf3wv2coc3hld \
> 192.168.13.138:2377 \
> --advertise-addr 192.168.13.143:2377 \
> --listen-addr 192.168.13.143:2377
This node joined a swarm as a worker.
- 登录到mgr2节点,使用含有管理节点接入Token的docker swarm join命名,将该节点作为管理节点接入swarm中
liu@mgr2:~$ docker swarm join \
> --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9624stu8q8fy2c46227704t9v \
> 192.168.13.138:2377 \
> --advertise-addr 192.168.13.139:2377 \
> --listen-addr 192.168.13.139:2377
This node joined a swarm as a manager.
- mgr3重复上述操作
lhf@mgr3:~$ docker swarm join \
> --token SWMTKN-1-4melegr14a21wwq6rlxdh5rv7b6pynyqxpzfol4av05ezjs1ts-9624stu8q8fy2c46227704t9v \
> 192.168.13.138:2377 \
> --advertise-addr 192.168.13.140:2377 \
> --listen-addr 192.168.13.140:2377
This node joined a swarm as a manager.
- 在任意管理节点列出swarm节点
liu@mgr2:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
jnx5231xf6jpjuqo5hyzjo5x4 mgr1 Ready Active Leader 19.03.4
8fz1q5m545389ddzc7p78c5kz * mgr2 Ready Active Reachable 19.03.4
paoy4urdcsjwwstrkvkekf7vu mgr3 Ready Active Reachable 19.03.4
kpeq1aqk4s99fe5d5tv1mydsd wrk1 Ready Active 19.03.4
29jhfuheqfhfetwchyeyk3ohb wrk2 Ready Active 19.03.4
3d2zo2em16qij9tmdxo2k9cvv wrk3 Ready Active 19.03.4
-
MANAGER STATUS一列显示三个管理节点分别为"Leader"和"Reachable"
*号表示当前在哪个节点执行的命令
Swarm管理节点高可用性(HA)
- swarm管理节点内置了HA的特性——即使一个或多个节点发生故障,剩余的节点也会保持swarm的运转
- Swarm实现了一种主从方式的多管理节点的HA——主节点(Leader)唯一对Swarm发送控制命令的节点
- 部署HA的原则:
- 部署奇数个管理节点
- 不要部署太多管理节点
- 部署奇数个管理节点有利于减少脑裂:假如有4个管理节点,当网络发生分区时,可能每个分区有两个管理节点,每个分区都知道曾经有4个人节点。但是当前网络仅有2个节点,每个分区不发指定其他两个节点是否正常运行,无法得知本分区是否掌握多数。
内置的Swarm的安全机制
- Swarm集群内置的很多安全机制——提供了开箱即用的默认配置:CA设置、接入Token、公用TLS、加密集群存储、加密网络、解密节点ID
锁定Swarm
-
Docker提供了自动锁机制来锁定Swarm,强制要求重启的管理节点提供一个集群解码锁才有权接入集群
-
在某个管理节点开启锁
liu@mgr2:~$ docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the `docker swarm unlock`
command and provide the following key:
SWMKEY-1-7qbru6TtXAOrutSvSQIvP+lNgYTmGk05+avDIQEN4Pk
Please remember to store this key in a password manager, since without it you
will not be able to restart the manager.
-
将解码锁保存起来
-
重启某个管理节点,查看是否能够自动接入集群
lhf@mgr3:~$ sudo service docker restart
lhf@mgr3:~$ docker node ls
Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used. Please use "docker swarm unlock" to unlock it.
- 执行docker swarm unlock 命令来重启管理节点解锁swarm,同时需要提供解码锁
lhf@mgr3:~$ docker swarm unlock
Please enter unlock key:
lhf@mgr3:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
jnx5231xf6jpjuqo5hyzjo5x4 mgr1 Ready Active Leader 19.03.4
8fz1q5m545389ddzc7p78c5kz mgr2 Ready Active Reachable 19.03.4
paoy4urdcsjwwstrkvkekf7vu * mgr3 Ready Active Reachable 19.03.4
kpeq1aqk4s99fe5d5tv1mydsd wrk1 Ready Active 19.03.4
29jhfuheqfhfetwchyeyk3ohb wrk2 Ready Active 19.03.4
3d2zo2em16qij9tmdxo2k9cvv wrk3 Ready Active 19.03.4
网友评论