通道連線問題

Microsoft Azure Kubernetes Service (AKS) 使用特定元件,在節點與控制平面之間進行通道安全通訊。 通道是由控制平面端上的伺服器和叢集節點端上的用戶端所組成。 本文討論如何針對 AKS 中的通道連線問題進行疑難解答和解決。

Azure 受控 AKS 底層、客戶管理的 Azure 虛擬網路和子網,以及從 API 到通道 Pod 的通道圖表。

注意事項

根據預設,且視區域而定,通道元件為 tunnel-front。 更新為運行時間服務等級協定 (SLA) 功能時, tunnel-front 已由 aks-link 使用 OpenVPN 的通道元件取代。 AKS 正在移轉至 Konnectivity。 這是 Kubernetes 上游元件,可 tunnel-front 同時取代 和 aks-link。 如需移轉至 Konnectivity 作為通道元件的詳細資訊,請參閱 AKS 版本資訊和變更記錄

必要條件

徵狀

您會收到類似下列埠 10250 範例的錯誤訊息:

伺服器發生錯誤:取得 “https://< aks-node-name>:10250/containerLogs/<namespace>/<pod-name>/<container-name>”: dial tcp <aks-node-ip>:10250: i/o timeout

伺服器發生錯誤:撥接後端時發生錯誤:撥號 tcp <aks-node-ip>:10250:i/o 逾時

Kubernetes API 伺服器會使用埠 10250 連線到節點的 kubelet 來擷取記錄。 如果埠 10250 遭到封鎖,kubectl 記錄和其他功能僅適用於在已排程通道元件的節點上執行的 Pod。 如需詳細資訊,請參閱 Kubernetes 埠和通訊協定:背景工作節點

因為無法建立通道元件或伺服器與客戶端之間的連線,所以下列功能無法如預期般運作:

  • 許可控制站 Webhook

  • 使用 kubectl logs 命令 (擷取記錄檔的能力)

  • 使用 kubectl exec 命令 (在容器中執行命令或存取容器)

  • 使用 kubectl port-forward 命令 (轉送 Pod 的一或多個本機埠)

原因 1:網路安全組 (NSG) 封鎖埠 10250

注意事項

此原因適用於您在 AKS 叢集中可能擁有的任何通道元件。

您可以使用 Azure 網路安全組 (NSG) 來篩選 Azure 虛擬網路中 Azure 資源的網路流量。 網路安全組包含安全性規則,可允許或拒絕數種 Azure 資源類型之間的輸入和輸出網路流量。 您可以針對每個規則指定來源和目的地、埠和通訊協定。 如需詳細資訊,請 參閱網路安全組如何篩選網路流量

如果 NSG 在虛擬網路層級封鎖埠 10250,則通道功能 (例如記錄和程式代碼執行) 僅適用於排程在已排程通道 Pod 之節點上的 Pod。 其他 Pod 無法運作,因為其節點將無法連線到通道,而且通道已排程在其他節點上。 若要確認此狀態,您可以使用 netcat () nc 或 telnet 命令來測試連線能力。 您可以執行 az vmss run-command invoke 命令 來進行連線測試,並確認其是否成功、逾時或造成其他問題:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "nc -v -w 2 <ip-of-node-that-schedules-the-tunnel-component> 10250" \
    --output tsv \
    --query 'value[0].message'

解決方案 1:新增 NSG 規則以允許存取埠 10250

如果您使用 NSG,而且您有特定限制,請務必新增安全性規則,以允許虛擬網路層級埠 10250 的流量。 下列 Azure 入口網站 圖顯示範例安全性規則:

Azure 入口網站 中 [新增輸入安全性規則] 窗格的螢幕快照。[目的地埠範圍] 方塊會針對新的安全性規則設定為 10250。

如果您想要更嚴格,則只能在子網層級允許存取埠 10250。

注意事項

  • [ 優先順序] 欄位必須據以調整。 例如,如果您的規則拒絕多個埠 (包括埠 10250) ,則影像中顯示的規則應具有較低的優先順序號碼 (較低的數位具有較高的優先順序) 。 如需 優先順序的詳細資訊,請參閱 安全性規則

  • 如果您在套用此解決方案之後沒有看到任何行為變更,您可以重新建立通道元件 Pod。 刪除這些 Pod 會導致重新建立這些 Pod。

原因 2:未編譯的防火牆 (UFW) 工具封鎖埠 10250

注意事項

此原因適用於您在 AKS 叢集中擁有的任何通道元件。

未編譯的防火牆 (UFW) 是用來管理 netfilter 防火牆的命令行程式。 AKS 節點使用Ubuntu。 因此,UFW 預設會安裝在 AKS 節點上,但 UFW 已停用。

根據預設,如果啟用UFW,則會封鎖所有埠的存取,包括埠10250。 在此情況下,您不太可能可以使用安全殼層 (SSH) 連線到 AKS 叢集節點進行疑難解答。 這是因為UFW可能也會封鎖埠22。 若要進行疑難解答,您可以執行 az vmss run-command invoke 命令來叫用 ufw 命令 ,以檢查是否已啟用 UFW:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw status" \
    --output tsv \
    --query 'value[0].message'

如果結果指出已啟用 UFW,但未特別允許埠 10250,該怎麼辦? 在此情況下,通道功能 (例如記錄和程式代碼執行) 將無法用於已啟用UFW之節點上排程的Pod。 若要修正此問題,請在UFW上套用下列其中一個解決方案。

重要事項

使用此工具進行任何變更之前,請檢閱 AKS 支持 原則 (特別是 節點維護和存取) ,以防止您的叢集進入不支援的案例。

注意事項

如果您在套用解決方案之後沒有看到任何行為變更,您可以重新建立通道元件 Pod。 刪除這些 Pod 會導致重新建立它們。

解決方案 2a:停用未編譯的防火牆

執行下列 az vmss run-command invoke 命令以停用 UFW:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw disable" \
    --output tsv \
    --query 'value[0].message'

解決方案 2b:設定未編譯的防火牆以允許存取埠 10250

若要強制 UFW 允許存取埠 10250,請執行下列 az vmss run-command invoke 命令:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw allow 10250" \
    --output tsv \
    --query 'value[0].message'

原因 3:iptables 工具封鎖埠 10250

注意事項

此原因適用於您在 AKS 叢集中擁有的任何通道元件。

iptables 工具可讓系統管理員設定Linux防火牆的IP封包篩選規則。 您可以設定規則來 iptables 封鎖埠 10250 上的通訊。

您可以檢視節點的規則,以檢查埠 10250 是否遭到封鎖或卸除相關聯的封包。 若要這樣做,請執行下列 iptables 命令:

iptables --list --line-numbers

在輸出中,數據會分組成數個 鏈結,包括 INPUT 鏈結。 每個鏈結都包含下列資料列標題下的規則資料表:

  • num (規則編號)
  • target
  • prot (通訊協定)
  • opt
  • source
  • destination

INPUT鏈結是否包含目標為 DROP的規則、通訊協定為 tcp,而目的地為 tcp dpt:10250? 如果是的話, iptables 會封鎖目的地埠 10250 的存取。

解決方案 3:刪除封鎖埠 10250 存取的 iptables 規則

執行下列其中一個命令來刪除 iptables 防止存取埠 10250 的規則:

iptables --delete INPUT --jump DROP --protocol tcp --source <ip-number> --destination-port 10250
iptables --delete INPUT <input-rule-number>

若要解決確切或可能的案例,建議您執行 命令來檢查 iptables 手動iptables --help

重要事項

使用此工具進行任何變更之前,請檢閱 AKS 支持 原則 (特別是 節點維護和存取) ,以防止您的叢集進入不支援的案例。

原因 4:未開啟輸出埠 1194 或 9000

注意事項

此原因僅 tunnel-front 適用於和 aks-link Pod。

是否有任何輸出流量限制,例如來自 AKS 防火牆? 如果有,則需要埠 9000,才能啟用 Pod 的 tunnel-front 正確功能。 同樣地,Pod 也需要 aks-link 埠 1194。

Konnectivity 依賴埠 443。 根據預設,此埠會開啟。 因此,您不需要擔心該埠上的連線問題。

解決方案 4:開啟埠 1194 或 9000

請確定虛擬設備允許存取埠 1194 或埠 9000。 如需必要規則和相依性的詳細資訊,請參閱 Azure 全域所需的網路規則

原因 5:來源網路位址轉換 (SNAT) 埠耗盡

注意事項

此原因適用於您在 AKS 叢集中擁有的任何通道元件。 不過,它不適用於 私人 AKS 叢集。 來源網路位址轉換 (SNAT) 埠耗盡只能針對公用通訊發生。 針對私人 AKS 叢集,API 伺服器位於 AKS 虛擬網路或子網內。

如果 SNAT 埠耗盡 (失敗的 SNAT 連接埠) ,則節點無法連線到 API 伺服器。 通道容器位於 API 伺服器端。 因此,將不會建立通道連線能力。

如果 SNAT 埠資源已用盡,輸出流程會失敗,直到現有的流程釋放某些 SNAT 埠為止。 Azure Load Balancer 會在流程關閉時回收 SNAT 埠。 它會使用四分鐘的閑置逾時,從閑置流程回收 SNAT 埠。

您可以從 AKS 負載平衡器計量或服務診斷檢視 SNAT 埠,如下列各節所述。 如需如何檢視 SNAT 埠的詳細資訊,請參閱 如何? 檢查我的輸出連線統計數據?

AKS 負載平衡器計量

若要使用 AKS 負載平衡器計量來檢視 SNAT 埠,請遵循下列步驟:

  1. Azure 入口網站 中,搜尋並選取 [Kubernetes 服務]

  2. 在 Kubernetes 服務清單中,選取叢集的名稱。

  3. 在叢集的功能表窗格中,尋找 [ 設定] 標題,然後選取 [ 屬性]

  4. 選取 [ 基礎結構資源群組] 下所列的名稱。

  5. 選取 kubernetes 負載平衡器。

  6. 在負載平衡器的功能表窗格中,尋找 [ 監視 ] 標題,然後選取 [ 計量]

  7. 針對計量類型,選取 [SNAT 連線計數]

  8. 取 [套用分割]

  9. [分割依據 ] 設定為 [連線狀態]

服務診斷

若要使用服務診斷來檢視 SNAT 埠,請遵循下列步驟:

  1. Azure 入口網站 中,搜尋並選取 [Kubernetes 服務]

  2. 在 Kubernetes 服務清單中,選取叢集的名稱。

  3. 在叢集的功能表窗格中,選取 [診斷並解決問題]

  4. 選取 [連線問題]

  5. [SNAT 連線和埠配置] 下,選 取 [檢視詳細數據]

  6. 如有必要,請使用 [時間範圍] 按鈕來自定義時間範圍。

解決方案5a:確定應用程式使用連線共用

發生此行為的原因可能是應用程式未重複使用現有的連線。 建議您不要為每個要求建立一個輸出連線。 這類組態可能會導致連線耗盡。 檢查應用程式程式代碼是否遵循最佳做法並使用連線共用。 大部分的連結庫都支持連線共用。 因此,您不應該為每個要求建立新的輸出連線。

解決方案 5b:調整配置的輸出埠

如果應用程式內一切正常,您必須調整配置的輸出埠。 如需輸出埠配置的詳細資訊,請 參閱設定配置的輸出埠

解決方案 5c:當您建立叢集時,請使用受控網路位址轉換 (NAT) 閘道

您可以設定新的叢集,將受控網路位址轉換 (NAT) 閘道用於輸出連線。 如需詳細資訊,請 參閱使用受控 NAT 閘道建立 AKS 叢集

協力廠商連絡資訊免責聲明

Microsoft 提供第三方連絡資訊,協助您尋找有關本主題的其他資訊。 此連絡資訊如有變更,恕不另行通知。 Microsoft 不保證第三方聯繫人信息的正確性。

與我們連絡,以取得說明

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