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

红米1年前技术文章615

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台机器走点对点是不是很麻烦?

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


相关文章

trino组件对接alluxio(三)

trino组件对接alluxio(三)

本文是基于已经部署了trino和alluxio的基础上,进行的trino与alluxio的组件对接,alluxio已经开启了高可用模式。安装部署1、增加alluxio配置在core-site.xml和...

压测实操--TestDFSIO压测hdfs读写方案

压测实操--TestDFSIO压测hdfs读写方案

TestDFSIO主要是对hdfs的I/O性能进行测试,通过使用MapReduce作业来完成测试,作为并行读写文件进行I/O性能测试。每个map任务用于读或写每个文件,map的输出用于收集与处理文件相...

docker安装及常用操作

docker安装及常用操作

一、安装docker1、移除以前docker相关包sudo yum remove docker \      ...

Docker镜像是有仓库

在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库。在工作中,我们不可能...

presto参数优化

presto参数优化

总体参数1)session级别的参数配置 query.max-run-time=600s 在终止查询之前,允许在群集上处理查询的最大时间。时间包括分析和计划的时间,也包括在队列中等待的时间,因此本...

Hive合并小文件:hive归档(archive)

Hive合并小文件:hive归档(archive)

一、概述       在HDFS中数据和元数据分别由DataNode和NameNode负责,这些元数据每个对象一般占用大约150个字节。大量的小文件相对于大文件会占用大量的NameNode内存。对Na...

发表评论    

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