特定節點中的 Pod 無法存取互聯網

特定節點中的 Pod 無法存取互聯網

特定節點(我們稱為 mynode)中的 Pod 無法存取互聯網,而其他節點中安排的剩餘 Pod 可以存取互聯網。

mynode 可以訪問互聯網,我可以透過 ssh 訪問它,我還可以啟動獨立的 docker 容器,它們確實可以訪問互聯網,但節點上安排的 pod 卻不能訪問互聯網。

問題影響入口和出口,kubelet 正在連接埠 10250 上運行,可透過以下方式存取: curl https://localhost:10250 -kreturns 404 page not found

上下文:我的叢集幾乎沒有具有相同規格的節點,昨天我決定升級作業系統(20.04 到22.04),因此我刪除了之前工作正常的K8S 集群,升級了所有節點上的作業系統,重新安裝了K8S,重新建立了集群,除了 mynode 之外,它在所有節點上都運行順利,它處於 ReadyState 狀態,看起來很好,但事實並非如此。

我的 CNI 是印花布。節點上的 Calico pod(csi-node-driver 和 calico-node)處於「運行」狀態,無需重新啟動。

我按照k8s網站上的調試頁面,無法訪問pod上調度的HTTP伺服器,所以這個問題影響了兩者入口和出口

答案1

看起來問題是在作業系統升級後發生的,因此請檢查 Pod 的 CNI 插件、CRI 和容器映像是否是最新的並與較新的作業系統版本 22.04 相容。

該問題可能由於多種原因而發生,例如網路政策阻止存取、Pod 網路配置和 Calico CNI 問題。請按照以下步驟操作可能有助於解決您的問題:

  1. 透過 coreDNS 日誌和 pod 日誌來了解問題,您將透過執行以下命令來獲得更多資訊:

    kubectl 日誌 --namespace=kube-system -l k8s-app=kube-dns

    kubectl 記錄 podname

  2. 檢查任何阻止 pod 流量的網路策略。kubectl get networkpolicy

  3. 檢查所需連接埠是否開放。

  4. 檢查 Pod 內的防火牆規則是否可能阻止流量。

  5. 匹配 pod CIDR 和 Calico 預設為 192.168.0.0/16,參考github評論更多細節。

  6. 如果 HTTP 伺服器依賴 DNS 名稱,請確保DNS解析叢集內配置正確。

編輯1

  1. 有時 CoreDNS 沒有問題,但由於 k8s 網路問題,ClusterIP 的流量未正確導向至 Pod。可能是因為 Kube-proxy 的原因。參考k8s偵錯服務故障排除指南。

  2. 也要檢查 Pod 網路是否與主機網路重疊。參考安裝 Pod 網路插件更多細節。

  3. 有時,在升級過程中不會載入與網路相關的功能,當您進入此類 Pod 時,您將以 root 使用者身分工作。所以試著去做apt-get update,然後你就可以做apt-get install curl.

答案2

解決辦法是重啟伺服器...

答案3

Kubelet 會向您顯示,404因為該 URL 不存在。嘗試以下操作:

curl -k https://localhost:10250/healthz

我將從ip_forward檢查故障節點開始

cat /proc/sys/net/ipv4/ip_forward

如果情況並非如此,那麼我將檢查 Calico 正在執行的政策

kubectl get networkpolicy -A
kubectl get gnp
kubectl get cnp -A

接下來我將驗證natIPPool 是否已啟用

kubetl get ippool -o yaml

檢查網關。

注意:刷新 iptables 可能會暫時斷開您的連接,請確保您有方便的控制台連接。

刷新 IPtables 也可能不是一個壞主意,但可能是某種過時的規則。

iptables -F

相關內容