Docker Swarm集群部署(二)

目录

1.docker swarm介绍

swarm是docker社区提供的一个原生的支持Docker集群管理的工具,可以把多个docker主机组成的系统转换为单一的Docker主机,使得容器可以组成跨主机的子网网络,用户把集群中所有的docker engine整合进一个虚拟engine资源池,通过命令与swarm进行交互,避免了和每一个docker engine进行交互,同时利用swarm的调度策略更有效的管理容器,更合理的利用主机资源

swarm基本架构

04swam1

swarm优势

  • 拓展性高,swarm可拓展性在1000个节点上运行50000个容器,同时性能较好
  • 调度灵活,在有限的资源情况下,可以通过调度容器来合理利用资源,内置的Scheduler支持多种过滤,包括标签,亲和性和容器部署策略binpack、spread、random
  • 高可用性,docker manager提供高可用性,可以创建多个swarm master节点和定制主master节点,如果一个master节点宕机,slave节点就会被升级为master节点,知道master节点回复正常,当某个节点出错,会将该节点容器调度到其他正常的节点上
  • swarm对docker api完全支持,这表示用户可以无缝衔接使用docker工具,比如docker cli、compose、trusted registry等
  • 可以通过docker-compose.yml文件方便的部署服务到swarm集群上

2.docker swarm概念

管理节点
大部分swarm命令只能在管理节点执行,节点退出集群的命令可以在对应节点执行,一个swarm集群可以有多个管理节点,但是只有一个管理节点能成为leader
多个管理节点能在leader出现故障时能够实现不停机停服务的一个高可用特性

  • N个管理节点的集群最多允许损失(n-1)/2个管理节点,所以在设置管理节点数的时候最好设置为奇数个
  • 官方建议一个swarm集群最多7个管理节点

ps:不是管理节点越多越好

工作节点

工作节点是具体任务执行节点,管理节点将服务service下发至工作节点执行,当然管理节点默认也是工作节点

节点关系图
04swarm3

服务与任务
task是swarm集群中最小的调度单位,可以认为是一个单一的容器
service是指一组任务的集合,服务定义了任务的属性,服务一般有两种模式:

  • 复制服务,按照一定的规则在各个工作节点运行指定数量的任务
  • 全局服务,每一个工作节点运行一个任务

这两种模式通过docker service create的--mode参数指定

容器、任务、服务关系图
04swarm4

3.swarm集群部署

三台虚拟机 172.19.159.7 node-1 master 172.19.159.8 node-2 work1 172.19.159.9 node-3 work2

集群初始化
node-1上执行
docker swarm init --advertise-addr 172.19.159.7 输出
04swarm5
上图中输出的就是添加工作节点的命令

查看swarm集群状态
docker info | grep Swarm

查看集群节点
docker node ls
04swarm6

升级一个非管理节点为管理节点实现高可用
docker node promote node-2
docker node promote node-3

查看集群节点
docker node ls
04swarm7
上图可以看到node-2、node-3成为Reachable(选举者),集群中只能有一个leader

4.swarm集群部署应用

example1:
docker service create --replicas 1 --name test1 alpine ping linuxwt.com
04swarm8

example2:
将nginx容器中的端口80发布到群集中任何节点的端口8080
docker service create --replicas 3 --publish published=8080,target=8 --name my-web nginx
04swarm9
service通过ingress load balancing 来发布服务,而且swarm集群中所有的节点都参与到该路由中,访问任意的节点加上发布端口(这里是8080)即可访问到容器中的服务

当访问任何节点上的端口8080,docker会将请求路由到活动容器,在集群中,8080端口不一定需要绑定,但ingress路由知道该如何分发流量,不会发生端口冲突

网格路由在发布的8080端口上监听分配给节点的任何IP地址
ingress网格路由关系图
04swarm11

修改两个my-web的欢迎页面
docker exec -it my-web.2.mhzf7o6pxrjgpxcdsny1jlb4v bash
echo "web1" > /usr/share/nginx/html/index.html
docker exec -it my-web.1.v7vhnrsk8i13xd21a44gp1iwl bash
echo "web2" > /usr/share/nginx/html/index.html

测试
node-1上
04swarm12
node-2、node-上结果一样

修改服务发布的任务数量
docker service scale my-web=3
docker service ls可以看到replicas变成3了,在集群中也增加了一个my-web3

5.overlay网络

初始化swarm集群和将其它docker主机加入到集群中时会在该主机上创建两个网络 * ingress ingress overlay,该网络主要是处理集群服务相关的控制和数据流量,在创建service的时候如果不将服务的网络设置成自定义overlay网络时会默认使用ingress overlay网络 * docker_gwbridge 桥接网络,该网络将各个docker主机的docker守护进程连接到集群的其他守护进程

管理节点查看网络
docker network ls
04swarm13

overlay网络驱动程序会创建多个docker主机之间的分布式网络,允许连接到容器进行通信

6.自定义overlay网络

docker network create -d overlay my-overlay
再次查看网络就可以看到刚创建的网络了

前面部署了两个服务my-web、test1,现在尝试进入到alpine服务下发的任务容器去访问my-web服务
docker exec -it test1.1.ufnayuk7qvuazg9yk9a0ifj3x sh
04swarm14
从上图看到集群中的服务并不能通过服务名称来互相通信,只能通过ingress网格路由来通信,这里就需要使用到自定义的overlay了

先删除服务
docker service rm test1 my-web

创建服务
docker service create --name my-web -p 8080:80 --network my-overlay --replicas 3 nginx
docker service create --name test1 --network my-overlay alpine ping www.baidu.com
重新进入test1服务发布的任务容器访问my-web服务
04swarm15
可以访问了

7.集群退出和再添加

如果是管理节点退出集群,在该节点执行命令
docker swarm leave

建议先将非管理节点退出再退出管理节点,但是如果想在存在其他节点的情况下退出管理节点,执行命令
docker swarm leave --force

非管理节点退出集群,在该节点执行命令
docker swarm leave

有时候想要将退出的节点在添加回集群,但是又忘了最开始的添加命令,可以在管理节点执行命令查看
docker swarm join-token worker