Azure Kubernetes Service (AKS) での CIDR ブロックの静的割り当てと拡張サブネットのサポートのために Azure CNI ネットワークを構成する - (プレビュー)
Azure CNI 動的 IP 割り当ての制限は、/16 サブネットを超えるポッド サブネット サイズのスケーラビリティです。 大規模なサブネットであっても、Azure アドレス マッピングの制限があるため、大規模なクラスターは 65,000 ポッドに制限される可能性があります。 Azure CNI の新しい静的ブロック割り当て機能を使うと、CIDR ブロックを個々の IP ではなくノードに割り当てることで、この問題を解決できます。
次のような利点があります。
- 優れた IP スケーラビリティ: 従来の CNI による個々の IP の動的割り当てとは対照的に、CIDR ブロックはクラスター ノードに静的に割り当てられ、ノードの有効期間中は存在します。 これにより、CIDR ブロックに基づくルーティングが可能になり、従来のクラスターあたり 65,000 ポッドから最大 100 万ポッドにクラスターの制限をスケールアップすることができます。 Azure 仮想ネットワークは、クラスターの規模に対応できる十分な大きさにする必要があります。
- 柔軟性: ノードとポッドのサブネットは個別にスケーリングできます。 1 つのポッド サブネットを、クラスターの複数のノード プール間で共有することも、同じ VNet にデプロイされた複数の AKS クラスター間で共有することもできます。 ノード プール用に個別のポッド サブネットを構成することもできます。
- ハイ パフォーマンス: ポッドには仮想ネットワークの IP が割り当てられるため、VNet 内の他のクラスター ポッドとリソースに直接接続できます。
- ポッドに対する個別の VNet ポリシー: ポッドには個別のサブネットがあるので、ノード ポリシーとは異なる VNet ポリシーを構成できます。 このため、ノードではなくポッドに対してのみインターネット接続を許可したり、Azure NAT Gateway を使用してノード プール内のポッドのソース IP を修正したり、NSG を使用してノード プール間のトラフィックをフィルター処理したりするなど、多くの便利なシナリオを実現できます。
- Kubernetes ネットワーク ポリシー: Cilium、Azure NPM、Calico は、この新しいソリューションで動作します。
この記事では、AKS での CIDR の静的割り当てと拡張サブネットのサポートのために、Azure CNI ネットワークを使う方法について説明します。
前提条件
Note
CIDR の静的ブロック割り当てを使う場合、Kubernetes Load Balancer サービスを使用してアプリケーションを Private Link サービスとして公開することはサポートされません。
AKS で基本的な Azure CNI ネットワークを構成するための前提条件を確認してください。同じ前提条件がこの記事にも適用されます。
AKS で基本的な Azure CNI ネットワークを構成するためのデプロイ パラメーターを確認してください。同じパラメーターが適用されます。
AKS Engine クラスターと DIY クラスターはサポートされていません。
バージョン '2.0.0b2' 以降の拡張機能 aks-preview を使った Azure CLI バージョン
2.37.0
以降既存のクラスターがある場合は、IP サブネットの使用状況を監視するためにコンテナーの分析情報を有効にする必要があります。 次の例に示すように、
az aks enable-addons
コマンドを使ってコンテナーの分析情報を有効にできます。サブスクリプションのサブスクリプションレベルの機能フラグ 'Microsoft.ContainerService/AzureVnetScalePreview' を登録します
az aks enable-addons --addons monitoring --name <cluster-name> --resource-group <resource-group-name>
制限事項
Azure CNI 静的ブロック割り当てを使う場合の制限の一部を次に示します。
- Kubernetes の必要最小バージョンは 1.28 です
- サポートされる最大サブネット サイズは x.x.x.x/12 から 100 万 IP です
- サブネットごとに 1 つの動作モードのみを使用できます。 サブネットで静的ブロック割り当てモードを使う場合、サブネットが同じである別のクラスターまたはノード プールで動的 IP 割り当てモードを使うことはできません。またその逆も同様です。
- 新しいクラスター、またはサブネットが異なるノード プールを既存のクラスターに追加する場合にのみサポートされています。 既存のクラスターまたはノード プールの移行または更新はサポートされていません。
- ノード プール内のノードに割り当てられたすべての CIDR ブロックで、ノードのプライマリ IP として 1 つの IP が選ばれます。 そのため、ネットワーク管理者が
--max-pods
値を選ぶ場合は、最適な方法でニーズに応え、サブネット内の IP を最適な方法で使用できるように、次の計算を使ってみてください。
max_pods
=(N * 16) - 1
(この N は任意の正の整数であり、N > 0 です)
利用可能なリージョン
この機能は、次のリージョンでは使用できません。
- 米国南部
- 米国東部 2
- 米国西部
- 米国西部 2
IP アドレス指定を計画する
IP アドレス指定の計画は、より柔軟で詳細です。 ノードとポッドは独立してスケーリングされるため、アドレス空間も個別に計画することができます。 ポッド サブネットはノード プールの粒度に合わせて構成できるため、ノード プールを追加するとき、常に新しいサブネットを追加できます。 クラスター/ノード プール内のシステム ポッドはポッド サブネットからも IP を受信するので、この動作については把握をしておく必要があります。
このシナリオでは、ノードあたりのポッドの最大数を定義するノード プールの '--max-pod' 構成に基づいて、/28 (16 IP) の CIDR ブロックがノードに割り当てられます。 各ノード上で、そのノード上で使用できるすべての IP のうち 1 つの IP が内部的な目的で予約されています。
そのため、IP を決定して計画する際には '--max-pods' 構成を定義することが不可欠であり、次のように最適に計算できます。max_pods_per_node = (16 * N) - 1
(この N は 0 より大きい任意の正の整数です)
IP の無駄がない理想的な値にするには、最大ポッド値が上記の式に準拠している必要があります。
- 例 1: max_pods = 30、ノードごとの CIDR ブロック割り当て数 = 2、ポッドごとの使用可能 IP 合計数 = (16 * 2) - 1 = 32 - 1 = 31、ノードごとに無駄になる IP = 31 - 30 = 1 [無駄が少ない - 許容できるケース]
- 例 2: max_pods = 31、ノードごとの CIDR ブロック割り当て数 = 2、ポッドごとの使用可能 IP 合計数 = (16 * 2) - 1 = 32 - 1 = 31、ノードごとに無駄になる IP = 31 - 31 = 0 [理想的なケース]
- 例 3: max_pods = 32、ノードごとの CIDR ブロック割り当て数 = 3、ポッドごとの使用可能 IP 合計数 = (16 * 3) - 1 = 48 - 1 = 47、ノードごとに無駄になる IP = 47 - 32 = 15 [無駄が多い - 推奨されないケース]
Kubernetes サービスの IP の計画に変更はありません。
Note
クラスターのスケールをサポートするのに十分な大きさの連続したアドレス空間を VNet に確保してください。
展開のパラメーター
AKS で基本的な Azure CNI ネットワークを構成するためのデプロイ パラメーターはすべて有効ですが、次の 2 つの例外があります。
- vnet subnet id パラメーターは、クラスターのノードに関連するサブネットを参照するようになりました。
- パラメーター pod subnet id は、IP アドレスがノード プール内のポッドに静的または動的に割り当てられるサブネットを指定するために使われます。
- pod ip allocation mode パラメーターでは、動的個別割り当てと静的ブロック割り当てのどちらを使うかを指定します。
開始する前に
- Azure CLI を使用する場合は、
aks-preview
拡張機能が必要です。 「aks-preview
Azure CLI 拡張機能をインストールする」を参照してください。 - ARM または REST API を使用する場合、AKS API のバージョンは "2024-01-02-preview 以降" である必要があります。
aks-preview
Azure CLI 拡張機能をインストールする
az extension add
コマンドを使用してaks-preview
拡張機能をインストールします。az extension add --name aks-preview
az extension update
コマンドを使って拡張機能の最新バージョンに更新します。 拡張機能のバージョンは '2.0..0b2' 以降である必要がありますaz extension update --name aks-preview
AzureVnetScalePreview
機能フラグを登録する
az feature register
コマンドを使用して、AzureVnetScalePreview
機能フラグを登録します。az feature register --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
状態が [登録済み] と表示されるまでに数分かかります。
az feature show
コマンドを使用して、登録の状態を確認します。az feature show --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
状態が Registered と表示されたら、
az provider register
コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。az provider register --namespace Microsoft.ContainerService
CIDR ブロックの静的割り当てと拡張サブネット サポートを使ってネットワークを構成する - Azure CLI
クラスター内で CIDR ブロックの静的割り当てを使うことは、クラスター Azure CNI を動的 IP 割り当て用に構成するための既定の方法と似ています。 次の例は、ノード用のサブネットとポッド用のサブネットがある新しい仮想ネットワークを作成し、Azure CNI と CIDR ブロックの静的割り当てを使うクラスターを作成する手順について説明するものです。 $subscription
などの変数は、実際の値に置き換えてください。
2 つのサブネットを持つ仮想ネットワークを作成します。
resourceGroup="myResourceGroup"
vnet="myVirtualNetwork"
location="myRegion"
# Create the resource group
az group create --name $resourceGroup --location $location
# Create our two subnet network
az network vnet create --resource-group $resourceGroup --location $location --name $vnet --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name nodesubnet --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name podsubnet --address-prefixes 10.40.0.0/13 -o none
クラスターを作成し、--vnet-subnet-id
を使ってノードのサブネットを、--pod-subnet-id
を使ってポッドのサブネットを参照し、--pod-ip-allocation-mode
を使って IP 割り当てモードを定義し、監視アドオンを有効にします。
clusterName="myAKSCluster"
subscription="aaaaaaa-aaaaa-aaaaaa-aaaa"
az aks create \
--name $clusterName \
--resource-group $resourceGroup \
--location $location \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--pod-ip-allocation-mode StaticBlock \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/nodesubnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/podsubnet \
--enable-addons monitoring \
--generate-ssh-keys
ノード プールの追加
ノード プールを追加するときは、--vnet-subnet-id
を使ってノード サブネットを、--pod-subnet-id
を使ってポッド サブネットを、'--pod-ip-allocation-mode' を使って割り当てモードを参照します。 次の例では、新しいノード プールの作成時に参照される、2 つの新しいサブネットを作成しています。
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name node2subnet --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name pod2subnet --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $clusterName -g $resourceGroup -n newnodepool \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/node2subnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/pod2subnet \
--pod-ip-allocation-mode StaticBlock \
--no-wait
CIDR ブロックの静的割り当てと拡張サブネット サポートに関する FAQ
1 つのクラスターに複数のポッド サブネットを割り当てることはできますか?
複数のサブネットをクラスターに割り当てることができますが、各ノード プールに割り当てられるサブネットは 1 つだけです。 同じまたは異なるクラスターにある異なるノード プールが同じサブネットを共有することができます。
別の VNet からのポッド サブネットを一緒に割り当てることはできますか?
いいえ。ポッド サブネットは、クラスターと同じ VNet からのものである必要があります。
クラスター内の一部のノード プールは動的 IP 割り当てを使い、それ以外は新しい静的ブロック割り当てを使うことはできますか?
はい。ノード プールごとに異なる割り当てモードを使用できます。 ただし、サブネットを 1 つの割り当てモードで使うと、関連付けられているすべてのノード プールで、同じ割り当てモードでのみ使用できます。
次のステップ
AKS のネットワークの詳細については、次の記事を参照してください。
Azure Kubernetes Service