基础知识
通信四元组信息
源 IP 地址 、源 MAC 地址、目的 IP 地址、目的 MAC 地址
如果想使用 vxlan ,那么必须提前知道对端的 ip 地址。
ARP广播只有在一个广播域内有效,路由器具有天然的屏蔽广播报文的特性,广播报文终止于路由器的接口上。
因为请求的地址,并不是网关的地址,不会通过三层走网关,二层的通信是通过 ARP 广播
二层需要防环,三层路由通过路由表的维护,基本不会有环
为什么需要 VXLAN ?
华为 vxlan 文档
一句话总结,为了解决虚拟化的发展过程中的,服务器迁移的问题,诞生了 overlay 大二层通信的 vxlan,可以随意迁移,相当于在计算机网口交换机更换不同的 Access 口。
linux 点对点 vxlan 演示
主机信息:
主机 50 网卡IP:192.168.0.50/24 vxlan ip: 20.1.1.2/24
主机 60 网卡IP:192.168.0.60/24 vxlan ip: 20.1.1.3/24
50 主机操作
# 50 主机创建 vxlan0 网卡
ip link add vxlan0 type vxlan id 5 dstport 4789 remote 192.168.0.60 local 192.168.0.50 dev ens33
# 查看创建网卡信息
ip -d link show vxlan0
# 给网卡添加 ip 地址
ip address add 20.1.1.2/24 dev vxlan0
ip link set vxlan0 up
# 查看网卡的 IP 地址
ifconfig vxlan0
60 主机操作
ip link add vxlan0 type vxlan id 5 dstport 4789 remote 192.168.0.50 local 192.168.0.60 dev ens33
ip address add 20.1.1.3/24 dev vxlan0
ip link set vxlan0 up
ifconfig vxlan0
分析数据报文
50 主机指定网卡 ping 操作
# 指定 vxlan0 进行ping 操作
ping -I 20.1.1.2 20.1.1.3
60 主机抓包
注意:需要对 ens33 抓包,这样才能看到两层 IP地址
tcpdump -pne -i ens33 -w vxlan0.cap
通过 wareshark 进行包分析
报文均经过 vxlan 进行封装
arp 广播 目的地址为 20.1.1.3
返回了目的地址的 MAC 地址
标准的 vxlan 报文
cilium vxlan 模式
cilium 默认就是 vxlan 模式
root@master:~# cat 1.10.6.yaml | grep tunnel
tunnel: vxlan
通过抓取不同 node 网卡报文进行测试验证
<sub># kubectl create deployment cni-test --image=burlyluo/nettoolbox:latest --replicas=3
</sub># kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cni-test-76d79dfb85-5l4w9 1/1 Running 0 78s 10.0.0.133 node-1.whale.com <none> <none>
cni-test-76d79dfb85-7thf8 1/1 Running 0 78s 10.0.0.67 node-1.whale.com <none> <none>
cni-test-76d79dfb85-jfqc5 1/1 Running 0 78s 10.0.1.215 node-2.whale.com <none> <none>
~# kubectl exec -it cni-test-76d79dfb85-5l4w9 -- ping 10.0.1.215
node-2 节点抓包
tcpdump -pne -i ens33 -w cilium_vxlan.cap
首先需要修改默认 wireshark 解析
选中 UDP 报文,右键点击 解码为(decode as)
将 UDP的 端口修改为 8472 ,最后一栏协议修改为 VXLAN
查看 ICMP 报文
进入任意一个cilium 容器中,查看VNID 是否和图中一致
kubectl exec -it cilium-fxdkr -- bash
cilium endpoint list | grep 3352
cilium identity list | grep 3352
Cilium vxlan ICMP报文中 Request VNID 和 Reply VNID 不一定相同
注意,这个特性是 cilium 自带的,类似于交换机的 trunk 口,VNID 类比于不同的vlan ID
查看当前有几个不同的 VNID
cilium VNID 就是每个应用的 identity,不同的应用具有不同 VNID
kubectl exec -it cilium-fxdkr -- bash
root@node-2:/home/cilium# cilium identity list
ID LABELS
1 reserved:host
2 reserved:world
3 reserved:unmanaged
4 reserved:health
5 reserved:init
6 reserved:remote-node
3352 k8s:app=cni-test
k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
k8s:io.cilium.k8s.policy.cluster=default
k8s:io.cilium.k8s.policy.serviceaccount=default
k8s:io.kubernetes.pod.namespace=default
53142 k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=kube-system
k8s:io.cilium.k8s.policy.cluster=default
k8s:io.cilium.k8s.policy.serviceaccount=coredns
k8s:io.kubernetes.pod.namespace=kube-system
k8s:k8s-app=kube-dns
60388 k8s:app=test-nginx
k8s:io.cilium.k8s.namespace.labels.kubernetes.io/metadata.name=default
k8s:io.cilium.k8s.policy.cluster=default
k8s:io.cilium.k8s.policy.serviceaccount=default
k8s:io.kubernetes.pod.namespace=default
测试场景:
如图所示,cni-test 中的 pod 去ping test-nginx 不同节点的pod,并在node上进行抓包验证 VNID
~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cni-test-76d79dfb85-5l4w9 1/1 Running 0 123m 10.0.0.133 node-1.whale.com <none> <none>
cni-test-76d79dfb85-7thf8 1/1 Running 0 123m 10.0.0.67 node-1.whale.com <none> <none>
cni-test-76d79dfb85-jfqc5 1/1 Running 0 123m 10.0.1.215 node-2.whale.com <none> <none>
test-nginx-976fbbd77-2j26l 1/1 Running 0 19h 10.0.1.119 node-2.whale.com <none> <none>
# ping
kubectl exec -it cni-test-76d79dfb85-5l4w9 -- ping 10.0.1.119
# 抓包
tcpdump -pne -i ens33 -w cilium_vnid.cap
request VNID 3352
reply VNID 60388
总结:cilium VNID 就是每个应用的 identity,不同的应用具有不同 VNID,这种类似于 不同vlan ID 的 在 trunk 口通信的方式,是需要注意的地方,flannel vxlan 和calico vxlan 都是相同的 VNID