將 Kubernetes 叢集部署到 Azure Stack Hub 上的自訂虛擬網路

您可以使用自訂虛擬網路上的 Azure Kubernetes Service (AKS) 引擎來部署 Kubernetes 叢集。 本文探討如何在虛擬網路中尋找您所需的資訊。 您可以找到叢集用來計算 IP 位址、在 API 模型中設定值,以及設定路由表和網路安全性群組的步驟。

使用 AKS 引擎的 Azure Stack Hub 中的 Kubernetes 叢集會使用 kubenet 網路外掛程式。 Azure Stack Hub 上的 AKS 引擎也支援 Azure CNI 網路外掛程式。

建立自訂虛擬網路時的條件約束

  • 自訂 VNet 必須與 Kubernetes 叢集的所有其他元件位於相同的訂閱中。
  • 控制平面節點集區和代理程式節點集區必須位於相同的虛擬網路中。 您可以將節點部署到相同虛擬網路內的不同子網路中。
  • Kubernetes 叢集子網路必須使用自訂虛擬網路 IP 範圍空間內的 IP 範圍。請參閱取得 IP 位址區塊
  • 請考慮根據正在使用的網路外掛程式類型,使用建議的節點子網路大小。 作為一般指導方針,Azure CNI 針對支援代理程式節點集區的子網路,需要有比 kubenet 更多的 IP 位址。 請參閱下面的 kubenetAzure CNI 範例。
  • 169.254.0.0/16 位址空間不可用於 Kubernetes 叢集的自訂 VNet。

建立自訂虛擬網路

您的 Azure Stack Hub 執行個體中必須有自訂虛擬網路。 如需詳細資訊,請參閱快速入門:使用 Azure 入口網站建立虛擬網路

在虛擬網路中建立新的子網路。 您需要取得子網路資源識別碼和 IP 位址範圍。 部署叢集時,您會在 API 模型中使用資源識別碼和範圍。

  1. 在您的 Azure Stack Hub 執行個體中開啟 Azure Stack Hub 使用者入口網站。

  2. 選取 [所有資源]。

  3. 在搜尋方塊中,輸入虛擬網路的名稱。

  4. 選取 [子網路]>[+ 子網路] 以新增子網路。

  5. 使用 CIDR 標記法,新增名稱位址範圍。 選取 [確定]。

  6. 在 [虛擬網路] 刀鋒視窗中,選取 [屬性]。 複製資源識別碼並新增 /subnets/<nameofyoursubnect>。 您會使用此值作為叢集 API 模型中 vnetSubnetId 金鑰的值。 子網路的資源識別碼使用下列格式:
    /subscriptions/SUB_ID/resourceGroups/RG_NAME/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/SUBNET_NAME

    虛擬網路「資源識別碼」

  7. 在 [虛擬網路] 刀鋒視窗中,選取 [子網路]。 選取子網路名稱,例如 control-plane-sn

    請勿將子網路與網路安全性群組關聯 (NSG)。

    虛擬網路 CIDR 區塊

  8. 在子網路刀鋒視窗中,記下每個子網路的位址範圍 (CIDR 區塊)。

選取位址空間的考量

當您建立自訂虛擬網路時,您會指定網路的 IP 位址空間,以及每個子網路的 IP 位址範圍。 當您選擇要在 Kubernetes 叢集中使用的位址空間和範圍時,請考慮下列因素:

  • 重疊的位址空間可能會導致 IP 位址衝突或通訊錯誤。 若要降低重疊 IP 位址的風險,請為新的虛擬網路選擇唯一的位址空間。
  • 10/8172.16/12192.168/16 範圍內的位址空間通常會用於私人網路,並可供您現有的資料中心基礎結構使用。 如果您的 Kubernetes 應用程式使用資料中心內的資源,請選擇與您資料中心位址空間不同的自訂虛擬網路位址空間,以降低衝突風險。
  • 建議您針對 Kubernetes 叢集使用專用子網路。
  • 如果使用多個現有的虛擬網路,並想要使用虛擬網路對等互連,請考慮在每個網路上使用不同的位址空間。 重疊的位址空間可能會影響您啟用對等互連的能力。

取得 IP 位址區塊

AKS 引擎支援在現有的虛擬網路上進行部署。 在現有的虛擬網路上部署時,您的叢集會針對代理程序節點、控制平面節點、叢集服務和容器使用連續位址區塊, (pod) 。 每個位址區塊都可以轉譯為虛擬網路內的子網路。 叢集部署中的所有位址區塊都必須是整體虛擬網路位址空間的一部分。 選擇虛擬網路位址空間外部的位址區塊可能會導致連線問題。

設定 Kubernetes 叢集時,至少需要三個位址區塊:

  • 節點位址區塊:這是用來將位址指派給叢集節點的位址區塊。 這可以是所有叢集節點的單一位址區塊,也可以是控制平面和代理程式集區的個別區塊 (子網路)。 選取此區塊的位址範圍時,請考慮您叢集中的節點計數。 由於 Azure CNI 節點和容器會從相同的位址區塊取得其位址,因此若使用 Azure CNI,請在選擇位址範圍時,考慮您要部署到叢集的容器數目。
  • 服務位址區塊:這是部署到 Kubernetes 叢集的服務將從中取得其叢集位址的位址區塊。 選取此區塊的位址範圍時,請考慮您想要在叢集中執行的服務數目上限。
  • 叢集位址區塊:這是 Pod 將會從中取得其叢集位址的位址區塊。 選取此區塊的位址範圍時,請考慮您想要在叢集中執行的 Pod 數目上限。 如前所述,若是 Azure CNI,叢集和節點位址區塊會相同。

除了位址區塊之外,您還必須針對控制平面節點多設定兩個值。 您必須知道需要為叢集保留的 IP 位址數目,以及子網路 IP 空間內的第一個連續靜態 IP。 當您使用多個控制平面節點時,AKS 引擎需要最多 16 個未使用的 IP 位址範圍。 叢集會針對每個控制平面使用一個 IP 位址,最多五個控制平面節點。 AKS 引擎也需要最後一個控制平面節點之後的下一個 10 個 IP 位址,才能保留前端 IP 位址。 最後,負載平衡器會在控制平面節點和前端保留之後使用另一個IP位址,總共16個。 放置您的 IP 位址區塊時,子網路需要將現有 IP 位址配置如下:

  • 前四個IP位址和最後一個IP位址是保留的,而且無法在任何 Azure 子網中使用。
  • 應將 16 個 IP 位址保持開啟以作為緩衝區。
  • 叢集第一個IP位址的值應該位於位址空間的結尾,以避免IP衝突。 可能的話,請將 firstConsecutiveStaticIP 屬性指派給子網中可用IP位址空間 結尾 附近的IP位址。

例如,針對具有三個控制平面節點的叢集。 如果您使用具有 256 個位址的子網路 (例如 10.100.0.0/24),則必須在 239 之前設定您的第一個連續靜態 IP 位址。 下表顯示各個位址和考量情況:

/24 子網路的範圍 數字 注意
172.100.0.0 - 172.100.0.3 4 保留在 Azure 子網路中。
172.100.0.224-172.100.0.238 14 AKS 引擎定義叢集的 IP 位址計數。

3 個控制平面節點的 3 個 IP 位址
用於空餘空間的 10 個 IP 位址
供負載平衡器使用的 1 個 IP 位址
172.100.0.238 - 172.100.0.254 16 16 個 IP 位址緩衝區。
172.100.0.255 1 保留在 Azure 子網路中。

在此範例中,firstConsecutiveStaticIP 屬性會是 172.100.0.224

對於較大的子網路 (例如 /16,其中包含超過 60,000 個位址),可能無法將靜態 IP 指派設定到網路空間的結尾。 請勿將您的叢集靜態 IP 位址範圍設定為您 IP 空間中的前 24 個位址,以便在宣告位址時可以復原叢集。

Kubenet 位址區塊範例

在下列範例中,您可以看到這些各種考量如何使用 kubenet 網路外掛程式,搭配控制平面節點和代理程式節點集區 (每個集區三個節點) 的專用子網路,為叢集擴充虛擬網路中的位址空間。

VNet 位址空間:10.100.0.0/16。

位址區塊 (子網路) CIDR IP 範圍 IP 計數 (可用)
控制平面節點區塊 10.100.0.0/24 10.100.0.0 - 10.100.0.255 255 - 4 (已保留) = 251
代理程式節點區塊 10.100.1.0/24 10.100.1.0 - 10.100.1.255 255 - 4 (已保留) = 251
服務區塊 10.100.16.0/20 10.100.16.0 - 10.100.31.255 4,096 - 5 (已保留) = 4,091
叢集區塊 10.100.128.0/17 10.100.128.0 - 10.100.255.255 32,768 - 5 (已保留) = 32,763

在此範例中,firstConsecutiveStaticIP 屬性會是 10.100.0.239

Azure CNI 位址區塊範例

在下列範例中,您可以看到這些各種考量如何使用 Azure CNI 網路外掛程式,搭配控制平面和代理程式節點集區 (每個集區三個節點) 的專用子網路,為叢集擴充虛擬網路中的位址空間。

VNet 位址空間:172.24.0.0/16。

注意

在您的環境中,如果公用 IP 範圍在 CIDR10.0.0.0/8 內,請使用 kubenet 作為網路外掛程式。

位址區塊 (子網路) CIDR IP 範圍 IP 計數 (可用)
控制平面節點區塊 172.24.0.0/24 172.24.0.0 - 172.24.0.255 255 - 4 (已保留) = 251
叢集區塊 & 代理程序節點 172.24.128.0/17 172.24.128.0 - 172.24.255.255 32,768 - 5 (已保留) = 32,763
服務區塊 172.24.16.0/20 172.24.16.0 - 172.24.31.255 4,096 - 5 (已保留) = 4,091

在此範例中,firstConsecutiveStaticIP 屬性會是 172.24.0.239

更新 API 模型

更新用來將叢集從 AKS 引擎部署到自定義虛擬網路的 API 模型。

masterProfile 中設定以下值:

欄位 範例 描述
vnetSubnetId /subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn 指定子網路的 Azure Resource Manager 路徑識別碼。 此值會對應到上述的控制平面節點位址區塊。
firstConsecutiveStaticIP 10.100.0.239 請將所需子網路中接近可用 IP 位址空間結尾的 IP 位址指派給 firstConsecutiveStaticIP 組態屬性。 firstConsecutiveStaticIP 只適用於控制平面節點集區。

agentPoolProfiles 中設定下列值:

欄位 範例 描述
vnetSubnetId /subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/agents-sn 指定子網路的 Azure Resource Manager 路徑識別碼。 此值會對應到上述的代理程式節點位址區塊。

orchestratorProfile 中,尋找 kubernetesConfig 並設定下列值:

欄位 範例 描述
clusterSubnet 10.100.128.0/17 用來為 Pod 網路介面配置 IP 位址的 IP 子網路。 此值會對應到上述的叢集位址區塊。 子網路必須位於 VNet 位址空間中。 啟用 Azure CNI 時,預設值為 10.240.0.0/12。 若未使用 Azure CNI,則預設值為 10.244.0.0/16。 請使用 /16,而不是 /24 子網路。 如果您使用 /24,則只會將此子網指派給一個節點。 其他節點不會獲指派 POD 網路,因為您已用完 IP 空間,所以這些節點在叢集中尚未就緒。
serviceCidr 10.100.16.0/20 用來為叢集中部署的服務配置 IP 位址的 IP 子網路。 此值會對應到上述的叢集服務區塊。
dnsServiceIP 10.100.16.10 要指派給叢集 DNS 服務的 IP 位址。 此位址必須來自 serviceCidr 子網路。 指定 serviceCidr 時,必須設定這個值。 預設值為是 serviceCidr 子網路的 .10 位址。

例如,如果使用 kubenet:
使用 10.100.0.0/16 的網路位址空間,其中 control-plane-sn 的子網路為 10.100.0.0/24,而 agents-sn10.100.1.0/24

"masterProfile": {
  ...
  "vnetSubnetId": "/subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn",
  "firstConsecutiveStaticIP": "10.100.0.239",
  ...
},
...
"agentPoolProfiles": [
  {
    ...
    "vnetSubnetId": "/subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/agents-sn",
    ...
  },
    ...
"kubernetesConfig": [
  {
    ...
    "clusterSubnet": "10.100.128.0/17",
    "serviceCidr": "10.100.16.0/20",
    "dnsServiceIP" : "10.100.16.10",

    ...
  },

例如,如果使用 Azure CNI:
使用 172.24.0.0/16 的網路位址空間,其中 control-plane-sn 的子網路為 172.24.0.0/24,而 k8s-sn172.24.128.0/17

"masterProfile": {
  ...
  "vnetSubnetId": "/subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn",
  "firstConsecutiveStaticIP": "172.24.0.239",
  ...
},
...
"agentPoolProfiles": [
  {
    ...
    "vnetSubnetId": "/subscriptions/77e28b6a-582f-42b0-94d2-93b9eca60845/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/k8s-sn",
    ...
  },
    ...
"kubernetesConfig": [
  {
    ...
    "clusterSubnet": "172.24.128.0/17",
    "serviceCidr": "172.24.16.0/20",
    "dnsServiceIP" : "172.24.16.10",
    ...
  },

部署您的叢集

將值新增至 API 模型之後,您可以使用 AKS 引擎中的 命令,從用戶端電腦 deploy 部署叢集。 如需指示,請參閱部署 Kubernetes 叢集

設定路由表

如果使用 kubenet,例如 kubernetesConfig API 模型設定物件中的 networkPlugin: kubenet。 部署叢集後,請回到 Azure Stack 使用者入口網站中的虛擬網路。 在子網路刀鋒視窗中設定路由表和網路安全性群組 (NSG)。 將叢集成功部署至自訂虛擬網路之後,請從叢集資源群組的 [網路] 刀鋒視窗中取得路由表資源的識別碼。

  1. 在您的 Azure Stack Hub 執行個體中開啟 Azure Stack Hub 使用者入口網站。

  2. 選取 [所有資源]。

  3. 在搜尋方塊中,輸入虛擬網路的名稱。

  4. 選取 [子網路] 然後選取包含您叢集的子網路名稱。

    路由表和網路安全性群組

  5. 選取 [路由表],然後選取叢集的路由表。

  6. 請確定這是針對 API 模型中指定的每個子網所完成,包括 masterProfile 子網。

注意

Kubernetes Windows 叢集的自訂虛擬網路的已知問題

後續步驟