【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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
100: eth0@if101: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueuelink/ether 02:42:0a:00:01:03 brd ff:ff:ff:ff:ff:ffinet 10.0.1.3/24 brd 10.0.1.255 scope global eth0valid_lft forever preferred_lft forever
102: eth1@if103: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueuelink/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ffinet 172.18.0.3/16 brd 172.18.255.255 scope global eth1valid_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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
91: eth0@if92: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueuelink/ether 02:42:0a:00:01:04 brd ff:ff:ff:ff:ff:ffinet 10.0.1.4/24 brd 10.0.1.255 scope global eth0valid_lft forever preferred_lft forever
93: eth1@if94: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueuelink/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ffinet 172.20.0.3/16 brd 172.20.255.255 scope global eth1valid_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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 7a:72:0e:c5:e1:4c brd ff:ff:ff:ff:ff:ffinet 10.0.1.1/24 brd 10.0.1.255 scope global br0valid_lft forever preferred_lft forever
97: vxlan0@if97: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN group defaultlink/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 defaultlink/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 defaultlink/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)这个容器。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣题:字符的统计-12.6

力扣题-12.6 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;696. 计数二进制子串 解题思想&#xff1a;先统计连续的0和连续的1的个数&#xff0c;然后进行相加即可&#xff08;想不到一点&#xff09; class Solution(object):def countBinaryS…

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-LSTM-Multihead-Attent…

egen3 rowwise().maxCoeff()的使用

1、安装eigen3 2、引用头文件 3、代码测试 MatrixXf aaa(2, 4);aaa << 1, 2, 3, 4, 5, 6, 7, 8; Vector2f diff(10, 20);aaa.colwise() diff;std::cout << "new_aaa : " << aaa << endl; 全部代码&#xff1a; int main() {MatrixXf …

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios&#xff0c;选择u盘里的ubuntu镜像 2.进入使用ubuntu&#xff0c;下载 3.重启&#xff0c;esc 4.ubuntu 安e进入 5. nomodeset&#xff08;&#xff09; F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

代码随想录算法训练营 ---第五十七天

今天是两道动态规划的经典题目。 第一题&#xff1a; 简介&#xff1a; 做了今天的题目我有了新的理解&#xff0c;我觉得过去我过于注重对于二维数组的理解&#xff0c;忽略了对dp数组i 和 j 的含义的理解。 动态规划五部曲&#xff1a; 1.确定dp数组的含义 本题我们将i …

vue使用vue-router路由控件

vue-router是官方路由控件&#xff0c;但官网竟然没有该路由的使用方法啊&#xff0c;只有单页面的简单示例&#xff0c;引用的是网页js模式&#xff0c;不是vue的引用模式啊。 {"name": "vue01","private": true,"version": "0…

面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.死锁产生的条件 1.互斥条件&#xff0c;即当资源被一个线程使用&#xff08;…

流畅的python--小技巧总结

对于百万级以上数据的读写效率优化 在Python中&#xff0c;我们可以通过array模块来方便地创建和操作数组&#xff0c;array模块提供了性能优异的数组操作方法&#xff0c;可以使我们的代码更加高效。同时&#xff0c;Python也提供了读写二进制文件和普通文本文件的方法&#…

Rename--CAM在checkpoint恢复上的流程与优势

参考自&#xff1a;计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上&#xff0c;也是容易想不通的地方&#xff1b; 在SRAM方法中要恢复映射表状态&#xff0c;需要事先把分支指令来临时刻的映射表全份拷贝下来&#xff0c;然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布&#xff0c;正式推出全新GD32A490系列高性能车规级MCU&#xff0c;以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求&#xff0c;适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统&#xff0c;以及仪表盘、娱乐影音、中控导…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

政采云基于 Dubbo 的混合云数据跨网实践

作者&#xff1a;王晓彬&#xff0c;政采云资深开发工程师 项目背景 政采云的业务是为政府提供的购物网站&#xff0c;类似于淘宝。政府采购会在政采云上做企业采购、政府采购的业务。 云岛中的“云”是指我们的云平台&#xff0c;云平台是我们公司自己部署的一套购物网站&a…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层&#xff1f;四层&#xff1f; 1.为什么需要协议&#xff1f;2.OSI七层模型是干什么的&#xff1f;3.TCP/IP四层&#xff08;参考&#xff09;模型4.TCP/IP&#xff08;参考&#xff09;模型与OSI七层模型有什么异同&#xff1f; 二、自底向上的网络分层 1. 物理层2…

防火墙 iptables的使用

目录 什么是防火墙 原理 代理 防火墙的工具 4表5列 五链&#xff1a;控制流量的时机 四个表&#xff1a;如何控制流量 ​编辑 iptables 软件 格式 选项 跳转 查iptables 的规则 添加规则 A I 删除规则 清空规则 替换规则 R 修改默认规则&#xff08;默…

校园外卖小程序源码系统 附带完整的搭建教程

随着大学生消费水平的提高&#xff0c;对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题&#xff0c;无法亲自到餐厅就餐。因此&#xff0c;开发一款适合校园外卖市场的应用软件&#xff0c;将为广大学生提供极大的便利。 以下是部分代码示例&#…

Python Numpy学习(1)

python: np.pad() 函数的用法 np.einsum(爱因斯坦求和约定) python编程之np.isnan()的用法 Python_Numpy库中各种矩阵基本运算 numpy基本加减和取行操作 numpy的加减乘除运算 NumPy 算术函数 TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tenso…

了解linux网络时间服务器

本章主要介绍网络时间服务器。 使用chrony配置时间服务器 配置chrony客户端向服务器同步时间 20.1 时间同步的必要性 些服务对时间要求非常严格&#xff0c;例如&#xff0c;图20-1所示的由三台服务器搭建的ceph集群。 这三台服务器的时间必须保持一致&#xff0c;如果不一致…

【征稿倒计时十天】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

【有ISSN、ISBN号&#xff01;&#xff01;往届均已完成EI检索】 第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 2023 3rd International Conference on High Performance Computing and Communication Engineering (HPCCE 2023) 2023年12月22-24日 | 中国哈尔滨 第三…