共用方式為


當 kubectl 或其他第三方工具連線到 API 伺服器時,TCP 逾時

本文討論如何針對 kubectl 或其他第三方工具用來連線至 Microsoft Azure Kubernetes Service (AKS) 中的 API 伺服器時發生的 TCP 逾時進行疑難解答。 為了確保其服務等級目標(SLO)和服務等級協定(SLA),AKS 會根據核心數目使用垂直和水平調整的高可用性 (HA) 控制平面。

徵兆

您遇到重複的連線逾時。

原因 1:負責節點對控制平面通訊的 Pod 未執行

如果只有少數 API 命令一致逾時,下列 Pod 可能無法處於執行中狀態:

  • konnectivity-agent
  • tunnelfront
  • aks-link

注意

在較新的 AKS 版本中, tunnelfrontaks-link 會取代為 konnectivity-agent,因此您只會看到 konnectivity-agent

這些 Pod 負責節點與控制平面之間的通訊。

解決方案:減少節點主機的使用率或壓力

請確定裝載這些 Pod 的節點不會過度使用或承受壓力。 請考慮將節點移至自己的 系統節點集區

若要檢查載入 Pod 所在的節點 konnectivity-agent 和節點的使用方式,請執行下列命令:

# Check which node the konnectivity-agent pod is hosted on
$ kubectl get pod -n kube-system -o wide
    
# Check the usage of the node hosting the pod
$ kubectl top node

原因 2:某些必要埠、FQDN 和 IP 位址上的存取遭到封鎖

如果必要的埠、完整功能變數名稱 (FQDN) 和IP位址並未全部開啟,則數個命令呼叫可能會失敗。 API 伺服器與 kubelet 之間 AKS 上的安全通道通訊(透過 konnectivity-agent Pod)需要其中一些專案才能順利運作。

解決方案:開啟必要的埠、FQDN 和IP位址

如需需要開啟哪些埠、FQDN 和IP位址的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 叢集的輸出網路和 FQDN 規則。

原因 3:應用層通訊協定交涉 TLS 延伸模組遭到封鎖

若要建立控制平面與節點之間的連線, konnectivity-agent Pod 需要 應用層通訊協定交涉 (ALPN) 的傳輸層安全性 (TLS) 延伸模組。 您可能先前已封鎖此延伸模組。

解決方案:啟用 ALPN 擴充功能

在 Pod 上 konnectivity-agent 啟用 ALPN 擴充功能,以防止 TCP 逾時。

原因 4:API 伺服器的 IP 授權範圍未涵蓋您目前的 IP 位址

如果您在 API 伺服器上使用授權的 IP 位址範圍,如果您的 IP 未包含在授權範圍中,您的 API 呼叫將會遭到封鎖。

解決方案:修改授權的IP位址範圍,使其涵蓋您的IP位址

變更授權的IP位址範圍,以便涵蓋您的IP位址。 如需詳細資訊,請參閱 更新叢集的 API 伺服器授權 IP 範圍

原因 5:用戶端或應用程式對 API 伺服器的呼叫外洩

頻繁的 GET 呼叫可能會累積並多載 API 伺服器。

解決方案:使用監看式而非 GET 呼叫,但請確定應用程式不會洩漏這些呼叫

請確定您使用監看式,而不是經常呼叫 API 伺服器。 您也必須確定您的第三方應用程式不會洩漏任何監看式連線或 GET 呼叫。 例如,在 Istio 微服務架構中,混音器應用程式中Bug 會在內部讀取秘密時建立新的 API 伺服器監看連線。 由於此行為會定期發生,因此監看式聯機會快速累積。 無論調整模式為何,這些連線最終都會導致 API 伺服器變得多載。

原因 6:Helm 部署中的版本太多

如果您在 Helm 部署中使用太多版本(Kubernetes 套件管理員),節點會開始耗用太多記憶體。 它也會導致大量的 ConfigMap (組態數據) 物件,這可能會導致 API 伺服器上的不必要的使用量尖峰。

解決方案:限制每個版本的修訂數目上限

由於每個版本的修訂數目上限預設為無限,因此您必須執行命令,將此最大數目設定為合理的值。 對於 Helm 2,命令為 helm init。 對於 Helm 3,命令是 helm 升級。 當您執行 命令時, --history-max <value> 請設定 參數。

版本 Command
Helm 2 helm init --history-max <maximum-number-of-revisions-per-release> ...
Helm 3 helm upgrade ... --history-max <maximum-number-of-revisions-per-release> ...

原因 7:節點之間的內部流量遭到封鎖

AKS 叢集中的節點之間可能會有內部流量封鎖。

解決方案:針對「撥號 tcp <Node_IP>:10250:i/o 逾時」錯誤進行疑難解答

請參閱 針對 TCP 逾時進行疑難解答,例如「撥號 tcp <Node_IP>:10250:i/o 逾時」

原因 8:您的叢集是私人的

您的叢集是私人叢集,但您嘗試存取 API 伺服器的用戶端位於公用或不同的網路中,無法連線到 AKS 所使用的子網。

解決方案:使用可存取 AKS 子網的用戶端

由於叢集是私人的,而且其控制平面位於AKS子網中,因此除非它位於可連線到AKS子網的網路中,否則無法連線到API 伺服器。 這是預期的行為。

在此情況下,請嘗試從可以與 AKS 子網通訊的網路用戶端存取 API 伺服器。 此外,請確認網路之間的網路安全組 (NSG) 或其他設備不會封鎖封包。

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。