热门标签 | 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系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 本文深入探讨了佩尔方程 \( x^2 - dy^2 = 1 \) 的递推关系式。通过构造特定的矩阵并利用矩阵快速幂的方法,可以高效地计算出该方程的第 k 组解。此外,文章还详细分析了递推关系式的数学背景及其在数论中的应用,为相关研究提供了坚实的理论基础。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
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社区 版权所有