热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker系列十四:IngressNetwork数据包通过lvs进入到有服务的主机

Docker系列十四:IngressNetwork数据包通过lvs进入到有服务的主机,Go语言社区,Golang程序员人脉社

Internal Load Balancing 内部负载平衡

Ingress Network:外部访问的负载均衡,我们在节点访问地址和端口服务的时候,都可以请求到数据,他的

原理是通过LVS把真正的服务转发到真正具有服务的节点上。

例如,访问docker3的8080,但是docker3 8080并没有这个服务,他会将这个服务转发到有服务docker2的主机上,然后在吧数据返回。

在Manager节点上运行:docker service ps whoami

[root@docker-host ~]# docker service ps whoami
ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE          ERROR                              PORTS
11tlqjmfdj2a        whoami.1            jwilder/whoami:latest   docker-host         Running             Running 5 hours ago                                       
bmgogzuzmu4l         _ whoami.1        jwilder/whoami:latest   docker-host         Shutdown            Rejected 5 hours ago   "No such image: jwilder/whoami…"   
kck0nb10xndl        whoami.2            jwilder/whoami:latest   docker-node3        Running             Running 4 hours ago                      

可以,看到在whoami运行在Manager和node3上

[root@docker-host ~]# curl 127.0.0.1:8000
I'm 03a295109ae3
[root@docker-host ~]# curl 127.0.0.1:8000
I'm 5b2b7f0d72ce
[root@docker-host ~]# curl 127.0.0.1:8000
I'm 03a295109ae3
[root@docker-host ~]# curl 127.0.0.1:8000
I'm 5b2b7f0d72ce
[root@docker-host ~]# curl 127.0.0.1:8000
I'm 03a295109ae3

每次访问,返回的主机名都是不一样的,一共有两台主机

在一个没有whoami服务的node2上,运行127.0.0.1:8000返回时一样的

为什么node2没有whoami服务,但是也可以请求的到?

在node2查看一下防火墙的规则:

[root@docker-node2 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-INGRESS (2 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.18.0.2:8000
RETURN     all  --  0.0.0.0/0            0.0.0.0/0    

通过发现,访问8000端口的都被转发到了172.18.0.2:8000上面了。

在node2上查看是否有172.18.0.2

[root@docker-node2 ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:6c:3e:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 65232sec preferred_lft 65232sec
    inet6 fe80::a00:27ff:fe6c:3e95/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:00:4b:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.205.20/24 brd 192.168.205.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe00:4b85/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0:  mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:99:c8:5e:ac brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:99ff:fec8:5eac/64 scope link 
       valid_lft forever preferred_lft forever
5: docker_gwbridge:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:72:92:41:85 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridge
       valid_lft forever preferred_lft forever
    inet6 fe80::42:72ff:fe92:4185/64 scope link 
       valid_lft forever preferred_lft forever
11: vethc3c8221@if10:  mtu 1500 qdisc noqueue master docker_gwbridge state UP 
    link/ether 8a:3b:e1:61:51:6b brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::883b:e1ff:fe61:516b/64 scope link 
       valid_lft forever preferred_lft forever
38: vethabc1bf7@if37:  mtu 1500 qdisc noqueue master docker_gwbridge state UP 
    link/ether 4a:47:93:c0:6c:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::4847:93ff:fec0:6ca1/64 scope link 
       valid_lft forever preferred_lft forever

可以看到:

5: docker_gwbridge:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:72:92:41:85 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridge
       valid_lft forever preferred_lft forever
    inet6 fe80::42:72ff:fe92:4185/64 scope link 
       valid_lft forever preferred_lft forever

里面有个172.18.0.1

很接近了,在一个网关。

yum install bridge-utils -y

brctl show 查看网关

[root@docker-node2 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024299c85eac	no		
docker_gwbridge		8000.024272924185	no		vethabc1bf7
							vethc3c8221
[root@docker-node2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f82c9355f4a7        bridge              bridge              local
zy22adwah6yi        demo                overlay             swarm
e4d36d217a0c        docker_gwbridge     bridge              local
04e15809d178        host                host                local
pjbn7946dtoi        ingress             overlay             swarm
eef5555525fd        none                null                local

 docker network inspect docker_gwbridge

"IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "d8bf026e9d87a559908cbd543571573f262aacece1288742339e5038bb4c6ab9": {
                "Name": "gateway_7cf14610e7c6",
                "EndpointID": "4a3dd75b512d7b787be31a996e0e0509373cdee3a60f421699d6e70fc9028308",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "ingress-sbox": {
                "Name": "gateway_ingress-sbox",
                "EndpointID": "533d63336f584e9dd7d8702dbb83dad3a25ca9c2aae50af33716d1825372a4d6",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },

由此发现,路由表中是这个:

"ingress-sbox": {
                "Name": "gateway_ingress-sbox",
                "EndpointID": "533d63336f584e9dd7d8702dbb83dad3a25ca9c2aae50af33716d1825372a4d6",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }

也就是数据都进入ingress-sbox,那我们进入:

[root@docker-node2 ~]# ls /var/run/docker/netns/
1-pjbn7946dt  1-zy22adwah6  3866254dd020  7cf14610e7c6  ingress_sbox
[root@docker-node2 ~]# nsenter --net=/var/run/docker/netns/ingress_sbox

使用这个地址,使用上面的命令后,已经不是原来的地址了,而是使用了ingress_sbox地址

ip a

[root@docker-node2 ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
8: eth0@if9:  mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:ff:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.255.0.3/16 brd 10.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.255.0.7/32 brd 10.255.0.7 scope global eth0
       valid_lft forever preferred_lft forever
10: eth1@if11:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

为了看lvs

先退出上面登录的网关

安装yum install ipvsadm

继续进入:

[root@docker-node2 ~]# nsenter --net=/var/run/docker/netns/ingress_sbox
[root@docker-node2 ~]# iptables -nL -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 MARK set 0x103

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            10.255.0.7           MARK set 0x103

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
[root@docker-node2 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  259 rr
  -> 10.255.0.9:0                 Masq    1      0          0         
  -> 10.255.0.10:0                Masq    1      0          0         

上面已经说了,运行whoami容器的是Manager和node3

进入Manager

[root@docker-host ~]# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
03a295109ae3        jwilder/whoami:latest   "/app/http"         6 hours ago         Up 6 hours          8000/tcp            whoami.1.11tlqjmfdj2ajhvn5fz9wfl7u
[root@docker-host ~]# docker exec -it 03a ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
23: eth0@if24:  mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:00:00:0d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.13/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
25: eth2@if26:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:16:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.3/16 brd 172.22.255.255 scope global eth2
       valid_lft forever preferred_lft forever
27: eth1@if28:  mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:ff:00:09 brd ff:ff:ff:ff:ff:ff
    inet 10.255.0.9/16 brd 10.255.255.255 scope global eth1
       valid_lft forever preferred_lft forever

进入node3

[root@docker-node3 ~]# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
5b2b7f0d72ce        jwilder/whoami:latest   "/app/http"         4 hours ago         Up 4 hours          8000/tcp            whoami.2.kck0nb10xndlmz2nl7c9itcce
[root@docker-node3 ~]# docker exec -it 5b ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
27: eth1@if28:  mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:ff:00:0a brd ff:ff:ff:ff:ff:ff
    inet 10.255.0.10/16 brd 10.255.255.255 scope global eth1
       valid_lft forever preferred_lft forever
29: eth2@if30:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth2
       valid_lft forever preferred_lft forever
31: eth0@if32:  mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:0a:00:00:12 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.18/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever

是不是都发现10.255.0.9和10.255.0.10呢?

所以说数据进入8000端口进入了LVS,然后转发到了这两个地址。


推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
author-avatar
陈可不能哭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有