前言
測試環境中使用了一台 長城 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/network/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 一致的問題