tnblog
首页
视频
资源
登录

VxLAN过渡到Flannel

4440人阅读 2022/10/25 17:31 总访问:3466972 评论:0 收藏:0 手机
分类: 容器编排

VxLAN过渡到Flannel

Linux下的VxLAN


两台机器构成一个VxLAN网络,每台机器有一个VTEP,VTEP通过它们的IP互相通信。

  1. # Centos7查看内核版本如果低于7.0请升级
  2. uname -r
  3. # 在所有的实验节点上升级内核
  4. apt install rpm
  5. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  6. rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  7. yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
  8. grub2-set-default 0
  9. reboot
  10. uname -r


通过ifconfig查看ip与网卡信息。

  1. # 第一台机器
  2. # 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为10.211.55.12本地地址为10.211.55.11从eth0口出去
  3. ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.12 local 10.211.55.11 dev eth0
  4. # 设置vxlan0的ip:10.20.1.2
  5. ip addr add 10.20.1.2/24 dev vxlan0
  6. # 启动vxlan0
  7. ip link set vxlan0 up
  8. yum -y install net-tools
  1. # 第二台机器
  2. # 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为172.30.1.2本地地址为172.30.2.2从enp1s0口出去
  3. ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.11 local 10.211.55.12 dev eth0
  4. # 设置vxlan0的ip:10.20.1.3
  5. ip addr add 10.20.1.3/24 dev vxlan0
  6. # 启动vxlan0
  7. ip link set vxlan0 up
  8. yum -y install net-tools
  9. route -n
  10. # 测试
  11. ping 10.20.1.2

参数 描述
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参数含义相同,读者在使用过程中二选一即可。


能够ping通,接下来我们进行抓包查看。

  1. tcpdump -i any -w linux-vxlan.cap


VNI为5,源地址是10.20.1.2目标地址是10.20.1.3,上面的地址还是主机对主机的地址。


但是我们会发现这样一个一个添加的方式太麻烦了,所以我们可以用组播的方式进行通信,直接在组播中去找。

组播Vxlan


要组成同一个VxLAN网络,VTEP必须能感知到彼此的存在。多播组的功能就是把网络中的节点组成一个虚拟的组。

  1. # 第一台
  2. # 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去
  3. ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0
  4. # 设置vxlan1的ip:192.168.1.1
  5. ip addr add 192.168.1.1/24 dev vxlan1
  6. # 启动vxlan1
  7. ip link set vxlan1 up
  1. # 第二台
  2. # 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去
  3. ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0
  4. # 设置vxlan1的ip:192.168.1.2
  5. ip addr add 192.168.1.2/24 dev vxlan1
  6. # 启动vxlan1
  7. ip link set vxlan1 up
  8. # 测试
  9. ping 192.168.1.1

注:组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个多播组 IP 地址,多播地址范围为239.0.0.0~239.255.255.255


组播与点对点的不同点在于FDB表。
可通过如下命令进行查看。

  1. bridge fdb | grep vxlan


我们先来看vxlan0:默认的VTEP对端地址为10.211.55.12。换句话说,原始的报文经过vxlan0后会被内核添加上VXLAN头部,而外部UDP头的目的IP地址会被冠上10.211.55.12。在另一台机器上也进行相同的配置,要保证VNI和dstport也是相同的,并修改VTEP的local和remote IP地址到相应的值。

再来看vxlan1:
dst字段的值变成了组播地址239.1.1.1,而不是之前对方的VTEP地址,意思是原始报文经过vxlan0后被内核添加上VXLAN头部,其外部UDP头的目的IP地址会被冠上多播地址239.1.1.1;配置好后,VTEP通过IGMP加入同一个多播组239.1.1.1。

Vxlan+桥接网络


尽管上面的方法能够通过多播实现自动化的overlay网络构建,但是通信的双方只有一个VTEP。在实际生产中,每台主机上都有几十台甚至上百台虚拟机或者容器需要通信,因此需要找到一种方法将这些通信实体组织起来,再经过隧道口VTEP转发出去。

通过前面的介绍我们知道,Linux网桥可以连接多块虚拟网卡,因此可以使用网桥把多个虚拟机或者容器放到同一个VXLAN网络中,VXLAN+网桥的网络拓扑如下图所示。


和上面的多播模式相比,这里只是多了一块网桥,连接同一个主机上的不同容器的veth pair。接下来我们先用network namespace代替容器,其实现原理都是一样的。我们将创建一个network namespace,并通过一对veth pair将namespace中的eth0网卡连接到网桥。同时,VXLAN网卡也连接到网桥。

  1. # 创建 namespace
  2. ip netns add ns0
  3. ip netns add ns1
  4. # 创建 bridge
  5. ip link add br0 type bridge
  6. ip link set br0 up
  7. # 创建两对 veth-pair (相当于网线)
  8. ip link add veth0 type veth peer name br0-veth0
  9. ip link add veth1 type veth peer name br0-veth1
  10. # 先插入一头到网络名称空间里面去
  11. ip link set veth0 netns ns0
  12. ip link set veth1 netns ns1
  13. # 再插入一头到网桥里面去
  14. ip link set br0-veth0 master br0
  15. ip link set br0-veth1 master br0
  16. # 都要激活
  17. ip link set br0-veth0 up
  18. ip link set br0-veth1 up
  19. # 配置ip并启用
  20. ip netns exec ns0 ip add a 192.168.1.10/24 dev veth0
  21. ip netns exec ns0 ip link set veth0 up
  22. ip netns exec ns0 ip link set lo up
  23. ip netns exec ns1 ip add a 192.168.1.11/24 dev veth1
  24. ip netns exec ns1 ip link set veth1 up
  25. ip netns exec ns1 ip link set lo up
  26. # 把vxlan1加入到网桥网络
  27. ip link set vxlan1 master br0
  28. # 测试ns1 ping ns0
  29. ip netns exec ns1 ping 192.168.1.10

  1. # 创建 namespace
  2. ip netns add ns2
  3. ip netns add ns3
  4. # 创建 bridge
  5. ip link add br0 type bridge
  6. ip link set br0 up
  7. # 创建两对 veth-pair (相当于网线)
  8. ip link add veth2 type veth peer name br0-veth2
  9. ip link add veth3 type veth peer name br0-veth3
  10. # 先插入一头到网络名称空间里面去
  11. ip link set veth2 netns ns2
  12. ip link set veth3 netns ns3
  13. # 再插入一头到网桥里面去
  14. ip link set br0-veth2 master br0
  15. ip link set br0-veth3 master br0
  16. # 都要激活
  17. ip link set br0-veth2 up
  18. ip link set br0-veth3 up
  19. # 配置ip并启用
  20. ip netns exec ns2 ip add a 192.168.1.12/24 dev veth2
  21. ip netns exec ns2 ip link set veth2 up
  22. ip netns exec ns2 ip link set lo up
  23. ip netns exec ns3 ip add a 192.168.1.13/24 dev veth3
  24. ip netns exec ns3 ip link set veth3 up
  25. ip netns exec ns3 ip link set lo up
  26. # 把vxlan1加入到网桥网络
  27. ip link set vxlan1 master br0
  28. # 测试ns3 ping ns2
  29. ip netns exec ns3 ping 192.168.1.12


最后测试它们之间是否能够ping通。


关于Ubuntu请参考:https://www.freesion.com/article/5905520026/

Flannel简介


Flannel 是 CoreOS 团队中针对 Kubernetes 设计的一个网络规划服务,简单说它功能可以让集群中的不同节点主机创建的 Docker 都具有,整个集群中唯一的虚拟IP地址。在docker配置中,每一个节点的docker服务会分别负责所在节点容器的IP分配。这样导致不同的点上容器可能获得相同的内外IP地址。

flannel 的设计目的就是为集中的所有及诶单重新规划 IP 地址的使用规则,从而使得不同的节点上的容器能够获得同属于一个内网且不重复的IP地址,并且使得属于不同节点上的容器能够直接通过内网的IP 通信。
大致的网络结构如下:


我们会发现与我们刚刚的搭建的 vxlan 差不多,只是Flannel并非依赖ARP进行MAC地址学习,而是由节点上的flanneld进程启动时将本地flannel.1接口IP与MAC地址的映射信息上报到etcd中,并由其他各节点上的flanneld来动态生成相应的解析记录。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

默认昵称

2023/3/9 15:14:39

mac地址会更改但vxlan解析后mac地址除了源mac地址改为cni0的地址外目的mac是c3 pod的mac. 这里的源地址是被改为flannel.1的mac地址吧 ,你这里写的是cni0的地址

传统网络 VxLAN实现的大二层

传统网络 VxLAN实现的大二层[TOC] VxLAN 简介RFC定义了VLAN扩展方案VXLAN(Virtual eXtensible Local Area Network,虚拟...

Kubernetes Calico VxLAN

Kubernetes Calico Vxlan[TOC] 安装vxlan我们可以通过如下命令一件安装Calico Vxlan。kubectl apply -f https://raw.githu...

Flannel VxLAN

Flannel Vxlan[TOC] 同节点同Pod不同容器使用共享的网络名称空间进行通信,使用Container网络模式,通过lo网卡建立两个容...

/run/Flannel/subnet.env is missing Flannel_NETWORK Flannel_IPV6_NETWORK

k8s部署报错:/run/flannel/subnet.env is missing FLANNEL_NETWORK, FLANNEL_IPV6_NETWORK 这个错其实也是因为subnet.env...

k8s Flannel插件指定网卡。启动Flannel参数中添加虚拟网卡的指定,可以解决多网卡问题

在kube-flannel.yml中这里设置即可: args: - --ip-masq - --kube-subnet-mgr - --iface=enp0...

k8s 网络插件 Calico 和 Flannel 文档

https://projectcalico.docs.tigera.io/getting-started/kubernetes/flannel/flannel

Flannel CNI初探

Flannel CNI初探[TOC] Flannel 简介Flannel是由CoreOs提出的跨主通信容器网络解决方案,通过分配和管理全局唯一容器IP以及...

Flannel HOST-GW模式

Flannel HOST-GW模式[TOC] 在讲Flannel HOST-GW模式之前我们可以先来看看静态路由。静态路由简单讲:网络管理员在路由器上...

Flannel IPIP模式

Flannel IPIP模式[TOC] IPIP模式简介ipip模式类似于vxlan模式,不过这个是三层封装三层网络。更多可以参考这篇文章:https...

Flannel UDP模式

Flannel UDP模式[TOC] Tap与Tun设备tap/tun 提供了一台主机内用户空间的数据传输机制。不同是一个处理二层一个处理三层。...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术