Azure Kubernetes Service (AKS) 中的 Azure CNI 網路概觀

根據預設,AKS 叢集會使用 kubenet,並建立虛擬網路和子網路。 使用 kubenet,節點會從虛擬網路子網路取得 IP 位址。 接著會在節點上設定網路位址轉譯 (NAT),而 Pod 會接收「隱藏」於節點 IP 後面的 IP 位址。 此方法可減少您需要在網路空間中保留,以供 Pod 使用的 IP 位址數目。

使用 Azure 容器網路介面 (CNI),每個 Pod 都會從子網路取得 IP 位址,並且可以直接存取。 與 AKS 叢集位於同一虛擬網路中的系統會將 Pod IP 視為任何 Pod 流量的來源位址。 AKS 叢集虛擬網路外的系統會將節點 IP 視為任何 Pod 流量的來源位址。 這些 IP 位址在您的網路空間中必須是唯一的,且必須事先規劃。 每個節點都有一個組態參數,用於所支援的最大 Pod 數目。 然後,為該節點預先保留每個節點的相同 IP 位址數目。 此方法需要更多規劃,並且通常會導致 IP 位址耗盡,或者隨著應用程式需求增加,需要在更大型子網路中重建叢集。

注意

本文僅介紹傳統的 Azure CNI。 針對 Azure CNI 重疊適用於動態 IP 配置的 Azure CNI VNet 和 Azure CNI VNet - 靜態區塊配置 (預覽版) 。 請改為參閱其檔。

必要條件

  • 適用於 AKS 叢集的虛擬網路必須允許輸出網際網路連線.

  • AKS 叢集不能將 169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24 用於 Kubernetes 服務位址範圍、Pod 位址範圍或叢集虛擬網路位址範圍。

  • AKS 叢集使用的叢集身分識別在虛擬網路內的子網路上至少必須包含 Network Contributor 權限。 如果您想要定義自訂角色,而不使用內建的網路參與者角色,則需要下列權限:

    • Microsoft.Network/virtualNetworks/subnets/join/action

    • Microsoft.Network/virtualNetworks/subnets/read

    • Microsoft.Authorization/roleAssignments/write

  • 指派給 AKS 節點集區的子網路不得為委派子網路

  • AKS 不會將網路安全性群組 (NSG) 套用至其子網路,也不會修改與該子網路相關聯的任何 NSG。 如果您有自己的子網路並新增與該子網路相關聯的 NSG,則必須確保 NSG 中的安全性規則允許節點 CIDR 範圍內的流量。 如需詳細資訊,請參閱網路安全性群組

規劃叢集的 IP 位址

使用 Azure CNI 網路設定的叢集需要進行額外的規劃。 虛擬網路及其子網路的大小必須能夠容納您規劃執行的 Pod 數目以及叢集的節點數目。

Pod 和叢集節點的 IP 位址會從虛擬網路內的指定子網路來指派。 每個節點都以主要 IP 位址進行設定。 根據預設,Azure CNI 會預先設定 30 個額外的 IP 位址。 這些 IP 位址會指派給節點上排程的 Pod。 當您將叢集相應放大時,每個節點同樣也會設定子網路中的 IP 位址。 您也可以檢視每個節點的最大 Pod 數目

重要

所需的 IP 位址數目應包含針對升級和調整作業考量的數目。 如果設定只支援固定節點數目的 IP 位址範圍,將無法升級或擴展您的叢集。

  • 當您升級 AKS 叢集時,會部署新的節點到叢集中。 服務和工作負載會開始在新的節點上執行,並移除叢集中較舊的節點。 此輪流升級程序需要至少一個額外的 IP 位址區塊以供使用。 因此您的節點計數為 n + 1

    • 當您使用 Windows Server 節點集區時,此考量尤其重要。 AKS 中的 Windows Server 節點不會自動套用 Windows Update, 而需要您在節點集區上執行升級。 此升級會使用最新的 Window Server 2019 基本節點映像和安全性修補程式來部署新的節點。 如需有關升級 Windows Server 節點集區的詳細資訊,請參閱在 AKS 中升級節點集區
  • 當您擴展 AKS 叢集時,會部署新的節點到叢集中。 服務和工作負載會開始在新的節點上執行。 您的 IP 位址範圍必須將您可能想要擴大的節點數和您的叢集可支援的 Pod 數目納入考量。 也應包含一個額外的節點以用於升級作業。 因此您的節點計數為 n + number-of-additional-scaled-nodes-you-anticipate + 1

如果預期您的節點會執行最大數目的 Pod,並定期終結及部署 Pod 時,也應該考慮為每個節點提供一些額外的 IP 位址。 刪除服務並釋放其 IP 位址可能需要幾秒鐘的時間,才能部署新服務並取得位址。 這些額外的 IP 位址必須考慮這種可能性。

適用於 AKS 叢集的 IP 位址方案會由一個虛擬網路、至少一個適用於節點和 Pod 的子網路,以及一個 Kubernetes 服務位址範圍所組成。

位址範圍 / Azure 資源 限制和調整大小
虛擬網路 Azure 虛擬網路可以和 /8 一樣大,但可能只有 65,536 個已設定的 IP 位址。 在設定位址空間之前,請將您所有的網路需求納入考量,包括與在其他虛擬網路中的服務通訊。 舉例來說,如果您設定的位址空間過大,則可能會遇到與網路中其他位址空間重疊的問題。
子網路 必須大到足以容納節點、Pod,以及可能會在您叢集中佈建的所有 Kubernetes 和 Azure 資源。 例如,如果您部署內部 Azure Load Balancer,其前端 IP 會從叢集子網路配置,而不是從公用 IP 配置。 子網路大小也應該考量帳戶升級作業或未來的擴展需求。

使用下列方程式來計算子網路大小下限,包括升級作業的額外節點:(number of nodes + 1) + ((number of nodes + 1) * maximum pods per node that you configure)

50 節點叢集的範例:(51) + (51 * 30 (default)) = 1,581 (/21 或更大)

50 節點叢集的範例,同時包括擴充額外 10 個節點的準備:(61) + (61 * 30 (default)) = 1,891 (/21 或更大)

如果您未指定每個節點的最大 Pod 數目,當您建立叢集時,每個節點的最大 Pod 數目設定為 30。 IP 位址所需的最小數目是根據該值。 如果您以不同的最大值來計算最小 IP 位址需求,請參閱每個節點的最大 Pod 數目,在您部署叢集時設定此值。

Kubernetes 服務位址範圍 此虛擬網路上或連線到此虛擬網路的任何網路元素不得使用此範圍。 服務位址 CIDR 必須小於 /12。 您可以在不同 AKS 叢集中重複使用此範圍。
Kubernetes DNS 服務 IP 位址 Kubernetes 服務位址範圍內供叢集服務探索使用的 IP 位址。 請勿使用您位址範圍中的第一個 IP 位址。 您子網路範圍內的第一個位址會用於 kubernetes.default.svc.cluster.local 位址。

每個節點的最大 Pod 數目

AKS 叢集中每個節點的最大 Pod 數目為 250 個。 每個節點「預設」的最大 Pod 數目,會根據 kubenetAzure CNI 網路以及叢集部署的方法而有所不同。

部署方法 Kubenet 預設值 Azure CNI 預設值 可在部署時設定
Azure CLI 110 30 是 (最多 250 個)
Resource Manager 範本 110 30 是 (最多 250 個)
入口網站 110 110 (可在 [節點集區] 索引標籤中設定) 是 (最多 250 個)

設定新叢集中每個節點的最大 Pod 數目

您可以在叢集部署期間或新增節點集區時,設定每個節點的最大 Pod 數目。 您可以將每個節點值的最大 Pod 設定為 250。

如果您在建立新的節點集區時未指定 maxPods,則會收到 Azure CNI 的預設值 30。

系統會為每個節點的最大 Pod 數目強制執行最小值,以確保提供空間給對叢集健康情況至關重要的系統 Pod。 只有當每個節點集區的設定能夠容納至少 30 個 Pod 時,可針對每個節點的最大 Pod 數目設定的最小值才會是 10。 舉例來說,如果將每個節點的最大 Pod 數目設定為最小值 10,則每個個別節點集區均須包含至少三個節點。 此需求亦適用於每個新建立的節點集區,因此如果將 10 定義為每個節點的最大 Pod 數目,則每個新增的節點集區均須包含至少三個節點。

網路 最小值 最大值
Azure CNI 10 250
Kubenet 10 250

注意

前一表格中的最小值完全由 AKS 服務強制執行。 您無法將 maxPods 的值設定為低於顯示的最小值,因為這樣做會導致叢集無法啟動。

  • Azure CLI:當您使用 az aks create 命令部署叢集時,請指定 --max-pods 引數。 最大值為 250。
  • Resource Manager 範本:當您使用 Resource Manager 範本部署叢集時,請指定 ManagedClusterAgentPoolProfile 物件中的 maxPods 屬性。 最大值為 250。
  • Azure 入口網站:在建立叢集或新增節點集區時,變更節點集區設定中的 Max pods per node 欄位。

設定現有叢集中每個節點的最大 Pod 數目

您可以在建立新的節點集區時定義每個節點的 maxPods 設定。 如果您需要在現有叢集上增加 maxPods 設定,請使用新的所需 maxPods 計數來新增節點集區。 將 Pod 移轉至新工具後,請刪除較舊的集區。 若要刪除叢集中任何較舊的集區,請確保按照系統節點集區文件中的定義設定節點集區模式。

部署參數

當您建立 AKS 叢集時,可針對 Azure CNI 網路設定下列參數:

虛擬網路:要作為 Kubernetes 叢集部署目的地的虛擬網路。 如果您要為叢集建立新的虛擬網路,請選取 [新建] 並遵循<建立虛擬網路>一節中的步驟。 如果您想要選取現有虛擬網路,則請確定其位於與 Kubernetes 叢集相同的位置和 Azure 訂用帳戶中。 如需有關 Azure 虛擬網路限制和配額的資訊,請參閱 Azure 訂用帳戶和服務限制、配額及條件約束

子網路:虛擬網路內要用來部署叢集的子網路。 如果您要在虛擬網路中為叢集建立新的子網路,請選取 [新建] 並遵循<建立子網路>一節中的步驟。 混合式連線的位址範圍不應該與您環境中的任何其他虛擬網路重疊。

Azure 網路外掛程式:使用 Azure 網路外掛程式時,您無法透過 clusterCIDR 中不屬於 AKS 叢集的 IP 從 VM 存取含有「externalTrafficPolicy=Local」的內部 LoadBalancer 服務。

Kubernetes 服務位址範圍:此參數是 Kubernetes 指派給叢集內部服務的虛擬 IP 集合。 建立叢集之後就無法更新此範圍。 您可以使用任何符合下列需求的私人位址範圍:

  • 不得在叢集的虛擬網路 IP 位址範圍內
  • 不得與叢集虛擬網路對等的任何其他虛擬網路重疊
  • 不得與任何內部部署 IP 重疊
  • 不得在 169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24 範圍內

雖然技術上有可能指定與您叢集相同虛擬網路內的服務位址範圍,但不建議這麼做。 如果使用重疊的 IP 範圍,就會造成無法預期的行為。 如需詳細資訊,請參閱本文的常見問題集一節。 如需有關 Kubernetes 服務的詳細資訊,請參閱 Kubernetes 文件中的服務

Kubernetes DNS 服務 IP 位址:叢集 DNS 服務的 IP 位址。 此位址必須位於 Kubernetes 服務位址範圍中。 請勿使用您位址範圍中的第一個 IP 位址。 您子網路範圍內的第一個位址會用於 kubernetes.default.svc.cluster.local 位址。

常見問題集

  • 是否可以在叢集子網路中部署 VM?

    是。 但對於 動態IP配置的 Azure CNI,VM 無法部署在Pod的子網中。

  • 對於源自支援 Azure CNI 之 Pod 的流量,外部系統會如何解讀來源 IP?

    與 AKS 叢集位於同一虛擬網路中的系統會將 Pod IP 視為任何 Pod 流量的來源位址。 AKS 叢集虛擬網路外的系統會將節點 IP 視為任何 Pod 流量的來源位址。

    但是,針對 動態IP配置的 Azure CNI,無論連線位於相同的虛擬網路或跨虛擬網路內,Pod IP 一律是來自 Pod 的任何流量的來源位址。 這是因為 動態IP配置的 Azure CNI 會實 作 Microsoft Azure Container Networking 基礎結構,以提供端對端體驗。 因此,它會排除使用 ip-masq-agent,這仍由傳統 Azure CNI 使用。

  • 是否可以針對個別 Pod 設定網路原則?

    是,您可以在 AKS 中使用 Kubernetes 網路原則。 若要開始使用,請參閱使用 AKS 中的網路原則保護 Pod 之間的流量

  • 是否可以設定可部署到節點的 Pod 數目上限?

    是,當您使用 Azure CLI 或 Resource Manager 範本部署叢集時。 請參閱每個節點的最大 Pod 數目

    您無法在現叢集上變更每個節點的 Pod 數目上限。

  • 如何針對在 AKS 叢集建立期間所建立的子網路設定其他屬性? 例如,服務端點。

    在 AKS 叢集建立期間所建立的虛擬網路和子網路屬性完整清單,均可在 Azure 入口網站的標準虛擬網路組態頁面中進行設定。

  • 可以使用叢集虛擬網路內的不同子網路作為Kubernetes 服務位址範圍嗎?

    不建議,但此組態是可行的。 服務位址範圍是 Kubernetes 指派給您叢集中內部服務的一組虛擬 IP (VIP)。 Azure 網路功能無法查看 Kubernetes 叢集的服務 IP 範圍。 無法看到叢集的服務位址範圍可能會造成問題。 稍後可能會在與服務位址範圍重疊的叢集虛擬網路中建立新的子網路。 如果發生這類重疊,Kubernetes 可能會將子網路中另一項資源已經使用的 IP 指派給服務,因而造成無法預期的行為或失敗。 您可藉由確保您使用叢集虛擬網路外部的位址範圍,避免此重疊風險。

後續步驟

在下列文章中深入了解 AKS 的網路功能: