构建微服务实验环境(二):Docker Swarm 集群
【摘要】微服务架构目前最流行的方案(最佳实践)是容器集群。AWS 的 ECS、Docker 的 Swarm、google 的 Kubernetes(K8s),apache 的 mesos,包括 Rancher Labs 的 Rancher 。 建议使用 AWS 或 阿里云 等共有云部署,会有更多技术支持,让你体验不同方案的优势。这里仅为了让你更好理解容器集群工作原理,介绍在 Centos 集群上部署 Swarm、K8s、 Rancher 的方案。
(1)容器与应用: 讲述 centos docker的安装,仓库、镜像、容器、服务的概念, dockerfile,compose 文件,容器管理图形界面,以单机操作为主线。
(2)Docker Swarm 集群:讲述集群(cluster)manager,worker,node 的概念与应用在集群部署。重点讲述容器网络、存储管理、集群管理、服务发现等知识。
(3)Rancher 管理平台:讲述多租户多主机容器运行管理平台 Rancher 的租户、环境、主机、环境模板概念与应用。包括 Rancher 自带集群管理 Cattle 的栈、服务的管理,需要读者对比与Docker Swarm 集群在容器基础服务、管理方式方面的差异
1、Docker Swarm 体验
docker swarm 是 Docker 公司的一个开源项目。自 v1.12.3 以来, docker swarm 成为 docker 引擎内置的服务。它和谷歌的 K8s 产生了直接竞争。很难说哪个好,对于熟悉 docker 容器的人来说,docker swarm 应该友好一些。
本部分内容主要来自 docker 官网 Get Started, Part 4~5
1.1 了解集群(Swarm clusters)
群集是一组运行 Docker 的计算机组成,其中部分机器是集群管理机(Swarm Manager) ,其他的是工作机(Worker)。在集群中,在 Manager 机器上使用 Docker 命令,会在群集上执行。群集中的机器可以是物理机或虚拟机。加入群集后,它们被统称节点(Node)。
Swarm管理机可以使用几种策略来运行容器,例如“最空闲节点”- 容器会填充最少使用的机器。或“全局策略”,它确保每个机器能只能获得指定容器的一个实例。您可以将这些策略写在 docker-compose.yml 这样的服务组合定义文件中,Swarm管理机会按策略部署。
Swarm Manager是群集中唯一可以执行 docker 命令的机器,或授权其他机器作为工人机(worker)加入群集。worker 只是提供能力,没有权力指挥其他机器工作。
如果您已经熟悉单主机中使用Docker。现在,可切换到 Docker 集群模式。启用群组模式(swarm mode)使当前的机器成为群组管理机。这时,这台 Docker 将运行管理这个群集的指令,而不再是在当前的机器上运行。
主要概念:
- Swarm Manager 集群的管理者
- worker 集群中的执行者
- Node 集群中任意的 docker 机器
- Swarm mode 集群模式, docker 机器的状态
1.2 配置集群
(1) 准备机器
1) 清理 docker-master 机器
- 清理所有的容器
docker rm -f $(docker ps -q)
- 退出可能的集群状态
docker swarm leave --force
- 删除从仓库下载的实验用镜像
docker rmi registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:friendlyhello
2) 复制 docker-master 生成 workers
关闭 docker-master ,以它为模板,用 VBox 链接复制 workers,配置如下:
- docker-worker1:配置 192.168.56.111/24;主机名=“docker-worker1”
- docker-worker2:配置 192.168.56.112/24;主机名=“docker-worker2”
配置完成后,一般用无界面模式启动,用 ssh登陆
(2)创建 docker 集群
1) 创建第一个 Manager
ssh 连接 docker-master 机器上,启动 docker swarm mode :
# docker swarm init --advertise-addr 192.168.56.110
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0o8kwg6rwcsyllo8yr4x24t304wtjvh01h1mq3jhcxi1qy5qrl-00hvxabe2qpuwyh4odii07omo \
192.168.56.110:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这时,manager 将在端口 192.168.56.110:2377
侦听集群节点请求。
docker swarm join-token worker
显示作为 worker 加入该集群的指令docker swarm join-token manager
显示作为 manager 加入该集群的指令
2) 将两个 worker 分别加入集群
分别用 ssh 连接两个 worker 。贴入 manager 上 docker swarm join-token worker
显示的指令, 格式如下:
docker swarm join \
--token <token> \
<ip>:<port>
This node joined a swarm as a worker.
这时,我们的第一个集群就建完了。
提示, 如果因为防火墙,无法加入集群,可使用以下命令关闭防火墙:
setenforce 0
systemctl disable iptables-services firewalld
systemctl stop iptables-services firewalld
3) 在 manager 上检查结果,这时使用 docker node
指令组
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
srm9pnuj0zum7z79xb8ptnmdi * docker-master Ready Active Leader
vhrpxjbbu3ijt84t6c9cm2t64 docker-worker2 Ready Active
yzzt6k9rfcrti19ergdpde77u docker-worker1 Ready Active
在 manager 启动 Portainer 容器
在浏览器中, Swarm 菜单看到类似的结果。
1.3 在集群中部署服务和使用服务
(1) 部署服务
我们在 docker-master 机器上执行同样的部署命令
docker stack deploy -c docker-compose.yml myservice
检查结果:
# docker stack ps myservice
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE