手动模拟 flannel 的 vxlan 实现节点命名空间互通

红米11个月前技术文章427

WX20231218-094418@2x.png

flannel网络插件中实现两个节点互通方式有host-gw vxlan ipip等方式,之前已经手动模拟过host-gw模式,此处再模拟一下vxlan模式点对点访问。

手动实验两个命名空间通信

Node1节点操作

  1. 创建vxlan的模式的虚拟设备,设备名vxlan11,网络表示符为32UDP端口为4787,远程访问地址192.168.209.130,本机地址192.168.209.144,底层设备ens33,并给vxlan设备一个隧道ip,并启动

ip link add vxlan32 type vxlan id 32 dstport 4787 remote 192.168.209.144 local 192.168.209.130  dev ens33
ip addr add 10.244.1.0/32 dev vxlan32
ip link set vxlan32 up
  1. 创建网桥并启动,并且给网桥一个网关地址,并启动虚拟网桥设备

ip link add br1 type bridge
ip addr add 10.244.1.1/24 dev br1
ip link set br1 up
  1. 创建命名空间并且创建虚拟地址对实现对端绑定

ip netns add ns1
ip link add veth-ns1 type veth peer name veth-br1
ip link set veth-ns1 netns ns1 
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth-ns1
ip netns exec ns1 ip link set veth-ns1 up
ip link set veth-br1 master br1 
ip link set veth-br1 up
  1. 创建命名空间出去的路由,创建流量从隧道出去的路由

ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan32 onlink
ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth-ns1
  1. 内核开启路由转发,路由转发意思是节点内不同设备之间允许路由转发

sysctl -w net.ipv4.ip_forward=1

Node2节点操作

在节点二创建vxlan虚拟设备

ip link add vxlan32 type vxlan id 32 dstport 4787 remote 192.168.209.130 local 192.168.209.144  dev ens33
ip addr add 10.244.2.0/32 dev vxlan32
ip link set vxlan32 up
  1. 创建网桥并启动,并且给网桥一个网关地址,并启动虚拟网桥设备

ip link add br2 type bridge
ip addr add 10.244.2.1/24 dev br2
ip link set br2 up
  1. 创建命名空间并且创建虚拟地址对实现对端绑定

ip netns add ns2
ip link add veth-ns2 type veth peer name veth-br2
ip link set veth-ns2 netns ns2 
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth-ns2
ip netns exec ns2 ip link set veth-ns2 up
ip link set veth-br2 master br2
ip link set veth-br2 up
  1. 创建命名空间出去的路由,创建流量从隧道出去的路由

ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan32 onlink
ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth-ns2
  1. 内核开启路由转发

sysctl -w net.ipv4.ip_forward=1

测试连通性

节点1访问节点2vxlan设备

[root@ns1 ~]# ping 10.244.2.0PING 10.244.2.0 (10.244.2.0) 56(84) bytes of data.64 bytes from 10.244.2.0: icmp_seq=1 ttl=64 time=0.223 ms64 bytes from 10.244.2.0: icmp_seq=2 ttl=64 time=0.301 ms

节点1命名空间访问节点2命名空间

[root@ns1 ~]# ip netns exec ns1 ping 10.244.2.2PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data.64 bytes from 10.244.2.2: icmp_seq=1 ttl=62 time=0.216 ms

数据包分析

Node1下命名空间ns1访问Node2下命名空间ns2,分析数据过经过各个设备mac地址之间关系

Node1 br1 网桥数据分析

10.244.1.2Node1命名空间下IP10.244.2.2Node2命名空间下IP10.244.2.2mac地址变成了br1网桥mac,这符合网络地址转换原则

001.png

Node1 vxlan 设备数据分析

10.244.1.2mac地址变成了本端vxlan设备mac10.244.2.2mac地址也变成了对端vxlan设备mac

002.png

Node1 物理网口数据分析

在物理口发现没有xvlan设备的信息,只有本端口发送给对端的UDP协议数据,经过解码数据包,发现数据包报头被封装成了vxlan格式

003.png

Node2 vxlan 设备数据分析

数据包在到达对端的物理网口后会解包,根据vxlanvni解析到需要发送给vxlan32设备,并且发现mac也都是vxlan设备mac,此时证明隧道成立

004.png

FAQ

1、为什么要先建立vxlan设备?

可以后建立vxlan设备,但是这里用的是32位主机地址10.244.1.0,经测试发现主机地址与网桥下的10.244.1.0/24端有冲突,所以需要先行创建,如果使用10.244.3.0这种不同网段的则可以后创建网桥,经过分析发现flannel也是先创建vxlan设备

2、为什么是UDP封包?

经过分析发现TCP也可以进行封包,但是TCP需要握手,导致性能低。

3、如果有3台机器走点对点是不是很麻烦?

如果有多台机器,可以走多播模式


相关文章

idea打包java可执行jar包

idea打包java可执行jar包

1,在项目上鼠标右键 --> Open Module SettingsArtifacts --> + --> JAR --> From modules with depende...

MySQL运维实战之ProxySQL(9.10)proxysql监控

MySQL运维实战之ProxySQL(9.10)proxysql监控

stats数据库从stats数据库中可以查到proxysql一些内部组件的状态,如内存使用情况、连接池信息、会话信息、SQL执行状态等。mysql> show tables&...

Doris FE节点故障恢复

Doris FE节点故障恢复

FE故障恢复现象:FE由于元数据损坏导致无法启动            &nbs...

Prometheus监控Minio集群

Prometheus监控Minio集群

一、概述Minio支持集成prometheus,用以监控CPU、硬盘、网络等数据。二、修改docker-compose.yaml官方的给docker-compose.yaml,默认是不能访问metri...

rabbitmq-监控告警

rabbitmq-监控告警

插件安装rabbitmq_prometheus这个插件包含在RabbitMQ3.9.x版本中。与所有的插件一样,必须启用它才能使用;在node1,node2,node3 三台机器上执行如下命令:rab...

Clickhouse MergeTree 原理(一)

Clickhouse MergeTree 原理(一)

MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎(见下图),理解了基础MergeTree,就能理解整个系列的MergeTree...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。