Linux KVM 虛擬機使用Vxlan通訊
本文的實驗環境:
兩台物理服務器:浪潮
服務器操作系統:Centos8 Server
Linux 內核版本:4.18.0-147.el8.x86_64
虛擬機系統:centos8 mini
一、點對點的VXLAN :
過程介紹:一台物理服務器架vxlan 虛擬網卡,將其綁定在物理網卡上,物理網卡負責傳輸報文,從而能夠正常通訊;
最簡單的vlxan ,直接用兩台服務器構成一個vxlan 網絡,每台機器有一個 vtep,vtep 通過它們的 IP 互相通信;
流程如下:
vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)----->eth0(10.20.1.3)----->vxlan1(192.168.8.100)
1、物理服務器設置IP
過程在這里不進行敘述;
2、建vxlan 網絡
這里我們全部采用IP 命令;
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.8.101 local 192.168.8.100 dev ens47f1
相關參數解釋:
Id:vxlan 里的VNI 值,理解為tag 值即可;
Remote:遠端vtep IP,這個IP 是指的對端的網卡IP;
Local: 當前節點 vtep 要使用的 IP 地址;
dstport:vtep 通信的端口,linux 默認使用 8472(為了保持兼容,默認值一直沒有更改),而 IANA 分配的端口是 4789,所以我們這里顯式指定了它的值;
dev ens47f1:當節點用於 vtep 通信的網卡設備,用來讀取 IP 地址;
查看vxlan 虛擬機網卡的相關信息:
[root@centos111 ~] # ip -d link show vxlan0
20: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1550 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether ea:5a:4c:51:85:cf brd ff:ff:ff:ff:ff:ff promiscuity 1
vxlan id 42 remote 192.168.8.100 local 192.168.8.101 dev ens47f1 srcport 0 0 dstport
3、為創建的虛擬網卡設置IP
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
4、啟動網卡
[root@centos111 ~]# ip link set vxlan0 up
5、服務器2 設置
第二台進行與第一台相同的過程,需要注意的是IP 要設置成規划中的,要保證 VNI 也是 42,dstport 也是 4789,比如物理服務器網卡IP 需要設置成192.168.8.100 ,虛擬網卡IP 要設置成10.20.1.3即可;
6、測試vxlan 之間是否能通訊
ping 測試:
在一台服務器上進行pingd 對端:如在10.20.1.2 上ping 10.20.1.3;
[root@centos111 ~]# ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
64 bytes from 10.20.1.3: icmp_seq=1 ttl=64 time=1.84 ms
64 bytes from 10.20.1.3: icmp_seq=2 ttl=64 time=0.462 ms
64 bytes from 10.20.1.3: icmp_seq=3 ttl=64 time=0.427 ms
二、多播模式的 vxlan
多播組本來的功能就是把網絡中的某些節點組成一個虛擬的組,所以 vxlan 最初想到用多播來實現是很自然的事情。
這個實驗和前面一個非常相似,只不過主機之間不是點對點的連接,而是通過多播組成一個虛擬的整體;
流程:
流程如下:
vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)---mulcast group(239.1.1.1)-->eth0(10.20.1.3)----->vxlan1(192.168.8.100)
1、物理服務器設置IP
過程在這里不進行敘述;
2、創建vxlan 網絡
這里我們全部采用IP 命令;
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens47f1
參數:
參數 group 239.1.1.1 表示把 vtep 加入到這個多播組;
運行上面的命令之后,一樣添加了對應的路由,不同是的 fdb 表項:
[root@centos111 ~]# bridge fdb
00:00:00:00:00:00 dev vxlan0 dst 239.1.1.1 via enp0s8 self permanent
這里默認表項的 dst 字段的值變成了多播地址 239.1.1.1,而不是之前對方的 vtep 地址。
3、為創建的虛擬網卡設置IP
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
4、啟動網卡
[root@centos111 ~]# ip link set vxlan0 up
對端需要同樣進行設置;
5、測試vxlan 之間是否能通訊
ping 測試:
在一台服務器上進行pingd 對端:如在10.20.1.2 上ping 10.20.1.3;
[root@centos111 ~]# ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
64 bytes from 10.20.1.3: icmp_seq=1 ttl=64 time=1.84 ms
64 bytes from 10.20.1.3: icmp_seq=2 ttl=64 time=0.462 ms
64 bytes from 10.20.1.3: icmp_seq=3 ttl=64 time=0.427 ms
三、利用 bridge 來連接虛擬機之間通訊
盡管上面的方法能夠通過多播實現自動化的 overlay 網絡構建,但是通信的雙方只有 vtep,在實際的生產中,每台主機上都有幾十台甚至上百台的虛擬機或者容器需要通信,因此我們需要找到一種方法能夠把這些通信實體組織起來。
在 linux 中把同一個網段的 interface 組織起來正是網橋(bridge,或者 switch,這兩個名稱等價)的功能,因此這部分我們介紹如何用網橋把多個虛擬機或者容器放到同一個 vxlan overlay 網絡中;
流程:
vm1 --->br1 --->vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)---mulcast group(239.1.1.1)-->eth0(10.20.1.3)----->vxlan1(192.168.8.100)--->br1 --->vm2
1、網橋與vxlan 虛擬IP設置
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens47f1
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
[root@centos111 ~]# ip link add br0 type bridge
[root@centos111 ~]# ip link set vxlan0 master br0
[root@centos111 ~]# ip link set vxlan0 up
[root@centos111 ~]# ip link set br0 up
2、網橋與Vxlan 相關配置查看
[root@centos111 ~]# ip -d link show vxlan0
30: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1550 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether de:6a:ea:48:19:54 brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 42 group 239.1.1.1 dev ens39f1 srcport 0 0 dstport 4789 ttl inherit ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
[root@centos111 ~]# ip route
default via 192.168.107.254 dev eno4 proto static metric 103
10.20.1.0/24 dev vxlan0 proto kernel scope link src 10.20.1.2
192.168.8.0/24 dev ens39f1 proto kernel scope link src 192.168.8.100
192.168.107.0/24 dev eno4 proto kernel scope link src 192.168.107.111 metric 103
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
[root@centos111 ~]# ip -d link show br0
31: br0: <BROADCAST,MULTICAST> mtu 1550 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether de:6a:ea:48:19:54 brd ff:ff:ff:ff:ff:ff promiscuity 0
bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.de:6a:ea:48:19:54 designated_root 8000.de:6a:ea:48:19:54 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer 0.00 tcn_timer 0.00 topology_change_timer 0.00 gc_timer 0.00 vlan_default_pvid 1 vlan_stats_enabled 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 4 mcast_hash_max 512 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
mac 地址轉發表
[root@centos111 ~]# bridge fdb
01:00:5e:00:00:01 dev dev eno1 self permanent
01:00:5e:00:00:01 dev dev eno2 self permanent
01:00:5e:00:00:01 dev dev eno3 self permanent
01:00:5e:00:00:01 dev dev eno4 self permanent
33:33:00:00:00:01 dev dev eno4 self permanent
33:33:ff:47:c8:92 dev dev eno4 self permanent
33:33:00:00:00:fb dev dev eno4 self permanent
01:00:5e:00:00:fb dev dev eno4 self permanent
01:00:5e:00:00:01 dev dev ens39f0 self permanent
33:33:00:00:00:01 dev dev ens39f0 self permanent
01:00:5e:00:00:01 dev dev ens39f1 self permanent
33:33:00:00:00:01 dev dev ens39f1 self permanent
01:00:5e:00:00:fb dev dev ens39f1 self permanent
01:00:5e:01:01:01 dev dev ens39f1 self permanent
01:00:5e:00:00:01 dev dev virbr0 self permanent
01:00:5e:00:00:fb dev dev virbr0 self permanent
52:54:00:ef:fa:d0 dev dev virbr0-nic vlan 1 master virbr0 permanent
52:54:00:ef:fa:d0 dev dev virbr0-nic master virbr0 permanent
33:33:00:00:00:01 dev dev vnet0 self permanent
01:00:5e:00:00:01 dev dev vnet0 self permanent
33:33:ff:ba:7c:55 dev dev vnet0 self permanent
33:33:00:00:00:fb dev dev vnet0 self permanent
de:6a:ea:48:19:54 dev dev vxlan0 vlan 1 master br0 permanent
de:6a:ea:48:19:54 dev dev vxlan0 master br0 permanent
00:00:00:00:00:00 dev dev vxlan0 dst 239.1.1.1 via ens39f1 self permanent
33:33:00:00:00:01 dev dev br0 self permanent
3、第二台主機配置
[root@localhost ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens39f1
[root@localhost ~]# ip addr add 10.20.1.3 dev vxlan0
[root@localhost ~]# ip link set vxlan0 up
[root@localhost ~]# ip link add br0 type bridge
[root@localhost ~]# ip link set vxlan0 master br0
[root@localhost ~]# ip link set br0 up
4、將虛擬機配置
網卡架在br0 上,啟動虛擬機,隨后對兩台服務器上的虛擬機設置同網段的IP,進行Ping 測試,如果可以正常ping 通,那么證明配置成功;
具體操虛擬機配置使用網橋請參照虛擬機使用網橋的說明文檔;
