Docker Swarm集群管理/容器编排
- Swarm是一个Docker(现在叫Moby)官方提供的一个安全的docker容器集群管理工具,一个微服务应用编排引擎。它通过将容器(container)抽象为服务(service),从而使多个节点(node)成为一个整体对外进行服务。
- 实现中所使用的镜像及项目git地址:https://github.com/zydp/WeatherInfos
以下实验是我在本地环境中,对swarm集群进行一些常规的操作。
- 我的测试环境
IP: 192.168.6.75 HostName: cs-compiler Role: leader
IP: 192.168.6.103 HostName: machine12 Role: worker
IP: 192.168.6.93 HostName: machine13 Role: worker
- 准备工作
首先将3台测试机器docker daemon安装好,并确保测试机之间相互能够访问。
防火墙上提前打开端口:
2377/tcp 用于客户端与 Swarm 进行安全通信
7946/tcp 用于控制面 gossip 分发
7946/udp 用于控制面 gossip 分发
4789/udp 用于基于 VXLAN 的覆盖网络
- 防火墙操作命令
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload
-
在leader上进行swarm集群的初始化
swarm初始化输出
docker swarm init --advertise-addr 192.168.6.75 // --advertise-addr 集群的交互地址
-
图中提到两点,为集群添加worker使用命令:
docker swarm join --token SWMTKN-1-2abkt4nbd49eop3jurvdiu27iweak5801fnwu52rvn8tx3ov7y-1pag0z4e2jchm4fgfxwsjt9h5 192.168.6.75:2377 -
为集群添加manager,执行docker swarm join-token manager并根据提示操作
添加集群worker或是manager是跟据对应不同的join-token去分辨的,我的测试环境中,只预备一台manager。因此,此处不对添加manager进行探讨 -
使用 docker node ls 查看集群中的节点
节点状态
-
可以看到此时集群中只有一个可用的节点,使用命令将另外两台worker也加入到集群中
worker1: machine12 machine12 worker2:machine13 machine13
- 加入worker以后的集群节点状态 节点状态
-
此时我们可以为该集群创建service并对外提供调用服务了
docker service create --name weather -p 3244:3244 erfengd/weather:latest
创建service
--name 指定服务的名称
-p 指定对外提供服务的端口
erfengd/weather 镜像名
该条命令大意为:使用镜像erfengd/weather创建一个命为weather的服务,该服务使用物理机的3244端口映射到容器的3244端口。 erfengd/weather是我提交到docker-hub的一个天气数据查询的镜像,开箱即用。
- 查看服务状态 docker service ls & docker service ps weather
docker service ls 查看集群中服务的列表
查看服务状态 注意
docker service ps weather 查看单个服务的概况
当service创建成功时,创建命令中使用-p 所指定的端口,在集群中 所有节点 上都会被占用。
worker1 worker2
并且在manager上,此时已有一个容器在运行中。该容器使用创建服务时所指定的镜像创建 工作容器
- 扩展集群副本
通过图<查看服务状态>可以看到,此时该集群中只有一个service,且该service只有一个节点副本,该节点的hostname是cs-compiler,状态是Running。
此时我们对该服务进行扩展,使用命令 docker service scale weather=3 。使用该命令将该服务的副本伸缩到3节点,如下图: 扩展节点副本 此时我们使用 docker service ls & docker service ps weather 查看service的状态: 扩展后的service状态 - 下面我们对该集群服务进行测试
- 首先我们检索节点日志,以便得知该节点被请求。
使用命令 docker exec [containerID] tail -f ./logs/wearth.log
节点日志检索
- 使用测试工具Apache Jmeter 进行并发访问,用以监测swarm service对worker节点的调度是否均匀
Apache Jmeter 请求详情 使用该测试用例,我们在5秒内对swarm中weather service 进行10*10*100次请求 //线程数*请求用例*循环次数 聚合报告 日志检索 从日志中可以看到,10000次请求被分配到weather service所涵盖的3个节点中,并且节点均工作正常。
- 在这里顺道提一下docker swarm 的调度策略,swarm的调度策略共分三种:
spread 优先选择CPU、MEM占用率底的节点(default)
binpack 尽量的将某一个节点全占满(与spread相反)
random 随机选择一个节点(多用在测试环境)
在使用swarm manager时可以使用--strategy选项进行指定。官方传送门
- 节点自动恢复(HA)
使用命令docker stop e24db70fdbbd 在worker1(machine12)上停止容器后,docker swarm会瞬间再拉起一个容器进行恢复。使用docker ps -a查看容器,则可看到新服务被拉起的过程
容器被拉起 在服务详情中,也可见到节点machine12掉线一次,且被恢复后machine12的状态为running
service详情
以上。