1. 程式人生 > 其它 >arm64 系統克隆主機上 部署 k8s 跨節點 pod 網路不通 解決方法

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 無法訪問的問題:

  1. 檢視 叢集節點 是否處於 Ready 狀態
  2. 檢查 flannel.1 Pod 是否正常執行
  3. 檢視所有節點 flannel.1 網絡卡 mac 是否一致
  4. 克隆主機一定要注意網絡卡mac 一致的問題


--- EOF ---