一、Swarm Overlay Network

  Swarm有Service的概念。一个Service是指使用相同镜像、同时运行的多个容器,多个容器同时一起对外提供服务,多个容器之间负载均衡。每个Service会有一个浮动IP(VIP),各个容器还有自己的物理IP。

  创建基于Swarm的Overlay网络,将Service挂载到此网络上。然后Service中的各个容器便可以通过Service名称(同时也是一个DNS名称)和IP地址实现网络互通。

同一个Service内,多个容器之间的负载均衡有两种方案:

  1. 基于浮动IP(VIP)进行均衡
  2. 基于DNS解析出不同的IP地址进行均衡  
swarm模式的覆盖网络包括以下功能:
1)可以附加多个服务到同一个网络。
2)默认情况下,service discovery为每个swarm服务分配一个虚拟IP地址(vip)和DNS名称,使得在同一个网络中容器之间可以使用服务名称为互相连接。
3)可以配置使用DNS轮循而不使用VIP
4)为了可以使用swarm的覆盖网络,在启用swarm模式之间需要在swarm节点之间开放以下端口:
5)TCP/UDP端口7946 – 用于容器网络发现
6)UDP端口4789 – 用于容器覆盖网络 

二、创建swarm overlay 网络

  2.1 创建overlay网络

[root@manager ~]#  docker network create --driver overlay --opt encrypted --subnet 10.10.1.0/24 ol_net

参数解释:
–opt encrypted 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted参数能在它们的vxlan流量启用附加的加密层。
--subnet 命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络。 [root@manager ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
40b5590f7216 bridge bridge local
cb1610f00364 docker_gwbridge bridge local
9fa64715b4f2 host host local
2mhfiejb2g77 ingress overlay swarm
168285bc1c23 none null local
mun52zjgstgx ol_net overlay swarm 由上可知,Swarm当中拥有2套覆盖网络。其中"ol_net"网络正是我们在部署容器时所创建的。而"ingress"覆盖网络则为默认提供。
Swarm 管理节点会利用 ingress 负载均衡以将服务公布至集群之外。
在将服务连接到这个创建的网络之前,网络覆盖到manager节点。上面输出的SCOPE为 swarm 表示将服务部署到Swarm时可以使用此网络。
在将服务连接到这个网络后,Swarm只将该网络扩展到特定的worker节点,这个worker节点被swarm调度器分配了运行服务的任务。
在那些没有运行该服务任务的worker节点上,网络并不扩展到该节点。

  2.2 将服务连接到overlay网络

[root@manager ~]# docker service create --replicas 5 --network ol_net --name my-nginx -p 80:80 nginx
etq3t5muc0lnpqr14e3sodmno
overall progress: 0 out of 5 tasks
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converg

  

  

  在三个节点上服务都运行起来了,所以overlay网络(ol_net)扩展到了3个节点上

  2.3 查看my-nginx的ip信息 

# 管理节点查看service vip
[root@manager ~]# docker service inspect --format='{{json .Endpoint.VirtualIPs}}' my-nginx
[{"NetworkID":"2mhfiejb2g77mfxss4dtu18h9","Addr":"10.255.0.89/16"},{"NetworkID":"mun52zjgstgxxinskkfqm4qt1","Addr":"10.10.1.89/24"}] # 10.10.1.89 就是swarm集群中my-nginx服务的vip 
# 工作节点的ip,依次查看所有容器的ip

[root@node-01 ~]# docker network inspect ol_net

.........

"Containers": {
"44e23ef7b17ec94d370866f51460a1d600c29018ff388e374581bc72d5466269": {
"Name": "my-nginx.5.0aj9swgnsxgz4iwu63lsx5bgd",
"EndpointID": "2956e153e67f42cf7785d41484d57640db19b4ae1bb712f1a53b89f672010115",
"MacAddress": "02:42:0a:0a:01:5e",
"IPv4Address": "10.10.1.94/24",
"IPv6Address": ""
}
},

  这里5个replicas的ip分别为10.10.1.90~94,整个网络结构如下:

    

  加入到同一个overlay网络中的容器彼此间可以相互通过IP地址通信,也可以通过名称通信。(nginx镜像没有网络工具。。。,不能给出测试截图)

三、使用swarm的服务发现

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

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

在同一个网络中添加了一个centos服务,此服务可以通过名称my-test访问前面创建的nginx服务

[root@manager ~]# docker service create --name my-centos --network ol_net centosos

为这个服务添加一个task,不然不能正常运行
[root@manager ~]# docker service update --args "ping www.baidu.com" my-centos 查看在哪个节点上运行
[root@manager ~]# docker service ps my-centos
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
i2skqpwsd80g my-centos.1 centos:latest node-01 Running Running 18 seconds ago 打开交互
[root@node-01 ~]# docker exec -it 127e0e79f6eb /bin/bash

  在centos内部,ping同my-nginx服务中的容器和服务本身,以及DNS查询

# 和my-nginx服务通信
[root@127e0e79f6eb /]# ping 10.10.1.89
PING 10.10.1.89 (10.10.1.89) 56(84) bytes of data.
64 bytes from 10.10.1.89: icmp_seq=1 ttl=64 time=0.032 ms
^C
--- 10.10.1.89 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.032/0.032/0.032/0.000 ms
[root@127e0e79f6eb /]# ping 10.10.1.92
PING 10.10.1.92 (10.10.1.92) 56(84) bytes of data.
64 bytes from 10.10.1.92: icmp_seq=1 ttl=64 time=0.462 ms
64 bytes from 10.10.1.92: icmp_seq=2 ttl=64 time=0.252 ms #使用特殊查询 查询DNS,来找到my-nginx服务的所有容器的IP地址: [root@127e0e79f6eb /]# nslookup
> my-nginx
Server: 127.0.0.11
Address: 127.0.0.11#53 Non-authoritative answer:
Name: my-nginx
Address: 10.10.1.89
> tasks.my-nginx
Server: 127.0.0.11
Address: 127.0.0.11#53 Non-authoritative answer:
Name: tasks.my-nginx
Address: 10.10.1.92
Name: tasks.my-nginx
Address: 10.10.1.90
Name: tasks.my-nginx
Address: 10.10.1.91
Name: tasks.my-nginx
Address: 10.10.1.94
Name: tasks.my-nginx
Address: 10.10.1.93 #从centos容器内部,通过wget来访问my-nginx服务中运行的nginx网页服务器
[root@127e0e79f6eb /]# wget -O- my-nginx
--2018-04-10 09:21:27-- http://my-nginx/
Resolving my-nginx (my-nginx)... 10.10.1.89
Connecting to my-nginx (my-nginx)|10.10.1.89|:80... connected.
HTTP request sent, awaiting response... 200 OK Swarm的负载均衡器自动将HTTP请求路由到VIP上,然后到一个active的task容器上。它根据round-robin选择算法将后续的请求分发到另一个active的task上。

  使用dnsrr模式,不能对外暴露端口,只能overlay网络内部识别

#创建
[root@manager ~]# docker service create \
> --replicas 5 \
> --name web-test \
> --network ol_net \
> --endpoint-mode dnsrr \
> nginx # 查看
[root@manager ~]# docker service ps web-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pjb8x0i0w5yy web-test.1 nginx:latest node-02 Running Running 3 minutes ago
5uora7bbgxyc web-test.2 nginx:latest node-01 Running Running 3 minutes ago
uwxxqipk1nd3 web-test.3 nginx:latest node-02 Running Running 3 minutes ago
iuneh99mli2d web-test.4 nginx:latest node-01 Running Running 3 minutes ago
q2vz2y1upfu9 web-test.5 nginx:latest node-03 Running Running 3 minutes ago # 在my-centos容器中测试联通
[root@0709f126d547 ~]# nslookup web-test
Server: 127.0.0.11
Address: 127.0.0.11#53 Non-authoritative answer:
Name: web-test
Address: 10.10.1.36
Name: web-test
Address: 10.10.1.38
Name: web-test
Address: 10.10.1.34
Name: web-test
Address: 10.10.1.35
Name: web-test
Address: 10.10.1.37 # 任务会负载到各个容器
[root@0709f126d547 ~]# ping web-test
PING web-test (10.10.1.34) 56(84) bytes of data.
64 bytes from web-test.1.pjb8x0i0w5yys4la6ibqavvcf.ol_net (10.10.1.34): icmp_seq=1 ttl=64 time=0.050 ms
^C
--- web-test ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.050/0.050/0.050/0.000 ms
[root@0709f126d547 ~]# ping web-test
PING web-test (10.10.1.35) 56(84) bytes of data.
64 bytes from web-test.2.5uora7bbgxycg0ja2dj1l10us.ol_net (10.10.1.35): icmp_seq=1 ttl=64 time=0.334 ms [root@0709f126d547 ~]# ping web-test
PING web-test (10.10.1.37) 56(84) bytes of data.
64 bytes from web-test.4.iuneh99mli2dpydycfvy0zefw.ol_net (10.10.1.37): icmp_seq=1 ttl=64 time=0.275 ms

四、Swarm的负载均衡

  4.1 Swarm 内部负载

 

  Swarm模式内置DNS组件,可以自动为集群中每一个服务分配DNS记录。Swarm manager使用内部负载均衡,根据服务的DNS名称在集群内的服务之间分发请求。

  Swarm manager使用ingress load blancer暴露想从外部访问集群提供的服务。Swarm manager 自动分配一个范围为3000~32767端口的Published Port,也可以为该服务指定一个Published Port,如上例my-web的80端口。

  ingress network是一个特殊的overlay网络,便于服务的节点直接负载均衡。当任何swarm节点在发布的端口上接受到请求时,它将该请求转发给调用的IPVS模块,IPVS跟踪参与该服务的所有容器的IP地址,并选择其中一个,通过ingress network将请求路由给它。

  查看请求:

从172.16.60.95~98都能访问nginx服务器

     

  4.2 应用外部负载均衡

  可以在工作节点之外也能使用负载均衡,即在外部添加Nginx、LVS、HAProxy等

  

Swarm使用原生的overlay网络的更多相关文章

  1. Swarm基于多主机容器网络 - overlay networks 梳理

    前面介绍了Docker管理工具-Swarm部署记录,下面重点说下Swarm基于多主机容器通信的覆盖网络 在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks) ...

  2. Docker Swarm 创建overlay网络

    Docker Swarm 创建overlay网络 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1. ...

  3. docker 使用swarm overlay网络时,报“network xx not manually attachable”错误解决

    当使用swarm的overlay网络,在该网络中运行容器时报“network xx not manually attachable”的错误 docker network create -d overl ...

  4. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  5. Docker 新网络 overlay 网络

    Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...

  6. docker - 由于docker swarm子网与host机器网络冲突导致的container通信问题的解决方案

    背景 近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的docker swarm需要重新构建... 拿到新的服务器地址看了一下,“10.xxx.xxx.xxx" ... 纳尼,这IP ...

  7. docker应用-5(使用overlay 网络进行容器间跨物理主机通信)

    同一个主机上的Docker容器之间通信 docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份: 1.从容器视角,网桥(交换机)身份docker0 对于运行在同一个主机上的各个容器 ...

  8. 【爬坑系列】之docker的overlay网络配置(未完,待续)

    理论知识储备: 想了解vxlan网络的知识:https://www.cnblogs.com/shuiguizi/p/10923841.html 想了解docker网络的原理知识:https://www ...

  9. Overlay网络技术之vxvlan

    了解云计算数据中心网络架构的过程中,看到这么一篇不错的关于大二层技术overlay的文章,转载分享给大家! 一. 传统网络面临的问题 随着企业业务的快速扩展需求,IT做为基础设施,快速部署和减少投入成 ...

随机推荐

  1. 20172308 实验二《Java面向对象程序设计 》实验报告

    20172308 2017-2018-2 <程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...

  2. Leetcode题库——1.两数之和

    @author: ZZQ @software: PyCharm @file: addTwoNumbers.py @time: 2018/9/18 10:35 要求:给定两个非空链表来表示两个非负整数. ...

  3. java项目 相对路径(本项目的地址)

    File file=new File(""); String abspath=file.getAbsolutePath(); System.out.println(abspath) ...

  4. 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize

    博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...

  5. Spring 中使用Properties文件

    Spring提供了加载Properties文件的工具类:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer. ...

  6. python安装报错:Microsoft Visual C++ 14.0 is required

    保存详情如下: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build T ...

  7. Java 文件下载功能 解决中文乱码

    Html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  8. getcontext makecontext setcontext swapcontext介绍

    ucontext簇函数学习 https://github.com/zfengzhen/Blog/blob/master/article/ucontext%E7%B0%87%E5%87%BD%E6%95 ...

  9. 一些常用的基础Linux操作指令

    复习的时候顺便分享我学的知识,虽不是什么牛的技术分享,只是一些基础,基础打好了技术慢慢就提高了!一起加油一起共勉! 具体的vi和vim命令集太多了,以后的随笔我也会分享出来,没必要全记住,记住常用的就 ...

  10. P4433 [COCI2009-2010#1] ALADIN

    题目描述 给你 n 个盒子,有 q 个操作,操作有两种: 第一种操作输入格式为"1 L R A B",表示将编号为L到R的盒子里的石头数量变为(X−L+1)×A mod B,其中 ...