
Kubernetes Calico Vxlan
安装vxlan
我们可以通过如下命令一件安装Calico Vxlan。
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico-vxlan.yaml
IPIP模式转换VXLAN与参数讲解
Vxlan不会用到BGP,只有IPIP模式才会用到BGP。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-1
spec:
cidr: 192.168.0.0/16
vxlanMode: Always
natOutgoing: true
修改我们的IPPool。
kubectl edit ippool default-ipv4-ippool
当vxlanMode
参数设置为 Always
的时候,三层和二层的通信都通过vxlan的方式进行通信,当值为CrossSubnet
的时候只有三层才进行vxlan的方式进行通信。
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"
当我们想安装calico vxlan的时候。
calico_backend参数将会设置为vxlan
将会禁用bird
组件。
由于不使用bird
组件,所以我们也需要关闭对bird
组件的检测# - -bird-ready
与# - -bird-live
,这里已经去掉了。
由于我们需要三层的方式通信,所以我们还需要将CALICO_IPV4POOL_VXLAN
参数更改为Always
。然后我们才可以进行更新安装配置。
kubectl apply -f calico-vxlan.yaml
安装完成之后,我们发现确实BGP没有运行了。
calicoctl --allow-version-mismatch node status
实践
首先我们创建两个pod,并进行ping尝试是否能够互通。
vim cni.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
kubectl apply -f cni.yaml
kubectl get pod -o wide
首先我们node1上的pod测试ping,进过下面代码的测试发现是没问题的。
kubectl exec cni-68878bb9bd-8qzfr -- ping 192.168.202.13
如何实现的?
首先我们来看node1上的pod的路由表。
kubectl exec cni-68878bb9bd-8qzfr -- route -n
169.254.1.1不用再说了吧,就是从当前主机那儿拿到个mac地址。
接下来我们在来看看主机的路由。
我们要到达的目标地址是192.168.202.13
,所以下一跳的网关应该是192.168.202.12
那么它是如何获取到目标主机地址的呢?
其实是通过目标mac地址在fdb表中查询到的(在这里会修改mac地址),就是2个 veth一端插这头一端插那头。
我们可以通过如下命令进行查看。
# 在node2中查询vxlan.calico的mac地址
ifconfig
# 再次查看fdb表
bridge fdb show | grep "66:b5:c2:86:6c:e9"
tcpdump -pne -i vxlan.calico
然后后续到主机上后,通过地址到不同的口子上出去。(这里是cali62f26213c6f出去)
抓包
我们在Node1上抓包试试看。
tcpdump -pne -i vxlan.calico | grep 192.168.202
kubectl exec cni-68878bb9bd-8qzfr -- ping 192.168.202.13
名称 | IP | mac地址 |
---|---|---|
cni-68878bb9bd-8qzfr | 192.168.36.83 | F2![]() ![]() |
cni-68878bb9bd-s9n4s | 192.168.202.13 | 3E![]() ![]() |
Node1上的vxlan.calico | 192.168.36.82 | 66![]() ![]() |
Node2上的vxlan.calico | 192.168.202.12 | 66![]() ![]() |
Node1上的eth0 | 10.211.55.8 | 00![]() ![]() |
Node1上的eth0 | 10.211.55.9 | 00![]() ![]() |
在Wirshark中查看。
tcpdump -pne -i eth0 -w eth0_vxlan.cap
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

