Kubernetes Calico Vxlan 电脑版发表于:2022/11/15 15:00  >#Kubernetes Calico Vxlan [TOC] ## 安装vxlan tn2>我们可以通过如下命令一件安装Calico Vxlan。 ```bash kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico-vxlan.yaml ``` ## IPIP模式转换VXLAN与参数讲解 tn>Vxlan不会用到BGP,只有IPIP模式才会用到BGP。 ```yaml apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: ippool-vxlan-1 spec: cidr: 192.168.0.0/16 vxlanMode: Always natOutgoing: true ``` tn2>修改我们的IPPool。 ```bash kubectl edit ippool default-ipv4-ippool ```  tn2>当`vxlanMode`参数设置为 `Always` 的时候,三层和二层的通信都通过vxlan的方式进行通信,当值为`CrossSubnet`的时候只有三层才进行vxlan的方式进行通信。 tn2>我们可以通过点击这个<a href=" https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico-vxlan.yaml">链接来访问Vxlan的Yaml</a>。 我首先节选了部分`calico-config`的配置。 ```yaml kind: ConfigMap apiVersion: v1 metadata: name: calico-config namespace: kube-system data: # Typha is disabled. typha_service_name: "none" # Configure the backend to use. calico_backend: "vxlan" ``` tn2>当我们想安装calico vxlan的时候。 calico_backend参数将会设置为`vxlan`将会禁用`bird`组件。 由于不使用`bird`组件,所以我们也需要关闭对`bird`组件的检测`# - -bird-ready`与`# - -bird-live`,这里已经去掉了。  tn2>由于我们需要三层的方式通信,所以我们还需要将`CALICO_IPV4POOL_VXLAN`参数更改为`Always`。然后我们才可以进行更新安装配置。 ```bash kubectl apply -f calico-vxlan.yaml ```  tn2>安装完成之后,我们发现确实BGP没有运行了。 ```bash calicoctl --allow-version-mismatch node status ```  ## 实践 tn2>首先我们创建两个pod,并进行ping尝试是否能够互通。 ```bash vim cni.yaml ``` ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: cni spec: selector: matchLabels: app: cni replicas: 2 template: metadata: labels: app: cni spec: containers: - name: cni image: burlyluo/nettoolbox ``` ```bash kubectl apply -f cni.yaml kubectl get pod -o wide ```  tn2>首先我们node1上的pod测试ping,进过下面代码的测试发现是没问题的。 ```bash kubectl exec cni-68878bb9bd-8qzfr -- ping 192.168.202.13 ```  ## 如何实现的? tn2>首先我们来看node1上的pod的路由表。 ```bash kubectl exec cni-68878bb9bd-8qzfr -- route -n ```  tn2>169.254.1.1不用再说了吧,就是从当前主机那儿拿到个mac地址。 接下来我们在来看看主机的路由。  tn2>我们要到达的目标地址是`192.168.202.13`,所以下一跳的网关应该是`192.168.202.12`那么它是如何获取到目标主机地址的呢? 其实是通过目标mac地址在fdb表中查询到的(在这里会修改mac地址),就是2个 veth一端插这头一端插那头。 我们可以通过如下命令进行查看。 ```bash # 在node2中查询vxlan.calico的mac地址 ifconfig ```  ```bash # 再次查看fdb表 bridge fdb show | grep "66:b5:c2:86:6c:e9" ```  ```bash tcpdump -pne -i vxlan.calico ``` tn2>然后后续到主机上后,通过地址到不同的口子上出去。(这里是cali62f26213c6f出去)  ## 抓包 tn2>我们在Node1上抓包试试看。 ```bash tcpdump -pne -i vxlan.calico | grep 192.168.202 ``` ```bash kubectl exec cni-68878bb9bd-8qzfr -- ping 192.168.202.13 ``` | 名称 | IP | mac地址 | | ------------ | ------------ | ------------ | | cni-68878bb9bd-8qzfr | 192.168.36.83 | F2:DD:ED:53:7B:61 | | cni-68878bb9bd-s9n4s | 192.168.202.13 | 3E:5B:FD:27:61:5B | | Node1上的vxlan.calico | 192.168.36.82 | 66:c6:48:f6:2e:72 | | Node2上的vxlan.calico | 192.168.202.12 | 66:b5:c2:86:6c:e9 | | Node1上的eth0 | 10.211.55.8 | 00:1c:42:fd:68:ff | | Node1上的eth0 | 10.211.55.9 | 00:1c:42:ad:be:97 |  tn2>在Wirshark中查看。 ```bash tcpdump -pne -i eth0 -w eth0_vxlan.cap ``` 