背景
我司某個大數據集群在做完添加到集群聯邦管理后,該集群的calico-node全部處于not ready 狀態,導致集群中節點之前的跨節點容器網絡不通。
操作
將大數據所在的k8s集群添加到集群聯邦的控制平面后,我們為了做各個子集群之間的容器網絡可以直通,同時在對應的大數據集群安裝了submariner,submariner安裝后,其中有一個route-agent組件會以daemonset的方式在每個節點上都啟一個Pod,該Pod起來后會在對應的每個節點上創建一個vx-submariner的vxlan網卡
問題
地址為240.x.x.x,calico-node的配置的IP為aoto-detach,通過查看calico-node的日志發現,calico-node啟動的時候選擇到了240.x.x.x網卡來做為bgp peer member的通信地址,而這是一張虛擬的網卡,各個節點之前是不能直接通的,從而導致bird組件一直not ready,隨后通過官方推介的方式將calico-node的配置修改IP_AUTODETECTION_METHOD=kubernetes-internal-ip,從起所有的calico-node,但是還是not ready,通過查看對應的日志,發現還是選擇的240.x.x.x網卡
原因
通過查看calico-node flex對應的部分的代碼,發現,calico-node起來后會通過獲取自己所在的的node信息,然后根據node上的key為projectcalico.org/IPv4Address對應的IP來構建一個node struct當作peer member的ip暴露出來,所以即使配置IP_AUTODETECTION_METHOD=kubernetes-internal-ip,calico-node啟動的時候還是會優先選擇node的key為projectcalico.org/IPv4Address的annotation對應的值來作為bgp peer member的ip。經過查看node的對應的projectcalico.org/IPv4Address實際的值還是240.x.x.x
解決方式
去掉所有node的對應的annotation,然后從起所有calico-node的pod即可
kubectl annotate node --all projectcalico.org/IPv4Address-kubectl rollout restart daemonset/calico-node -n kube-system
檢查calico-node
kubectl get po -n kube-system |grep calico-node