arm64 系統克隆主機上 部署 k8s 跨節點 pod 網路不通 解決方法
前言
測試環境中使用了一臺 長城 arm 架構的伺服器,建立幾臺虛擬機器準備測試安裝 kubernetes 。按照之前 虛擬化的使用方式,建立並安裝一臺虛擬機器後,後面的虛擬機器從安裝好系統的虛擬機器克隆而來。再克隆好的主機上搭建完 Kubernetes 之後,發現跨節點的 Pod 無法訪問。
附上參考連結:https://zhangguanzhang.github.io/2020/11/06/kylin-arm-clone-vxlan-error/
環境資訊
系統版本:
叢集資訊:
node 資訊:
coredns 資訊:
排查過程
建立了測試 Pod :
[root@k8s-master ~]# cat ngx-test.yaml apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: ngx-test name: ngx-test spec: #replicas: 1 selector: matchLabels: app: ngx-test template: metadata: labels: app: ngx-test spec: containers: - image: nginx:alpine-arm64 name: nginx --- apiVersion: v1 kind: Service metadata: labels: app: ngx-test name: ngx-test spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: ngx-test
通過 master 節點直接訪問 Pod 地址:
發現問題:Pod 網路跨主機無法通訊。
嘗試在 Pod 所在的主機進行訪問:
發現問題:跨叢集節點的Pod 網路是無法訪問的。
目前問題到這裡就想到 是否是網路外掛 flannel 出了問題。於是繼續排查 flannel :
最初,進行了 ping 測試並使用 tcpdump進行排查,無解。開始懷疑是否是 kylin arm64 相容性的問題,但是切換到 centos 7 arm64 搭建k8s一切正常,排除了 kvm虛擬化和相容性的問題。
由於最初建立虛擬機器是通過 克隆 的方式來建立三臺虛擬機器的,考慮過 mac 地址的問題,也給忽略了。
查閱相關資料,看到有大佬已經處理過類似的問題:
https://zhangguanzhang.github.io/2020/11/06/kylin-arm-clone-vxlan-error/
我出現的情況和他文中的一模一樣。
回到上面的圖片才發現 三張虛擬機器網路 flannel.1 mac地址竟然全部一樣的。檢視下 叢集分配的mac 地址:
果然問題出在 mac 地址上面。
解決過程
根據大佬給出的辦法,首先建立 link 檔案:
叢集內的每個節點都需要建立:
cat << 'EOF' > /etc/systemd/10-flannel.1.link [Match] OriginalName=flannel.1 [Link] MACAddressPolicy=none EOF
檢視是否執行:
再次,刪除節點的 flannel.1
虛擬網絡卡
ip link delete flannel.1
然後刪除節點對應的 kube-flannel-ds*
Pod 使其 重新建立:
kubectl delete po -n kube-system kube-flannel-ds-skhkq
重新生成的 flannel.1
網絡卡的 mac 地址就更新了。
確保,網路的mac 和叢集顯示的 mac 地址統一:
每個節點如上操作後,再次進行 跨節點訪問測試:
到此,跨節點的Pod網路恢復正常。
總結
出現跨節點 Pod 無法訪問的問題:
- 檢視 叢集節點 是否處於
Ready
狀態 - 檢查
flannel.1
Pod 是否正常執行 - 檢視所有節點
flannel.1
網絡卡 mac 是否一致 - 克隆主機一定要注意網絡卡mac 一致的問題