-------------------------创建集群------------------------------

  1. 创建Swarm集群
    [root@manager43 ~]# docker swarm init --advertise-addr 192.168.31.43
  2. 查看集群的相关信息
    [root@manager43 ~]# docker info
    上面的命令执行后 找到Swarm的关键字,就可以看到相关信息了
  3. 添加节点主机到Swarm集群
    在其他主机上执行:
    docker swarm join --token XXX(swarm init的时候返回的值)
    在任何主机上执行docker node ls查看集群节点和状态

-------------------使用swarm模式的服务发现--------------------------
默认情况下,当创建了一个服务并连接到某个网络后,swarm会为该服务分配一个VIP。此VIP根据服务名映射到DNS。在网络上的容器共享该服务的DNS映射,
所以网络上的任意容器可以通过服务名访问服务。

在同一overlay网络中,不用通过端口映射来使某个服务可以被其它服务访问。Swarm内部的负载均衡器自动将请求发送到服务的VIP上,然后分发到所有的active的task上。

1)首先创建网络
[root@manager-node ~]# docker network create --driver overlay --opt encrypted --subnet 10.10.19.0/24 ngx_net
2)在网络中创建某个服务,例如nginx,服务名称为my-test
[root@manager-node ~]# docker service create --replicas 5 --network ngx_net --name my-test -p 80:80 nginx
3)在同一个网络中添加了一个centos服务,此服务可以通过名称my-test访问前面创建的nginx服务
[root@manager-node ~]# docker service create --name my-centos --network ngx_net centos
4)查看centos服务的运行主机→登录到该主机上→进行centos容器→访问nginx服务:
docker service ls //返回网络中的所有服务信息 :my-test my-centos
docker service ps my-centos //返回centos运行在哪个/些节点上
登录该节点并进入容器执行:wget -O- my-test 发送http请求
Swarm的负载均衡器自动将HTTP请求路由到VIP上,然后到一个active的task容器上。它根据round-robin选择算法将后续的请求分发到另一个active的task上。
(外部的请求呢?怎么访问某个服务,然后swarm自动进行负载均衡?)

注意:网络中的每个服务都有一个虚拟ip地址称做VIP,当然网络中的每个docker服务也有自己的虚拟IP,(一个主机上运行了多个docker,那么每一个docker都有自己的虚拟IP),加入ngx_net网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信。

------------------------------------------使用方法-------------------------------------
docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service–help查看帮助)
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)

node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager nodes,也就是管理节点
worker nodes,也就是工作节点

1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。

2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。

3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。

service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。

4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。

dockerswarm负载均衡 tcp dockerswarm负载均衡 性能_docker


上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持.

集群节点worker和manager、leader&follower的关系
集群中的一台物理机,分为worker和manager两种角色,manager可以同时是worker,对于manager角色的节点,又分为leader和follower两种角色,leader是负责进行调度的,follower只是同步leader中的集群信息,以便当leader挂掉时,从follower中重新选举新的leader,leader和follower的信息同步和leader选举采用raft共识机制。
默认情况下manager同时也是worker,如果不想让manager同时承担worker的任务的话,执行如下指令,“drain”的意思是manager节点不再接受新的task,如果节点上已经有task在运行,则停止掉并调度到其它worker节点上去:
docker node update --availability drain manager

#!/bin/bash

# 这个脚本用于在创建了5个docker虚拟机之后,创建swarm集群。
# 集群内配置如下:node-1为manager leader,node-2和node-3为manager follower
# node-4和node-5为worker

export IP=$(docker-machine ip node-1)
#ssh登录到node-1,让他成为swarm leader
docker-machine ssh node-1 docker swarm init --advertise-addr $IP
#获取leader的token,方便后面其他主机加入
export JOIN_TOKEN=$(docker-machine ssh node-1 docker swarm join-token worker -q)
for NODE in `seq 2 5`
do
  docker-machine ssh node-${NODE} docker swarm join --token ${JOIN_TOKEN} ${IP}:2377
done
#将node-2和node-3主机提权为manager
docker-machine ssh node-1 docker node promote node-2 node-3

完成后,可以在node-1上查看当前集群节点信息

[root@node2 swarm]# docker-machine ssh node-1 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zycyeyod3fctve54efs9oms55 *   node-1              Ready               Active              Leader              18.06.1-ce
cwerk7kvtxybp7fgkicpgxe4y     node-2              Ready               Active              Reachable           18.06.1-ce
l3dtf4l64z3bm5eb1sb4uuq2x     node-3              Ready               Active              Reachable           18.06.1-ce
wg5ptfk4suctqvndjo81dqewq     node-4              Ready               Active                                  18.06.1-ce
wcog4ty7anqdixgm5n7ta8bxb     node-5              Ready               Active                                  18.06.1-ce