• Swarm使用原生的overlay网络


    一、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等

       

  • 相关阅读:
    集合框架总结笔记三
    ANDROID_MARS学习笔记_S03_006_geocoding、HttpClient
    ANDROID_MARS学习笔记_S03_005_Geocoder、AsyncTask
    ANDROID_MARS学习笔记_S03_004_getAllProviders、LOCATIONLISTENER、getBestProvider
    ANDROID_MARS学习笔记_S03_003_LocationManager、LocationListener
    ANDROID_MARS学习笔记_S03_002_设置可见性及扫描蓝牙设备
    ANDROID_MARS学习笔记_S03_001_获取蓝牙匹配列表
    ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合
    ANDROID_MARS学习笔记_S02_014_GSON解析JSON串为对象
    ANDROID_MARS学习笔记_S02_013_Gson解析json串
  • 原文地址:https://www.cnblogs.com/bigberg/p/8779302.html
Copyright © 2020-2023  润新知