我的工作者節點為何會顯示 NetworkUnavailable 錯誤?

排除 Calico 節點狀態問題及網路問題。

虛擬私有雲 經典基礎架構 Satellite

當您更新主節點或工作者節點時,工作者節點會進入 Node network unavailable 狀態。

每當 calico-node Pod 關閉時,您的工作者節點可能會進入 NetworkUnavailableNode network unavailable 狀態。 這可能會在 Calico 修補程式更新時發生,但應該不會影響您的應用程式可用性。

更新 Calico 時,會將 node.kubernetes.io/network-unavailable:NoSchedule 污點新增至工作者節點,且 Node network unavailable 條件會變成 True。 當 Calico 重新啟動時,會清除這兩種狀況,通常只需幾秒鐘。

在此過程中,您可能會看到類似以下範例的錯誤訊息。

[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX
[Kubernetes] Node network unavailable is Triggered on kubernetes.node.name = 10.184.XXX.XXX

有時,重新啟動可能需要較長時間。 在幾乎所有情況下,重新啟動的速度足以避免任何工作者節點網路問題。 不過,在某些狀況下,Calico 重新啟動會延遲,因此可能會發生網路岔斷。 在這些情況下,節點網路無法使用污點及條件設計為在 Calico 及節點修正之前,阻止將新應用程式部署至新節點。 Calico 更新項目以非常受控制的方式推出,以便在發生節點問題時將整體應用程式影響降到最低。

使用 Node network unavailable 監控狀態 IBM Cloud Monitoring

透過使用服務來監視應用程式 (例如 IBM Cloud Monitoring),您可以配置警示,以指出工作者節點何時進入 Node network unavailable 狀態,並在每次發生此情況時進行計數。 您也可以配置臨界值並調整警示,以容許工作者節點在常式 Calico 修補程式期間處於 Node network unavailable 狀態。

當您設定 IBM Cloud Monitoring 警示時,請考量下列實務範例。

  • calico-node Pod 無法達到 Running 狀態,且其儲存器重新啟動計數持續增加時,Node network unavailable 警示可能會變成問題。
  • 工作者節點長時間保持 Node network unavailable 狀態。

在工作者更新或取代之後,有時 calico-node Pod 仍未在 Red Hat OpenShift VPC Cluster 上啟動。 calico_node Pod 可能停留在無法在 Red Hat OpenShift VPC 叢集上啟動的狀態。 這不是 IKS 或「標準」叢集上的問題。 當您已安裝 sysdig-admission-controller-webhook 並嘗試執行工作者更新或取代時,可能會發生這種情況。 發生這種情況的原因如下:

  1. VPN 用戶端 Pod 會在啟動時移至新的工作者節點。
  2. 新工作者節點上的 calico-node 會啟動,但由於它發出 apiserver 呼叫並在 2 秒後逾時而停滯。
  3. 然後,apiserver 呼叫會嘗試呼叫 Webhook 失敗,因為 VPN 用戶端 Pod 嘗試在新節點上啟動。 VPN 節點無法順利執行此動作,因為 calico-node 尚未啟動。

總之,calico-node Pod 啟動取決於 Webhook 運作; Webhook 取決於 VPN 用戶端 Pod; VPN 用戶端 Pod 取決於 calico-node 啟動。 系統停留在循環相依關係中。 如果您能夠從順利部署的 calico-node Pod 收集日誌,則可能會看到如下錯誤:

2022-09-08 07:13:19.719 [WARNING][9] startup/utils.go 228: Failed to set NetworkUnavailable; will retry error=Patch "https://172.21.0.1:443/api/v1/nodes/10.242.64.17/status?timeout=2s": net/http: request canceled (Client.Timeout exceeded while awaiting headers)

calico-node 的暫行解決方法

您可以使用下列其中一種方法來解決此問題,並讓 calico-node Pod 重新執行。

  1. 從系統中移除 sysdig-admission-controller-webhook
  2. 修改 sysdig-admission-controller-webhook,並將逾時變更為小於 2 秒。
  3. 修改 sysdig-admission-controller-webhook 以將其限定為適當的名稱空間,並避免系統重要名稱空間,例如 calico-system
  4. 封鎖新節點,但不要排除它。 刪除 VPN Pod,並等待它在另一個工作者節點上啟動。 解除節點的封鎖。

執行任何先前的暫行解決方法之後,calico-node Pod 可以順利啟動。