
特定節點(我們稱為 mynode)中的 Pod 無法存取互聯網,而其他節點中安排的剩餘 Pod 可以存取互聯網。
mynode 可以訪問互聯網,我可以透過 ssh 訪問它,我還可以啟動獨立的 docker 容器,它們確實可以訪問互聯網,但節點上安排的 pod 卻不能訪問互聯網。
問題影響入口和出口,kubelet 正在連接埠 10250 上運行,可透過以下方式存取:
curl https://localhost:10250 -k
returns 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 問題。請按照以下步驟操作可能有助於解決您的問題:
透過 coreDNS 日誌和 pod 日誌來了解問題,您將透過執行以下命令來獲得更多資訊:
kubectl 日誌 --namespace=kube-system -l k8s-app=kube-dns
kubectl 記錄 podname
檢查任何阻止 pod 流量的網路策略。
kubectl get networkpolicy
檢查所需連接埠是否開放。
檢查 Pod 內的防火牆規則是否可能阻止流量。
匹配 pod CIDR 和 Calico 預設為 192.168.0.0/16,參考github評論更多細節。
如果 HTTP 伺服器依賴 DNS 名稱,請確保DNS解析叢集內配置正確。
編輯1
有時 CoreDNS 沒有問題,但由於 k8s 網路問題,ClusterIP 的流量未正確導向至 Pod。可能是因為 Kube-proxy 的原因。參考k8s偵錯服務故障排除指南。
也要檢查 Pod 網路是否與主機網路重疊。參考安裝 Pod 網路插件更多細節。
有時,在升級過程中不會載入與網路相關的功能,當您進入此類 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
接下來我將驗證nat
IPPool 是否已啟用
kubetl get ippool -o yaml
檢查網關。
注意:刷新 iptables 可能會暫時斷開您的連接,請確保您有方便的控制台連接。
刷新 IPtables 也可能不是一個壞主意,但可能是某種過時的規則。
iptables -F