疑難排解 Istio CNI 外掛程式

本頁說明如何疑難排解 Istio CNI 外掛程式的問題。在閱讀本文之前,您應該閱讀CNI 安裝和操作指南

記錄

Istio CNI 外掛程式記錄提供有關外掛程式如何根據 PodSpec 設定應用程式 Pod 流量重新導向的資訊。

此外掛程式在容器執行階段處理程序空間中執行,因此您可以在 kubelet 記錄中看到 CNI 記錄項目。為了方便除錯,CNI 外掛程式也會將其記錄傳送到 istio-cni-node DaemonSet。

CNI 外掛程式的預設記錄層級為 info。若要取得更詳細的記錄輸出,您可以編輯 values.cni.logLevel 安裝選項並重新啟動 CNI DaemonSet Pod 來變更層級。

Istio CNI DaemonSet Pod 記錄也提供有關 CNI 外掛程式安裝和競爭條件修復的資訊。

監控

CNI DaemonSet 產生指標,可用於監控 CNI 安裝、就緒狀態和競爭條件緩解。Prometheus 抓取註解 (prometheus.io/portprometheus.io/path) 預設會新增到 istio-cni-node DaemonSet Pod。您可以透過標準 Prometheus 設定來收集產生的指標。

DaemonSet 就緒

CNI DaemonSet 的就緒狀態表示 Istio CNI 外掛程式已正確安裝並設定。如果 Istio CNI DaemonSet 未就緒,則表示出現問題。請查看 istio-cni-node DaemonSet 記錄以進行診斷。您也可以透過 istio_cni_install_ready 指標追蹤 CNI 安裝就緒狀態。

修復競爭條件

預設情況下,Istio CNI DaemonSet 已啟用競爭條件緩解,這將會驅逐在 CNI 外掛程式就緒之前啟動的 Pod。若要了解哪些 Pod 被驅逐,請尋找類似以下的記錄行

2021-07-21T08:32:17.362512Z     info   Deleting broken pod: service-graph00/svc00-0v1-95b5885bf-zhbzm

您也可以透過 istio_cni_repair_pods_repaired_total 指標追蹤已修復的 Pod。

診斷 Pod 啟動失敗

CNI 外掛程式的一個常見問題是,由於容器網路設定失敗,導致 Pod 無法啟動。通常,失敗原因會寫入 Pod 事件,並可透過 Pod 描述查看

$ kubectl describe pod POD_NAME -n POD_NAMESPACE

如果 Pod 持續出現初始化錯誤,請檢查初始化容器 istio-validation 記錄中是否有類似以下的「連線被拒絕」錯誤

$ kubectl logs POD_NAME -n POD_NAMESPACE -c istio-validation
...
2021-07-20T05:30:17.111930Z     error   Error connecting to 127.0.0.6:15002: dial tcp 127.0.0.1:0->127.0.0.6:15002: connect: connection refused
2021-07-20T05:30:18.112503Z     error   Error connecting to 127.0.0.6:15002: dial tcp 127.0.0.1:0->127.0.0.6:15002: connect: connection refused
...
2021-07-20T05:30:22.111676Z     error   validation timeout

istio-validation 初始化容器會設定一個本機虛擬伺服器,該伺服器會監聽流量重新導向目標的輸入/輸出埠,並檢查測試流量是否可以重新導向至虛擬伺服器。當 CNI 外掛程式未正確設定 Pod 流量重新導向時,istio-validation 初始化容器會阻止 Pod 啟動,以防止流量繞過。若要查看是否有任何錯誤或非預期的網路設定行為,請在 istio-cni-node 中搜尋 Pod ID。

另一個 CNI 外掛程式故障的症狀是,應用程式 Pod 在啟動時會持續被驅逐。這通常是因為外掛程式未正確安裝,因此無法設定 Pod 流量重新導向。CNI 競爭修復邏輯會認為 Pod 因競爭條件而損壞,並持續驅逐 Pod。當遇到此問題時,請檢查 CNI DaemonSet 記錄以取得有關外掛程式為何無法正確安裝的資訊。

此資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!