找回密码
 立即注册
首页 业界区 业界 Calico VXLAN 使用指南

Calico VXLAN 使用指南

橘芜 昨天 15:07
模式介绍

项目文档:https://docs.tigera.io/calico/latest/networking/configuring/vxlan-ipip
VXLAN(Virtual eXtensible LAN)这种网络封装协议,将 Pod 原始数据包封装在 UDP 数据包中传输,使底层网络不需要感知 Pod IP 地址。VXLAN 的优势是不依赖 BGP、支持 IPv6;对比 IPIP 模式,它的头部更大(50B vs IPIP 20B),性能略差。在 IPIP 可用的情况下(如 AWS),IPIP 通常是更好的选择。
简单来讲,同一局域网里中交换机根据 MAC 地址让不同机器通信。但 VXLAN 做的是:把一个二层网络封装到 UDP 包里,通过三层网络传输。这样即使两台机器不在同一个物理交换机下,也能像在同一个局域网里一样通信。
这也是 Overlay 网络的核心:利用真实的 IP 网络(三层)作为运输通道,把原本只能在同一交换机下生效的二层 MAC 机制,用隧道技术伪装成一个大的虚拟局域网。不同于传统二层依赖广播学习 MAC,Overlay 通常由控制平面主动下发映射来避免广播风暴。
此处的控制平面指的是跑在每个节点上的 felix
  1. root@network-demo:~# kubectl get pods -n kube-system | grep 'calico-node'
  2. calico-node-696p5                                    1/1     Running   1 (5d5h ago)   7d3h
  3. calico-node-dxz57                                    1/1     Running   1 (5d5h ago)   7d3h
  4. root@network-demo:~# docker exec calico-vxlan-control-plane ss -nltup | grep -i calico
  5. tcp   LISTEN 0      4096       127.0.0.1:9099       0.0.0.0:*    users:(("calico-node",pid=1284,fd=9))   
  6. root@network-demo:~# docker exec calico-vxlan-control-plane ps aux | grep '-felix'
  7. root        1284  0.8  0.2 2117200 64012 ?       Sl   Mar31  66:17 calico-node -felix
复制代码
使用场景

场景是否推荐说明Azure 环境✅Azure 封禁 IPIP 协议,VXLAN 是唯一 overlay 选项IPv6 环境✅IPIP 仅支持 IPv4,VXLAN 是 IPv6 overlay 唯一选择启用 eBPF✅eBPF 模式不支持 IPIP,必须用 VXLANAWS 多 AZ / 跨子网✅同 AZ 直通、跨 AZ 封装 → vxlanMode: CrossSubnet 性能更优公有云✅无法配 BGP 或底层路由 → vxlanMode: Always 开箱即用快速使用✅不折腾底层网络,直接 overlay 起来,可关闭 BGP 减少组件自建机房❌有完整网络控制权 → 无封装 + BGP 是官方首选Pod IP 需集群外可达❌Overlay 下 Pod IP 不可路由到外部 → BGP 纯路由模式部署流程

通过 Kind 快速生成集群并部署 Calico VXLan 模式
  1. #!/bin/bash
  2. set -v
  3. # 1. prep NoCNI environment
  4. cat <<EOF | HTTP_PROXY= HTTPS_PROXY= http_proxy= https_proxy= kind create cluster --name=calico-vxlan --image=kindest/node:v1.27.3 --config=-
  5. kind: Cluster
  6. apiVersion: kind.x-k8s.io/v1alpha4
  7. networking:
  8.         disableDefaultCNI: true
  9. nodes:
  10.         - role: control-plane
  11.         - role: worker
  12. EOF
  13. # 2. Remove taints
  14. controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
  15. kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/control-plane:NoSchedule-
  16. kubectl get nodes -o wide
  17. # 3. Collect startup message
  18. controller_node_name=$(kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep control-plane)
  19. if [ -n "$controller_node_name" ]; then
  20.   timeout 1 docker exec -t $controller_node_name bash -c 'cat << EOF > /root/monitor_startup.sh
  21. #!/bin/bash
  22. ip -ts monitor all > /root/startup_monitor.txt 2>&1
  23. EOF
  24. chmod +x /root/monitor_startup.sh && /root/monitor_startup.sh'
  25. else
  26.   echo "No such controller_node!"
  27. fi
  28. # 4. Install CNI[Calico v3.23.2]
  29. kubectl apply -f calico.yaml
复制代码
3.查询节点 ARP 表

跨节点 Pod 流量走 VXLAN 隧道。每条远端 Pod IP → VTEP MAC 的映射由 Felix(Calico agent) 主动写入邻居表并标记为 PERMANENT。
既然是远端,这里的 66:aa:ae:c0:d0:7a MAC 肯定是对端 Pod Node VTEP MAC。
  1. ## calico.yaml
  2. ## https://gitee.com/rowan-wcni/wcni-kind/blob/master/LabasCode/calico/03-calico-vxlan/calico.yaml
复制代码
4.查询节点 FDB 表

vxlan.calico 是 vxlan 设备,请求经过他时,会通过 FDB 表查询
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   labels:
  5.     app: wluo
  6.   name: wluo
  7. spec:
  8.   selector:
  9.     matchLabels:
  10.       app: wluo
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: wluo
  15.     spec:
  16.       containers:
  17.       - image: burlyluo/nettool:latest
  18.         name: nettoolbox
  19.         env:
  20.           - name: NETTOOL_NODE_NAME
  21.             valueFrom:
  22.               fieldRef:
  23.                 fieldPath: spec.nodeName
  24.         securityContext:
  25.           privileged: true
复制代码
查询 Pod 路由、ARP、网络设备信息

验证路由规则、calico 生成的网络设备开启 proxy_arp 后的效果
1.查询 Pod 网卡信息
  1. root@network-demo:~# kubectl get pods -A -o wide
  2. NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE   IP              NODE
  3. default       wluo-nkmtp                                           1/1     Running   1          47h   10.244.177.66   calico-vxlan-worker
  4. default       wluo-qf5cc                                           1/1     Running   1          47h   10.244.110.74   calico-vxlan-control-plane
  5. kube-system   calico-kube-controllers-5b5ff6cb74-fp4r9             1/1     Running   1          47h   10.244.110.72   calico-vxlan-control-plane
  6. kube-system   calico-node-696p5                                    1/1     Running   1          47h   172.18.0.2      calico-vxlan-worker
  7. kube-system   calico-node-dxz57                                    1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
  8. kube-system   coredns-5d78c9869d-w4d2g                             1/1     Running   1          47h   10.244.110.71   calico-vxlan-control-plane
  9. kube-system   coredns-5d78c9869d-zl7qg                             1/1     Running   1          47h   10.244.110.70   calico-vxlan-control-plane
  10. kube-system   etcd-calico-vxlan-control-plane                      1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
  11. kube-system   kube-apiserver-calico-vxlan-control-plane            1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
  12. kube-system   kube-controller-manager-calico-vxlan-control-plane   1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
  13. kube-system   kube-proxy-rsf5n                                     1/1     Running   1          47h   172.18.0.2      calico-vxlan-worker
  14. kube-system   kube-proxy-zn8vq                                     1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
  15. kube-system   kube-scheduler-calico-vxlan-control-plane            1/1     Running   1          47h   172.18.0.3      calico-vxlan-control-plane
复制代码
2.查询 Pod 路由

与 Calico IPIP 模式一样,容器默认网关的 IP 169.254.1.1 是什么其实无所谓。因为通过 scope link 配置后,这条路由被标记为本地链路路由,通信走的是二层转发,依赖的是 MAC 地址而非 IP 地址。
  1. ## 节点信息
  2. root@network-demo:~# kubectl get node -o wide
  3. NAME                         STATUS   ROLES           AGE   VERSION   INTERNAL-IP
  4. calico-vxlan-control-plane   Ready    control-plane   47h   v1.27.3   172.18.0.3
  5. calico-vxlan-worker          Ready    <none>          47h   v1.27.3   172.18.0.2
  6. ## Pod 信息
  7. root@network-demo:~# kubectl get pods -o wide
  8. NAME         READY   STATUS    RESTARTS   AGE   IP              NODE
  9. wluo-nkmtp   1/1     Running   1          47h   10.244.177.66   calico-vxlan-worker
  10. wluo-qf5cc   1/1     Running   1          47h   10.244.110.74   calico-vxlan-control-plane
复制代码
3.查询 Pod ARP 信息
  1. root@calico-vxlan-control-plane:/# ip -d link show vxlan.calico
  2. 6: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
  3.     link/ether 66:40:d4:7a:17:07 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535
  4.     vxlan id 4096 local 172.18.0.3 dev eth0 srcport 0 0 dstport 4789 nolearning ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
  5. root@calico-vxlan-control-plane:/# ip address show vxlan.calico
  6. 6: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
  7.     link/ether 66:40:d4:7a:17:07 brd ff:ff:ff:ff:ff:ff
  8.     inet 10.244.110.64/32 scope global vxlan.calico
  9.        valid_lft forever preferred_lft forever
复制代码
Pod 网卡处抓包
  1. root@network-demo:~# docker exec -it calico-vxlan-control-plane ip route show | grep '10.244.177.64'
  2. ## 访问 10.244.177.66 走这条路由(子网掩码 /26 包含),具体看下面 ipcalc 结果
  3. 10.244.177.64/26 via 10.244.177.64 dev vxlan.calico onlink
  4. ## ipcalc 10.244.177.64/26
  5. ## Address:   10.244.177.64        00001010.11110100.10110001.01 000000
  6. ## Netmask:   255.255.255.192 = 26 11111111.11111111.11111111.11 000000
  7. ## Wildcard:  0.0.0.63             00000000.00000000.00000000.00 111111
  8. ## =>
  9. ## Network:   10.244.177.64/26     00001010.11110100.10110001.01 000000
  10. ## HostMin:   10.244.177.65        00001010.11110100.10110001.01 000001
  11. ## HostMax:   10.244.177.126       00001010.11110100.10110001.01 111110
  12. ## Broadcast: 10.244.177.127       00001010.11110100.10110001.01 111111
  13. ## Hosts/Net: 62                    Class A, Private Internet
  14. ## 效果同 ip route show
  15. root@network-demo:~# docker exec -it calico-vxlan-control-plane route -n | grep '10.244.177.64'
  16. Kernel IP routing table
  17. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
  18. 10.244.177.64   10.244.177.64   255.255.255.192 UG    0      0        0 vxlan.calico
复制代码
1.png

2.png

Node 网卡处抓包

3.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册