首页
视频
资源
登录
原
VxLAN过渡到Flannel
2890
人阅读
2022/10/25 17:31
总访问:
2609244
评论:
0
收藏:
0
手机
分类:
容器编排
![](https://img.tnblog.net/arcimg/hb/a7b81907f2e249d0a1ca79b4c0726515.png) ># VxLAN过渡到Flannel [TOC] ## Linux下的VxLAN tn2>两台机器构成一个VxLAN网络,每台机器有一个VTEP,VTEP通过它们的IP互相通信。 ![](https://img.tnblog.net/arcimg/hb/b381fd05d1e94a5fa29d3621bfee08e5.png) ```bash # Centos7查看内核版本如果低于7.0请升级 uname -r # 在所有的实验节点上升级内核 apt install rpm rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y grub2-set-default 0 reboot uname -r ``` tn2>通过`ifconfig`查看ip与网卡信息。 ![](https://img.tnblog.net/arcimg/hb/67c76120e4de4c95b82f54d6b43fdf02.png) ```bash # 第一台机器 # 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为10.211.55.12本地地址为10.211.55.11从eth0口出去 ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.12 local 10.211.55.11 dev eth0 # 设置vxlan0的ip:10.20.1.2 ip addr add 10.20.1.2/24 dev vxlan0 # 启动vxlan0 ip link set vxlan0 up yum -y install net-tools ``` ```bash # 第二台机器 # 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为172.30.1.2本地地址为172.30.2.2从enp1s0口出去 ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.11 local 10.211.55.12 dev eth0 # 设置vxlan0的ip:10.20.1.3 ip addr add 10.20.1.3/24 dev vxlan0 # 启动vxlan0 ip link set vxlan0 up yum -y install net-tools route -n # 测试 ping 10.20.1.2 ``` ![](https://img.tnblog.net/arcimg/hb/b26a77b974f147b9bc237ff256a42224.png) | 参数 | 描述 | | ------------ | ------------ | | id 5 | 指定VNI的值,有效在1到2的24次方。 | | dstport 4789 | VTEP通信的端口,IANA分配的端口是4789。如果不指定,Linux默认使用8472. | | remote | 对端VTEP的地址 | | local | 当前节点VTEP要使用的IP地址,即当前节点隧道口的IP地址。 | | dev eth0 | 当前节点用于VTEP通信的网卡设备,用来获取VTEP IP地址。注意,这个参数和local参数含义相同,读者在使用过程中二选一即可。 | tn2>能够ping通,接下来我们进行抓包查看。 ```bash tcpdump -i any -w linux-vxlan.cap ``` tn2>VNI为5,源地址是10.20.1.2目标地址是10.20.1.3,上面的地址还是主机对主机的地址。 ![](https://img.tnblog.net/arcimg/hb/c71d7fbda1a04d38a0c9dc5dd24a1c4c.png) tn2>但是我们会发现这样一个一个添加的方式太麻烦了,所以我们可以用组播的方式进行通信,直接在组播中去找。 ## 组播Vxlan tn2>要组成同一个VxLAN网络,VTEP必须能感知到彼此的存在。多播组的功能就是把网络中的节点组成一个虚拟的组。 ![](https://img.tnblog.net/arcimg/hb/21ae2a68cdc241609a8e8b4a8469d09b.png) ```bash # 第一台 # 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去 ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0 # 设置vxlan1的ip:192.168.1.1 ip addr add 192.168.1.1/24 dev vxlan1 # 启动vxlan1 ip link set vxlan1 up ``` ```bash # 第二台 # 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去 ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0 # 设置vxlan1的ip:192.168.1.2 ip addr add 192.168.1.2/24 dev vxlan1 # 启动vxlan1 ip link set vxlan1 up # 测试 ping 192.168.1.1 ``` ![](https://img.tnblog.net/arcimg/hb/21d7696957bc4e67bc636a9bb539ed2e.png) tn>注:组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个多播组 IP 地址,多播地址范围为`239.0.0.0~239.255.255.255`。 tn2>组播与点对点的不同点在于FDB表。 可通过如下命令进行查看。 ```bash bridge fdb | grep vxlan ``` ![](https://img.tnblog.net/arcimg/hb/35113c0c5efb4f6eb7cd926713cb41be.png) tn2>我们先来看vxlan0:默认的VTEP对端地址为`10.211.55.12`。换句话说,原始的报文经过vxlan0后会被内核添加上VXLAN头部,而外部UDP头的目的IP地址会被冠上`10.211.55.12`。在另一台机器上也进行相同的配置,要保证VNI和dstport也是相同的,并修改VTEP的local和remote IP地址到相应的值。<br/> 再来看vxlan1: dst字段的值变成了组播地址239.1.1.1,而不是之前对方的VTEP地址,意思是原始报文经过vxlan0后被内核添加上VXLAN头部,其外部UDP头的目的IP地址会被冠上多播地址239.1.1.1;配置好后,VTEP通过IGMP加入同一个多播组239.1.1.1。 ## Vxlan+桥接网络 tn2>尽管上面的方法能够通过多播实现自动化的overlay网络构建,但是通信的双方只有一个VTEP。在实际生产中,每台主机上都有几十台甚至上百台虚拟机或者容器需要通信,因此需要找到一种方法将这些通信实体组织起来,再经过隧道口VTEP转发出去。<br/> 通过前面的介绍我们知道,Linux网桥可以连接多块虚拟网卡,因此可以使用网桥把多个虚拟机或者容器放到同一个VXLAN网络中,VXLAN+网桥的网络拓扑如下图所示。 ![](https://img.tnblog.net/arcimg/hb/b946c538dca44a37a233d87017819a34.png) tn2>和上面的多播模式相比,这里只是多了一块网桥,连接同一个主机上的不同容器的veth pair。接下来我们先用network namespace代替容器,其实现原理都是一样的。我们将创建一个network namespace,并通过一对veth pair将namespace中的eth0网卡连接到网桥。同时,VXLAN网卡也连接到网桥。 ```bash # 创建 namespace ip netns add ns0 ip netns add ns1 # 创建 bridge ip link add br0 type bridge ip link set br0 up # 创建两对 veth-pair (相当于网线) ip link add veth0 type veth peer name br0-veth0 ip link add veth1 type veth peer name br0-veth1 # 先插入一头到网络名称空间里面去 ip link set veth0 netns ns0 ip link set veth1 netns ns1 # 再插入一头到网桥里面去 ip link set br0-veth0 master br0 ip link set br0-veth1 master br0 # 都要激活 ip link set br0-veth0 up ip link set br0-veth1 up # 配置ip并启用 ip netns exec ns0 ip add a 192.168.1.10/24 dev veth0 ip netns exec ns0 ip link set veth0 up ip netns exec ns0 ip link set lo up ip netns exec ns1 ip add a 192.168.1.11/24 dev veth1 ip netns exec ns1 ip link set veth1 up ip netns exec ns1 ip link set lo up # 把vxlan1加入到网桥网络 ip link set vxlan1 master br0 # 测试ns1 ping ns0 ip netns exec ns1 ping 192.168.1.10 ``` ![](https://img.tnblog.net/arcimg/hb/e5905361a0724ecb8993b171772926da.png) ```bash # 创建 namespace ip netns add ns2 ip netns add ns3 # 创建 bridge ip link add br0 type bridge ip link set br0 up # 创建两对 veth-pair (相当于网线) ip link add veth2 type veth peer name br0-veth2 ip link add veth3 type veth peer name br0-veth3 # 先插入一头到网络名称空间里面去 ip link set veth2 netns ns2 ip link set veth3 netns ns3 # 再插入一头到网桥里面去 ip link set br0-veth2 master br0 ip link set br0-veth3 master br0 # 都要激活 ip link set br0-veth2 up ip link set br0-veth3 up # 配置ip并启用 ip netns exec ns2 ip add a 192.168.1.12/24 dev veth2 ip netns exec ns2 ip link set veth2 up ip netns exec ns2 ip link set lo up ip netns exec ns3 ip add a 192.168.1.13/24 dev veth3 ip netns exec ns3 ip link set veth3 up ip netns exec ns3 ip link set lo up # 把vxlan1加入到网桥网络 ip link set vxlan1 master br0 # 测试ns3 ping ns2 ip netns exec ns3 ping 192.168.1.12 ``` ![](https://img.tnblog.net/arcimg/hb/a5077b29ecaa4a5f8e09a85c4f7bb93e.png) tn2>最后测试它们之间是否能够ping通。 ![](https://img.tnblog.net/arcimg/hb/99a20f671351459b9a410c272a209867.png) tn2>关于Ubuntu请参考:https://www.freesion.com/article/5905520026/ ## Flannel简介 tn2>Flannel 是 CoreOS 团队中针对 Kubernetes 设计的一个网络规划服务,简单说它功能可以让集群中的不同节点主机创建的 Docker 都具有,整个集群中唯一的虚拟IP地址。在docker配置中,每一个节点的docker服务会分别负责所在节点容器的IP分配。这样导致不同的点上容器可能获得相同的内外IP地址。<br/> flannel 的设计目的就是为集中的所有及诶单重新规划 IP 地址的使用规则,从而使得不同的节点上的容器能够获得同属于一个内网且不重复的IP地址,并且使得属于不同节点上的容器能够直接通过内网的IP 通信。 大致的网络结构如下: ![](https://img.tnblog.net/arcimg/hb/7147a2c9e48846618f1f24aae68ff0ac.png) tn2>我们会发现与我们刚刚的搭建的 vxlan 差不多,只是Flannel并非依赖ARP进行MAC地址学习,而是由节点上的flanneld进程启动时将本地flannel.1接口IP与MAC地址的映射信息上报到etcd中,并由其他各节点上的flanneld来动态生成相应的解析记录。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
168篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
Halcon
1篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术