在 Azure Kubernetes Service (AKS) 中使用 kubenet 網路與您自己的 IP 位址範圍
AKS 叢集使用 kubenet (英文),而且預設會為您建立 Azure 虛擬網路和子網路。 使用 kubenet,節點會從 Azure 虛擬網路子網路取得 IP 位址。 Pod 會接收到 IP 位址,從邏輯上不同位址空間到節點的 Azure 虛擬網路子網路。 接著設定網路位址轉譯 (NAT),使 Pod 能夠連線到 Azure 虛擬網路上的資源。 流量的來源 IP 位址會被轉譯為節點的主要 IP 位址。 此方法可大幅減少您需要在網路空間中保留以供 Pod 使用的 IP 位址數目。
使用 Azure 容器網路介面 (CNI) (英文),每個 Pod 都會從子網路取得 IP 位址,且可直接存取。 這些 IP 位址在您網路空間中必須是唯一且事先經過規劃。 每個節點都有一個設定參數,表示其支援的 Pod 數量上限。 然後,為該節點預先保留每個節點的相同 IP 位址數目。 此方法需要更多規劃,並且通常會導致 IP 位址耗盡,或者隨著應用程式需求增加,需要在更大型子網路中重建叢集。 您可以在叢集建立期間或建立新的節點集區時,設定可部署到節點的最大 Pod 數目。 如果您在建立新的節點集區時未指定 maxPods
,就會收到 kubenet 的預設值 110。
本文將說明如何使用 kubenet 網路,針對 AKS 叢集建立並使用虛擬網路子網路。 如需網路選項與考量的詳細資訊,請參閱 Kubernetes 和 AKS 的網路概念 (部分機器翻譯)。
必要條件
- 適用於 AKS 叢集的虛擬網路必須允許輸出網際網路連線.
- 請勿在相同子網路中建立多個 AKS 叢集。
- AKS 叢集不能針對 Kubernetes 服務位址範圍、Pod 位址範圍或叢集虛擬網路位址範圍使用
169.254.0.0/16
、172.30.0.0/16
、172.31.0.0/16
或192.0.2.0/24
。 範圍在建立叢集之後就無法更新。 - AKS 叢集使用的叢集身分識別在您虛擬網路內的子網路上至少必須包含網路參與者 (部分機器翻譯) 角色。 CLI 可協助自動設定角色指派。 如果您使用 ARM 範本或其他用戶端,則需要手動設定角色指派。 您也必須擁有適當的權限,例如訂閱擁有者,才能建立叢集身分識別並指派其權限。 如果您想要定義自訂角色,而不使用內建的網路參與者角色,則需要下列權限:
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.Network/virtualNetworks/subnets/read
警告
若要使用 Windows 伺服器節點集區,您必須使用 Azure CNI。 kubenet 網路模型不適用於 Windows Server 容器。
開始之前
您必須安裝並設定 Azure CLI 2.0.65 版或更新版本。 執行 az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。
使用您自己的子網路的 Kubenet 網路概觀
在許多環境中,您已使用配置的 IP 位址範圍來定義虛擬網路和子網路,並使用這些資源來支援多個服務和應用程式。 若要提供網路連線,AKS 叢集可以使用 kubenet (基本網路) 或 Azure CNI (進階網路)。
使用 kubenet,只有節點在虛擬網路子網路中接收 IP 位址。 Pod 無法彼此直接通訊。 相反地,使用者定義的路由 (UDR) 和 IP 轉送會跨節點處理 Pod 之間的連線。 UDR 和 IP 轉送設定預設會由 AKS 服務建立並維護,但您可以視需要自備路由表以進行自訂路由管理 (部分機器翻譯)。 您也可以在接收已指派 IP 位址的服務後面部署 Pod,並為應用程式的流量進行負載平衡。 下圖顯示 AKS 節點如何在虛擬網路子網路中 (而不是 Pod 中) 接收 IP 位址:
Azure 在 UDR 中最多支援 400 個路由,因此,您 AKS 叢集中的節點不能超過 400 個。 kubenet 不支援 AKS 虛擬節點 (部分機器翻譯) 和 Azure 網路原則。 不支援 Calico 網路原則 (英文)。
使用 Azure CNI,每個 Pod 都會接收 IP 子網路中的 IP 位址,且可直接與其他 Pod 和服務進行通訊。 您的叢集大小可以多達您指定的 IP 位址範圍。 不過,您必須事先規劃 IP 位址範圍,而 AKS 節點會根據其可支援的最大 Pod 數目來取用所有 IP 位址。 Azure CNI 支援進階網路功能和案例,例如虛擬節點 (部分機器翻譯) 或網路原則 (Azure 或 Calico)。
Kubenet 限制與考量
- Kubenet 的設計需要額外的躍點,這會稍微增加 Pod 通訊的延遲。
- 使用 kubenet 需要路由表和使用者定義的路由,這會增加作業的複雜度。
- 如需詳細資訊,請參閱透過 AKS 中使用者定義的路由表自訂叢集輸出和使用 AKS 中的輸出類型自訂叢集輸出 (部分機器翻譯)。
- 由於 kubenet 設計的關係,kubenet 不支援直接 Pod 定址。
- 與 Azure CNI 叢集不同的是,多個 kubenet 叢集無法共用子網路。
- AKS 不會將網路安全性群組 (NSG) 套用至其子網路,也不會修改與該子網路相關聯的任何 NSG。 如果您有自己的子網路並新增與該子網路建立關聯的 NSG,則必須確保 NSG 中的安全性規則允許節點與 Pod CIDR 之間的流量。 如需詳細資料,請參閱網路安全性群組。
- Kubenet 上不支援的功能包括:
注意
叢集中的某些系統 Pod (例如 konnectivity) 會使用主機節點 IP 位址,而不會使用重疊位址空間中的 IP。 系統 Pod 將只會使用節點 IP,而不會使用虛擬網路中的 IP 位址。
IP 位址可用性與耗盡
Azure CNI 的常見問題是指派的 IP 位址範圍太小,而無法在調整或升級叢集時新增更多節點。 網路小組可能也無法發出夠大的 IP 位址範圍來支援您預期的應用程式需求。
作為折衷方案,您可以建立使用 kubenet 並連接到現有虛擬網路子網路的 AKS 叢集。 此方法可讓節點接收定義的 IP 位址,而無需事先為叢集中可能執行的所有潛在 Pod 保留大量 IP 位址。 使用 kubenet,您可以使用更小的 IP 位址範圍,並支援大型叢集和應用程式需求。 例如,在子網路上使用 /27 IP 位址範圍,您就能執行具有足夠調整或升級空間的 20-25 節點叢集。 此叢集大小最多可支援 2,200-2,750 個 Pod (每個節點預設最多 110 個 Pod)。 您可以在 AKS 中使用 kubenet 設定的每個節點 Pod 數目上限為 250。
下列基本計算會比較網路模型中的差異:
- kubenet:簡單的 /24 IP 位址範圍最多可在叢集中支援 251 個節點。 每個 Azure 虛擬網路子網路都會保留前三個 IP 位址來進行管理作業。 此節點計數最多可支援 27,610 個 Pod (每個節點預設最多 110 個 Pod)。
- Azure CNI:同一個基本的 /24 子網路範圍在叢集中最多只能支援「八」個節點。 此節點計數最多只能支援 240 個 Pod,每個節點預設最多 30 個 Pod。
注意
這些最大值不列入帳戶升級,或調整規模作業。 實際上,您無法執行子網路 IP 位址範圍所支援的節點數目上限。 您必須在調整或升級作業期間保留一些可用的 IP 位址。
虛擬網路對等互連和 ExpressRoute 連線
為了提供內部部署連線能力,kubenet 和 Azure-CNI 網路方法都可使用 Azure 虛擬網路對等互連 (部分機器翻譯) 或 ExpressRoute 連線。 仔細規劃您的 IP 位址範圍,以避免重疊和不正確的流量路由。 例如,許多內部部署網路都會使用透過 ExpressRoute 連線公告的 10.0.0.0/8 位址範圍。 建議您將 AKS 叢集建立到此位址範圍之外 (例如 172.16.0.0/16) 的 Azure 虛擬網路子網路中。
選擇要使用的網路模型
下列考量有助於概述最適合使用每種網路模型的時機:
使用 kubenet 的時機:
- 您的 IP 位址空間有限。
- 大部分的 Pod 通訊是在叢集內。
- 您不需要虛擬節點或 Azure 網路原則等進階 AKS 功能。
使用 Azure CNI 的時機:
- 您有可用的 IP 位址空間。
- 大部分的 Pod 通訊是在叢集外部的資源。
- 您不想要管理使用者定義的 Pod 連線路由。
- 您需要虛擬節點或 Azure 網路原則等 AKS 進階功能。
如需可協助您決定所要使用網路模型的詳細資訊,請參閱比較網路模型及其支援範圍。
建立虛擬網路和子網路
使用
az group create
命令建立資源群組。az group create --name myResourceGroup --location eastus
如果您目前沒有可使用的虛擬網路和子網路,請使用
az network vnet create
(部分機器翻譯) 命令來建立這些網路資源。 下列範例命令會建立名為 myAKSVnet 的虛擬網路 (位址首碼為 192.168.0.0/16),以及名為 myAKSSubnet 的子網路 (位址首碼為 192.168.1.0/24):az network vnet create \ --resource-group myResourceGroup \ --name myAKSVnet \ --address-prefixes 192.168.0.0/16 \ --subnet-name myAKSSubnet \ --subnet-prefix 192.168.1.0/24 \ --location eastus
使用
az network vnet subnet show
(部分機器翻譯) 命令來取得子網路資源識別碼,並將其儲存成名為SUBNET_ID
的變數,以供日後使用。SUBNET_ID=$(az network vnet subnet show --resource-group myResourceGroup --vnet-name myAKSVnet --name myAKSSubnet --query id -o tsv)
在虛擬網路中建立 AKS 叢集
建立具有系統指派受控身分識別的 AKS 叢集
注意
使用系統指派的身分識別時,Azure CLI 會在建立叢集之後,將網路參與者角色授與系統指派的身分識別。 如果您使用 ARM 範本或其他用戶端,則需要改為使用使用者指派的受控識別 (部分機器翻譯)。
使用
az aks create
命令來建立具有系統指派受控識別的 AKS 叢集。az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --network-plugin kubenet \ --service-cidr 10.0.0.0/16 \ --dns-service-ip 10.0.0.10 \ --pod-cidr 10.244.0.0/16 \ --vnet-subnet-id $SUBNET_ID \ --generate-ssh-keys
部署參數:
- --service-cidr 是選用的。 此位址可用來為 AKS 叢集中的內部服務指派 IP 位址。 此 IP 位址範圍應該為不在網路環境中其他位置使用的位址空間,如果您使用 Express Route 或站對站 VPN 連線連接或計畫連接 Azure 虛擬網路,則包括任何內部部署網路範圍。 預設值為 10.0.0.0/16。
- --dns-service-ip 是選用的。 此位址應該是您服務 IP 位址範圍的 .10 位址。 預設值為 10.0.0.10。
- --pod-cidr 是選用的。 此位址應該是未在您網路環境中的其他位置使用的大型位址空間。 如果您使用 Express Route 或站對站 VPN 連線連接或計畫連接 Azure 虛擬網路,則此範圍包括任何內部部署網路範圍。 預設值為 10.244.0.0/16。
- 此位址範圍必須大到足以容納您希望擴大的節點數目。 部署叢集後,即無法變更此位址範圍。
- Pod IP 位址範圍用來為叢集中的每個節點指派 /24 位址空間。 在下列範例中,10.244.0.0/16 的 --pod-cidr 指派第一個節點 10.244.0.0/24、第二個節點 10.244.1.0/24 和第三個節點 10.244.2.0/24。
- 隨著叢集縮放比例或升級,Azure 平台會繼續為每個新的節點指派一個 Pod IP 位址範圍。
建立具有使用者指派受控識別的 AKS 叢集
建立受控識別
使用
az identity
命令來建立受控識別。 如果您目前有受控識別,則可改為使用az identity show --ids <identity-resource-id>
命令來尋找主體識別碼。az identity create --name myIdentity --resource-group myResourceGroup
您的輸出應該類似下列範例輸出:
{ "clientId": "<client-id>", "clientSecretUrl": "<clientSecretUrl>", "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", "location": "westus2", "name": "myIdentity", "principalId": "<principal-id>", "resourceGroup": "myResourceGroup", "tags": {}, "tenantId": "<tenant-id>", "type": "Microsoft.ManagedIdentity/userAssignedIdentities" }
新增受控身分識別的角色指派
如果您使用 Azure CLI,則會自動新增該角色,而您可以略過此步驟。 如果您使用 ARM 範本或其他用戶端,則需要使用叢集受控識別的主體識別碼來執行角色指派。
使用
az network vnet show
命令來取得虛擬網路資源識別碼,並將其儲存成名為VNET_ID
的變數。VNET_ID=$(az network vnet show --resource-group myResourceGroup --name myAKSVnet --query id -o tsv)
使用
az role assignment create
命令,針對虛擬網路上的 AKS 叢集「網路參與者」權限指派受控識別,並提供 <principalId>。az role assignment create --assignee <control-plane-identity-principal-id> --scope $VNET_ID --role "Network Contributor" # Example command az role assignment create --assignee 22222222-2222-2222-2222-222222222222 --scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myAKSVnet" --role "Network Contributor"
注意
授與 Azure 所使用叢集受控身分識別的權限,可能需要 60 分鐘的時間才能填入。
建立 AKS 叢集
使用
az aks create
(部分機器翻譯) 命令來建立 AKS 叢集,並針對assign-identity
引數提供控制平面的受控識別資源識別碼,以指派使用者指派的受控識別。az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 3 \ --network-plugin kubenet \ --vnet-subnet-id $SUBNET_ID \ --assign-identity <identity-resource-id> \ --generate-ssh-keys
當您建立 AKS 叢集時,會自動建立網路安全群組和路由表。 這些網路資源由 AKS 控制平面管理。 網路安全性群組會自動與您節點上的虛擬 NIC 建立關聯。 路由表會自動與虛擬網路子網路建立關聯。 當您建立和公開服務時,網路安全性群組規則和路由表會自動更新。
使用 kubenet 提供您自己的子網路和路由表
使用 kubenet 時,路由表必須存在於叢集子網路上。 AKS 支援提供自備的現有子網路和路由表。 如果您的自訂子網路未包含路由表,AKS 就會為您建立一個,並在整個叢集生命週期中新增規則。 如果您的自訂子網路在建立叢集時包含路由表,AKS 會在叢集作業期間認可現有的路由表,並據以新增/更新雲端提供者作業的規則。
警告
您可以在自訂路由表上新增/更新自訂規則。 不過,由 Kubernetes 雲端提供者新增的規則是不可更新或移除的。 0.0.0.0/0 等規則必須一律存在於指定的路由表中,並對應至您網際網路閘道的目標,例如 NVA 或其他輸出閘道。 更新規則時請小心。
深入了解如何設定自訂路由表。
Kubenet 網路需要組織路由表規則才能成功路由要求。 由於此設計,所以必須針對依賴路由表的每個叢集仔細維護該路由表。 多個叢集無法共用一個路由表,因為來自不同叢集的 Pod CIDR 可能會重疊,這會造成非預期和中斷路由的情況。 在相同的虛擬網路上設定多個叢集,或將虛擬網路專用於每個叢集時,請考量下列限制:
- 建立 AKS 叢集之前,必須先將自訂路由表關聯至子網路。
- 建立叢集之後,就無法更新相關聯的路由表資源。 不過,您可以在路由表上修改自訂規則。
- 每個 AKS 叢集都必須針對與叢集建立關聯的所有子網路使用單一且唯一的路由表。 您無法重複使用具有多個叢集的路由表,因為可能會產生 Pod CIDR 重疊和與路由規則相衝突。
- 針對系統指派的受控識別,僅支援透過 Azure CLI 提供您自己的子網路和路由表,因為 Azure CLI 會自動新增角色指派。 如果您使用 ARM 範本或其他用戶端,則必須使用使用者指派的受控識別 (部分機器翻譯)、在建立叢集之前指派權限,並確保使用者指派的身分識別擁有您自訂子網路和自訂路由表的寫入權限。
- 不支援搭配多個 AKS 叢集使用相同的路由表。
注意
若要搭配 kubenet 網路外掛程式建立並使用您自己的 VNet 和路由表,您必須針對叢集設定使用者指派的身分識別。 您無法使用系統指派的身分識別,在建立叢集之前擷取身分識別 ID,這會導致在角色指派期間發生延遲。
當您搭配 Azure 網路外掛程式建立並使用自己的 VNet 和路由表時,即會支援系統指派和使用者指派的受控識別。 強烈建議您針對 BYO 情節,使用使用者指派的受控識別。
將具有使用者指派受控識別的路由表新增至 AKS 叢集
在建立自訂路由表並將它與虛擬網路中的子網建立關聯之後,您可以建立新的 AKS 叢集,以指定路由表與使用者指派的受控識別。 您必須使用您計畫部署 AKS 叢集的子網路識別碼。 此子網路也必須與您的自訂路由表建立關聯。
使用
az network vnet subnet list
(部分機器翻譯) 命令來取得子網路識別碼。az network vnet subnet list --resource-group myResourceGroup --vnet-name myAKSVnet [--subscription]
使用
az aks create
命令,並提供--vnet-subnet-id
和--assign-identity
參數的值,來建立 AKS 叢集,其中具有已使用路由表預先設定的自訂子網路。az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --vnet-subnet-id mySubnetIDResourceID \ --assign-identity controlPlaneIdentityResourceID \ --generate-ssh-keys
下一步
本文已說明如何將您的 AKS 叢集部署到現有的虛擬網路子網路。 現在,您可以開始使用 Helm 建立新的應用程式 (部分機器翻譯) 或使用 Helm 部署現有的應用程式 (部分機器翻譯)。