【Docker】Swarm的overlay网络

对于理解swarm的网络来讲,个人认为最重要的两个点:

第一是外部如何访问部署运行在swarm集群内的服务,可以称之为入方向流量,在swarm里我们通过ingress来解决。

第二是部署在swarm集群里的服务,如何对外进行访问,这部分又分为两块:

  • 第一,东西向流量,也就是不同swarm节点上的容器之间如何通信,swarm通过overlay网络来解决;
  • 第二,南北向流量,也就是swarm集群里的容器如何对外访问,比如互联网,这个是通过Linux bridge + iptables NAT来解决的,这个与单个容器访问外网的原理是一致的。

这里主要了解下不同swarm节点上的容器之间如何通过overlay网络进行通信。

主机规划:

  • node1:172.19.177.14,角色为Leader
  • node2:172.19.188.123,角色为Worker
$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
6lj1g1gu1ojdixy7xyv49mk5d *   node1      Ready     Active         Leader           24.0.2
gi694i1yfoc4fh1yf8185kq9i     node2      Ready     Active                          24.0.2

创建overlay网络

在node1上创建一个名为mynet的overlay网络:

$ sudo docker network create -d overlay mynet
ysbj86zsjo3iieivgvkzbr4ly

创建服务

创建一个服务连接到这个overlay网络,name是app,replicas是2:

$ sudo docker service create --network mynet --name app --replicas 2 busybox ping 8.8.8.8
ldzod2s1ylgl0euauxlxfkoc1
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

查看已经创建的服务:

$ sudo docker service ps app
ID             NAME      IMAGE            NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
s0c03hrcjx7e   app.1     busybox:latest   node1     Running         Running 20 seconds ago
rv2ysokngn7p   app.2     busybox:latest   node2     Running         Running 20 seconds ago

可以看到这两个容器分别被创建在node1和node2两个节点上。

mynet这个网络在第一次使用的时候才会同步到所有的swarm节点上,在node2上可以查询到:

$ sudo docker network list | grep overlay
5knp2oqmdu4n   ingress           overlay   swarm
ysbj86zsjo3i   mynet             overlay   swarm

查看app.1的网络

在node1上找到app.1这个容器:

$ sudo docker container ls
CONTAINER ID   IMAGE            COMMAND          CREATED              STATUS          PORTS     NAMES
03be3938e6bc   busybox:latest   "ping 8.8.8.8"   About a minute ago   Up 59 seconds             app.1.s0c03hrcjx7e5glpf8mu0z0v6

查看app.1这个容器的IP:

$ sudo docker container exec -it 03be3938e6bc ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    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
100: eth0@if101: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:0a:00:01:03 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.3/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
102: eth1@if103: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    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 eth1
       valid_lft forever preferred_lft forever

发现app.1这个容器有两个网卡eth0和eth1,其中eth0是连到了mynet这个网络,eth1是连到docker_gwbridge这个网络。

查看app.2的网络

在node2上找到app.2这个容器:

$ sudo docker container ls
CONTAINER ID   IMAGE            COMMAND          CREATED         STATUS         PORTS     NAMES
7ba95286b2e2   busybox:latest   "ping 8.8.8.8"   2 minutes ago   Up 2 minutes             app.2.rv2ysokngn7pvf2bv3l7lnenp

查看app.2这个容器的IP:

$ sudo docker container exec -it 7ba95286b2e2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    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
91: eth0@if92: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:0a:00:01:04 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.4/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
93: eth1@if94: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 brd 172.20.255.255 scope global eth1
       valid_lft forever preferred_lft forever

发现app.2这个容器有两个网卡eth0和eth1,其中eth0是连到了mynet这个网络,eth1是连到docker_gwbridge这个网络。

app.1和app.2这两个容器的网卡eth0在同一个网段,用来容器之间进行通讯使用。

在app.1中访问app.2:

$ sudo docker container exec -it 03be3938e6bc ping 10.0.1.4 -c 3
PING 10.0.1.4 (10.0.1.4): 56 data bytes
64 bytes from 10.0.1.4: seq=0 ttl=64 time=0.887 ms
64 bytes from 10.0.1.4: seq=1 ttl=64 time=0.461 ms
64 bytes from 10.0.1.4: seq=2 ttl=64 time=0.446 ms

--- 10.0.1.4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.446/0.598/0.887 ms

虽然app.1和app.2的网卡eth0在同一个网段,但是这两个容器是位于不同的宿主机上,他们是怎样进行通讯的呢?

查看overlay网络mynet的网络详情

mynet这个网络的ip为10.0.1.1,在两个宿主机上的ip都是这个,app.1app.2这两个容器连接在这个网络上,并通过这个网络进行通讯。

$ sudo docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ysbj86zsjo3iieivgvkzbr4ly",
        "Created": "2023-11-29T01:36:58.554703707Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.1.0/24",
                    "Gateway": "10.0.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "03be3938e6bc2b0b02104f43864c6c6f33eca4b00ad8a84f3cc0092919829c14": {
                "Name": "app.1.s0c03hrcjx7e5glpf8mu0z0v6",
                "EndpointID": "fbc5326ba4f3655a2b4e43da9c1398e71df45267f164e3f7d0d4aa5518d3688d",
                "MacAddress": "02:42:0a:00:01:03",
                "IPv4Address": "10.0.1.3/24",
                "IPv6Address": ""
            },
            "lb-mynet": {
                "Name": "mynet-endpoint",
                "EndpointID": "6ed5bb4ca3745ddc987ed7bb85edb7062f6e0a6b75bb49b2f255203cfebce329",
                "MacAddress": "02:42:0a:00:01:06",
                "IPv4Address": "10.0.1.6/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "a69283b7d627",
                "IP": "172.19.177.14"
            },
            {
                "Name": "7826e8e0446d",
                "IP": "172.19.188.123"
            }
        ]
    }
]

查看mynet网络命名空间

在创建mynet网络的同时会在宿主机上创建一个网络命名空间,其名称与mynet的ID前缀一致。

查询到mynet网络命名空间对应的ID为ysbj86zsjo3i

$ sudo docker network ls | grep overlay
5knp2oqmdu4n   ingress           overlay   swarm
ysbj86zsjo3i   mynet             overlay   swarm

再在docker创建的命名空间目录/run/docker/netns/下寻找ysbj86zsjo3i命名空间文件:

$ sudo ls /run/docker/netns/
1-5knp2oqmdu  1-ysbj86zsjo  b8fd600925b7  ingress_sbox  lb_ysbj86zsj

由于docker将命名空间文件放在了/run/docker/netns/目录下,而不是系统默认的目录/var/run/netns/,我们无法使用ip netns命令来直接访问docker创建的命名空间,我们这里借助nsenter命令来操作:

$ sudo nsenter --net="/run/docker/netns/1-ysbj86zsjo" ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 7a:72:0e:c5:e1:4c brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.1/24 brd 10.0.1.255 scope global br0
       valid_lft forever preferred_lft forever
97: vxlan0@if97: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN group default
    link/ether 7a:72:0e:c5:e1:4c brd ff:ff:ff:ff:ff:ff link-netnsid 0
99: veth0@if98: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP group default
    link/ether da:73:88:00:81:1c brd ff:ff:ff:ff:ff:ff link-netnsid 1
101: veth1@if100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP group default
    link/ether fe:43:7b:22:c2:8f brd ff:ff:ff:ff:ff:ff link-netnsid 2

可以看到mynet网络命名空间的ip为10.0.1.1/24,并在其中添加了vxlan。

vxlan

VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种 Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。

FDB(Forwarding Database entry,即转发表)是Linux网桥维护的一个二层转发表,用于保存远端虚拟机/容器的MAC地址,远端VTEP IP,以及VNI的映射关系,可以通过bridge fdb命令来对FDB表进行操作:

$ sudo nsenter --net="/run/docker/netns/1-ysbj86zsjo" bridge fdb
33:33:00:00:00:01 dev br0 self permanent
01:00:5e:00:00:01 dev br0 self permanent
7a:72:0e:c5:e1:4c dev vxlan0 master br0 permanent
02:42:0a:00:01:05 dev vxlan0 dst 172.19.188.123 link-netnsid 0 self permanent
02:42:0a:00:01:04 dev vxlan0 dst 172.19.188.123 link-netnsid 0 self permanent
da:73:88:00:81:1c dev veth0 master br0 permanent
33:33:00:00:00:01 dev veth0 self permanent
01:00:5e:00:00:01 dev veth0 self permanent
fe:43:7b:22:c2:8f dev veth1 master br0 permanent
33:33:00:00:00:01 dev veth1 self permanent
01:00:5e:00:00:01 dev veth1 self permanent

可以看到要想去02:42:0a:00:01:0502:42:0a:00:01:04这两个MAC地址需要通过172.19.188.123(node2),那么这两个MAC地址对应的ip是多少呢?

执行ip neigh,该指令效果等同于arp,即其会将ip地址解析成mac网卡地址。

$ sudo nsenter --net="/run/docker/netns/1-ysbj86zsjo" ip neigh
10.0.1.4 dev vxlan0 lladdr 02:42:0a:00:01:04 PERMANENT
10.0.1.5 dev vxlan0 lladdr 02:42:0a:00:01:05 PERMANENT

通过上述两个指令获取到对应结果信息后,我们的overlay网络需要发送数据包到app.2(10.0.1.4),根据arp解析后得知其发送的mac地址为02:42:0a:00:01:04,然后在fdb表中又得知了其映射的ip地址为172.19.188.123(node2),那么vxlan交换机就可以将这两个信息和数据包封装成VTEP包,发往172.19.188.123(node2)。

当node2收到这个VTEP包时,同样根据这两个表的数据进行解包,最后将数据包交给app.2(10.0.1.4)这个容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/204211.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境搭建(Ubuntu22.04)+ 配置共享文件夹(Samba)

Linux开发环境准备 搭建Linux开发环境所需要的软件如下&#xff1a; VMware虚拟机&#xff1a;用于运行Linux操作系统的虚拟机软件之一&#xff0c;VMware下载安装在文章中不做说明&#xff0c;可自行百度谢谢Ubuntu光盘镜像&#xff1a;用于源代码编译&#xff0c;有闲置计算…

自己的测试技术烂, 不学几招怎么能快速提升自己!

很多小伙伴在成功入职后, 进入测试开发发展后, 都会进入一个瓶颈过渡期, 当然能够自己意识到这个问题说明还来得及&#xff01; 那么作为测试开发人员, 如何走出舒适区, 需要学习和掌握那些内容, 从而实现自己的最终目标呢?今天我们就来说一说, 在职场中如何不断的提升自己. …

【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP

目录 第一部分、前言 1、目标效果 2、准备知识 第二部分、详细步骤 1、新建Empty工程 ​2、添加资源文件 3、搭建注册界面 4、搭建登录界面 5、编写注册界面和登录界面的代码 6、设置APP初始界面 7、连接手机&#xff0c;编译工程 第三部分、总结 1、参考资料 2、…

Java+SSM+MySQL基于微信小程序的商城购物小程序(附源码 调试 文档)

基于微信小程序的商城购物小程序 一、引言二、国内外研究现状三、系统设计四、系统实现五、测试与评估六、结论七、界面展示八、源码获取 摘要&#xff1a; 本文介绍了一种基于微信小程序的商城购物小程序&#xff0c;该系统分为管理员和用户两种用户角色。管理员可以通过系统进…

LeetCode 7 整数反转

题目描述 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示…

Mac电脑版程序创建工具 VMware InstallBuilder Enterprise mac最新

VMware InstallBuilder Enterprise 是一款功能强大、操作简单、跨平台支持的软件安装和部署工具&#xff0c;可以让开发者更加高效地创建和部署软件&#xff0c;并提供了丰富的功能和工具&#xff0c;适用于不同的用户需求和场景。 内置调试器 轻松排除应用程序安装过程中的故…

探索H5的神秘世界:测试点解析

Html5 app实际上是Web app的一种&#xff0c;在测试过程中可以延续Web App测试的部分方法&#xff0c;同时兼顾手机端的一些特性即可&#xff0c;下面帮大家总结下Html5 app 相关测试方法&#xff01; app内部H5测试点总结 1、业务逻辑 除基本功能测试外&#xff0c;需要关注的…

数据中心布线解决方案比较: DAC 电缆和 AOC 光缆

在当今的数字时代&#xff0c;数据中心是无数行业的支柱&#xff0c;它确保了信息的交换并维护关键数据的完整性。为了保持这些数据中心高效运行&#xff0c;选择正确的布线解决方案至关重要。在这方面&#xff0c;两种流行的选择是直连铜缆 (DAC) 和有源光缆 (AOC)。在本文中&…

前缀和——1314. 矩阵区域和

文章目录 &#x1f3a4;1. 题目&#x1f3a4;2. 算法原理&#x1f3a4;3. 代码实现 &#x1f3a4;1. 题目 题目链接&#xff1a;1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#…

Alibaba微服务组件Nacos配置中心实战

Nacos 配置中心 配置中心作用 配置中心就是一种统一管理各种应用配置的基础服务组件。使得配置信息集中管理&#xff0c;易于维护&#xff0c;并且可以动态更新配置&#xff0c;使得分布式系统更加稳定可靠。 什么是Nacos配置中心 Nacos 提供用于存储配置和其他元数据的 ke…

代码随想录第十六天(一刷C语言)|找树左下角的值路径总和从中序与后序遍历序列构造二叉树

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、找树左下角的值 思路&#xff1a;采用递归 ledcode题目&#xff1a;https://leetcode.cn/problems/find-bottom-left-tree-value/description/ AC代码&#xff1a; /*** Definition f…

免费WordPress站群插件-批量管理站群的免费软件

WordPress站群插件&#xff1a;让文章管理如丝般顺滑 在众多网站建设工具中&#xff0c;WordPress一直以其简便易用、丰富的插件生态而备受青睐。对于站群管理者而言&#xff0c;如何高效地更新、发布和推送文章是一项不可忽视的任务。本文将专注分享一款WordPress站群插件&am…

乳品企业生产ERP有哪些功能

乳品的生产管理涉及原材料采购、供应商选择、运输、出入库、车间生产、设备加工、质量检验等众多环节&#xff0c;每个环节有不同的业务流程和管理模式&#xff0c;产生的数据类型各不相同。 想要打破信息孤岛&#xff0c;提升跨部门和跨组织协作效率&#xff0c;就要求企业具…

建设“参与城市”大学--SMU在2023年绿色金融全球论坛上分享观点

2023年11月21日&#xff0c;由新加坡管理大学&#xff08;SMU&#xff0c;简称新大&#xff09;和中国人民大学&#xff08;RUC&#xff0c;简称人大&#xff09;联合主办的“绿色金融与治理&#xff1a;从承诺到行动”全球论坛在北京召开。论坛汇集了来自新加坡、中国及世界各…

SPSS生存分析:Kaplan-Meier分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

机器学习入门(第四天)——朴素贝叶斯

知识树 Knowledge tree P(y|x)&#xff0c;P给定x的条件下&#xff0c;y的概率。如&#xff1a;P(y我招女孩子喜欢的概率|我是学生) 一个小故事 A story 女朋友和妈妈掉河里&#xff0c;路人拿出3颗豆&#xff0c;两颗红豆1颗绿豆。如果我抽中红豆救女朋友&#xff0c;抽中绿…

Temu已成拼多多第二曲线

11月28日&#xff0c;拼多多公布最新一季业绩报告。三季度&#xff0c;该集团实现营收688.4亿元&#xff0c;同比增长93.9%&#xff1b;实现美国通用会计准则口径净利润155.4亿元&#xff0c;净利润率为22.6%。相比市场此前预测的营收537.7亿元、经调整净利润129.74亿元&#x…

java第二十六课

数据库多表 多表做到每个表的字段名称不一样 Mysql 关系数据库 结合到商城&#xff1a;用户表 订单表 商品表 商品详情表 用户表:字段&#xff1a; 用户 id:唯一标志用户 用户名称&#xff1a;name 用户性别&#xff1a;sex 用户年龄:age 用户地址&#xff1a;position 用户密码…

C++和Python混合编程在数据采集程序中的应用

目录 一、引言 二、C和Python的特性及其在数据采集程序中的应用 1、C的特性及其在数据采集程序中的应用 2、Python的特性及其在数据采集程序中的应用 三、C和Python混合编程在数据采集程序中的实现方法 四、混合编程的优缺点以及未来发展趋势 五、代码示例 六、结论 一…

CAN网络出现错误帧从哪些方面去分析解决

标题&#xff1a;CAN网络出现错误帧从哪些方面去分析 实例1&#xff1a; 断电重启后&#xff0c;会有错误帧产生。 检查方案&#xff1a; 查看收发模块的初始化、使能是否在发送CAN报文之前完成&#xff1f; 实例2&#xff1a; 周期性报文&#xff0c;有时会冒出一帧错误帧&…