通常、組織には、データ流出のリスクを排除するために、クラスターからのエグレス (送信) ネットワーク トラフィックを規制する厳密なセキュリティとコンプライアンスの要件があります。 既定では、Standard SKU Azure Kubernetes Service (AKS) クラスターには無制限の送信インターネット アクセスがあります。 このレベルのネットワーク アクセスでは、実行しているノードやサービスから必要に応じて外部リソースにアクセスできます。 エグレス トラフィックを制限する場合は、正常なクラスター メンテナンス タスクを維持するために、アクセスできるポートとアドレスの数を制限する必要があります。 AKS クラスター用のアウトバウンド ネットワークと FQDN 規則に関する概念ドキュメントでは、AKS クラスターに必要なエンドポイントおよびそのオプションのアドオンと機能の一覧が示されています。
クラスターからの送信トラフィックを制限する一般的な解決策の 1 つは、 ファイアウォール デバイス を使用してファイアウォール規則に基づいてトラフィックを制限することです。 ファイアウォールは、アプリケーションが送信アクセスを必要とするが、送信要求を検査してセキュリティで保護する必要がある場合に適用されます。 必要なエグレス ルールと FQDN を 使用してファイアウォールを手動で構成するのは面倒なプロセスです。特に、クラスターブートストラップの送信依存関係のない分離された AKS クラスターを作成することが唯一の要件の場合です。
ネットワーク分離クラスターでは、データ流出のリスクを軽減するために、Microsoft Artifact Registry (MAR) からクラスター コンポーネント/イメージをフェッチする場合でも、送信ネットワークの依存関係なしで AKS クラスターをブートストラップできます。 クラスター オペレーターは、有効にするシナリオごとに許可される送信トラフィックを段階的に設定できます。 この記事では、ネットワーク分離クラスターを作成する手順について説明します。
開始する前に
- この機能の概念的な概要の記事を参照してください。ネットワーク分離クラスターのしくみが説明されています。 概要記事には次のことも記載されています。
- クラスターのブートストラップに使用されるプライベート Azure Container Registry (ACR) リソースの 2 つのオプション (AKS マネージド ACR または Bring Your Own ACR) について説明します。
- API サーバーへのプライベート アクセスを作成するための 2 つのプライベート クラスター モード ( プライベート リンク ベース または API Server Vnet 統合) について説明します。
- クラスターエグレス制御の 2 つの送信の種類 (
none
またはblock
(プレビュー) について説明します。 - ネットワーク分離クラスターの現在の制限事項について説明します。
注
送信の種類 none
は一般提供されています。
アウトバウンドタイプblock
はプレビュー段階です。
重要
AKS のプレビュー機能は、セルフサービスのオプトインに基づいて利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用は意図されていません。 詳細については、次のサポート記事を参照してください。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。
CLI リファレンス コマンドをローカル環境で実行したい場合は、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。
初回使用時に求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
インストールされているバージョンと依存ライブラリを調べるには、az version を実行します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事では、Azure CLI のバージョン 2.71.0 以降が必要です。 Azure Cloud Shell をお使いの場合は、最新バージョンが既にインストールされています。
- 送信の種類
aks-preview
(プレビュー) を使用している場合は、 Azure CLI 拡張機能バージョンblock
以降をインストールする必要があります。aks-preview
拡張機能がまだない場合は、az extension add
コマンドを使ってインストールします。az extension add --name aks-preview
aks-preview
拡張機能が既にある場合は、az extension update
コマンドを使って更新し、確実に最新バージョンを使うようにします。az extension update --name aks-preview
- ネットワーク分離クラスターは、Kubernetes バージョン 1.30 以上を使用する AKS クラスターでサポートされます。
- Bring Your Own (BYO) Azure Container Registry (ACR) オプションを使用する場合は、ACR が Premium SKU サービス レベルであることを確認する必要があります。
- API Server VNet 統合で構成されたネットワーク分離クラスターを使用している場合は、この ドキュメントの前提条件とガイダンスに従う必要があります。
AKS で管理される ACR を使用してネットワーク分離クラスターをデプロイする
このオプションでは、AKS が ACR リソースを作成、管理、調整します。 アクセス許可を割り当てたり、ACR を管理したりする必要はありません。 AKS は、ネットワーク分離クラスターで使用されるキャッシュ規則、プライベート リンク、およびプライベート エンドポイントを管理します。
ネットワーク分離クラスターを作成する
ネットワーク分離 AKS クラスターを作成するときは、プライベート リンク ベースまたは API Server Vnet 統合のいずれかのプライベート クラスター モードを選択できます。
選択するモードに関係なく、 --bootstrap-artifact-source
パラメーターと --outbound-type
パラメーターを設定する必要があります。
--bootstrap-artifact-source
は、イメージ プルに対して直接 MAR (ネットワーク分離されていない) とプライベート ACR (ネットワーク分離) を使用する場合に対応するDirect
またはCache
のいずれかに設定できます。
--outbound-type parameter
は、none
またはblock
(プレビュー) に設定できます。 送信の種類が none
に設定されている場合、AKS ではクラスターの送信接続は設定されず、ユーザーが独自に構成できます。 送信の種類が block
に設定されている場合、すべての送信接続がブロックされます。
プライベート リンクベース
、--bootstrap-artifact-source
、および --enable-private-cluster
パラメーターを使用して --outbound-type
コマンドを実行して、プライベート リンクベースのネットワーク分離クラスターを作成します。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster
API サーバー VNet 統合
、--bootstrap-artifact-source
、--enable-private-cluster
、および--enable-apiserver-vnet-integration
パラメーターを使用して --outbound-type
コマンドを実行して、API Server VNet 統合で構成されたネットワーク分離クラスターを作成します。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration
既存の AKS クラスターをネットワーク分離型に更新する
新しいクラスターを作成するのではなく、既存の AKS クラスターでネットワーク分離を有効にする場合は、az aks update コマンドを使用します。
既存の AKS クラスターでネットワーク分離機能を有効にするには、まず次のコマンドを実行して bootstrap-artifact-source
を更新します。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache
次に、すべての既存の nodepool を手動で再イメージ化する必要があります。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
注
最初の再イメージ化が完了するまで送信接続を確実に存在させておく必要があります。 再イメージ化が完了したかどうかを確認するには、次を実行します。
NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done
再イメージ化が完了するのを待ってから、次のコマンドを実行して outbound-type
を更新します。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none
既存のすべてのノード プールをもう一度手動で再イメージ化する必要があることに注意してください。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
既存のクラスターでネットワーク分離モードを有効にした後、忘れずにクラスターのノード プールを再イメージ化してください。 そうしないと、この機能はクラスターに対して有効になりません。
Bring Your Own ACR を使用してネットワーク分離クラスターをデプロイする
AKS では、独自の (BYO) ACR の持ち込みがサポートされています。 BYO ACR シナリオをサポートするには、AKS クラスターを作成する前に、ACR プライベート エンドポイントとプライベート DNS ゾーンを構成する必要があります。
次の手順では、これらのリソースを準備する方法を示します。
- AKS と ACR 用のカスタム仮想ネットワークとサブネット。
- ACR、ACR キャッシュ ルール、プライベート エンドポイント、プライベート DNS ゾーン。
- カスタム コントロール プレーン ID と kubelet ID。
手順 1: 仮想ネットワークとサブネットを作成する
az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
az network vnet create --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16
az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24
SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)
az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled
手順 2: 仮想ネットワークの送信接続を無効にする (省略可能)
仮想ネットワークの送信接続を無効にする方法は複数あります。
手順 3: ACR を作成し、アーティファクト キャッシュを有効にする
プライベート リンクを使用して ACR を作成します。
az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --query 'id' --output tsv)
次のコマンドに従って ACR キャッシュ ルールを作成し、ユーザーが MAR コンテナー イメージとバイナリを新しい ACR にキャッシュできるようにします。キャッシュ ルール名とリポジトリ名は、次のガイダンスに厳密に一致している必要があります。
az acr cache create -n aks-managed-mcr -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "aks-managed-repository/*"
注
BYO ACR では、ACR キャッシュ ルールが上記のように正しく作成され、維持されていることを確認する必要があります。 この手順は、クラスターの作成、機能、アップグレードに不可欠です。 このキャッシュ ルールは変更しないでください。
手順 4: ACR のプライベート エンドポイントを作成する
az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection
NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)
REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)
DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)
手順 5: プライベート DNS ゾーンを作成し、レコードを追加する
privatelink.azurecr.io
という名前のプライベート DNS ゾーンを作成します。 レジストリ REST エンドポイント {REGISTRY_NAME}.azurecr.io
と、レジストリ データ エンドポイント {REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.io
のレコードを追加します。
az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"
az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false
az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}
az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}
az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}
az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}
手順 6: コントロール プレーンと kubelet ID を作成する
コントロール プレーン ID
az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}
CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)
CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)
kubelet ID
az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}
KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)
KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)
kubelet ID に対する AcrPull アクセス許可を付与する
az role assignment create --role AcrPull --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
これらのリソースを構成したら、BYO ACR を使用したネットワーク分離 AKS クラスターの作成に進むことができます。
手順 7: BYO ACR を使用してネットワーク分離クラスターを作成する
ネットワーク分離クラスターを作成する場合は、プライベート リンク ベースまたは API Server Vnet 統合のいずれかのプライベート クラスター モードを選択できます。
選択するモードに関係なく、 --bootstrap-artifact-source
パラメーターと --outbound-type
パラメーターを設定する必要があります。
--bootstrap-artifact-source
は、直接 Microsoft Artifact Registry (MAR) (ネットワーク分離されていない) とイメージ プル用のプライベート ACR (ネットワーク分離) をそれぞれ使用する場合に対応するDirect
またはCache
に設定できます。
--outbound-type parameter
は、none
またはblock
(プレビュー) に設定できます。 送信の種類が none
に設定されている場合、AKS ではクラスターの送信接続は設定されず、ユーザーが独自に構成できます。 送信の種類が block
に設定されている場合、すべての送信接続がブロックされます。
プライベート リンクベース
必要なパラメーターを指定して az aks create コマンドを実行し、ACR にアクセスする、プライベート リンクに基づくネットワーク分離クラスターを作成します。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster
API サーバー VNet 統合
API サーバー VNet 統合で構成されたネットワーク分離クラスターの場合は、まずサブネットを作成し、次のコマンドを使用して正しいロールを割り当てます。
az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24
export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
API Server VNet 統合で構成されたネットワーク分離クラスターを作成し、必要なパラメーターを指定して az aks create コマンドを実行して ACR にアクセスします。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}
既存の AKS クラスターを更新する
新しいクラスターを作成するのではなく、既存の AKS クラスターでネットワーク分離を有効にする場合は、az aks update コマンドを使用します。
BYO ACR のプライベート エンドポイントとプライベート DNS ゾーンを作成するときは、既存の仮想ネットワークと既存の AKS クラスターのサブネットを使用します。 kubelet ID に AcrPull アクセス許可を割り当てるときは、既存の AKS クラスターの既存の kubelet ID を使用します。
既存の AKS クラスターでネットワーク分離機能を有効にするには、まず次のコマンドを実行して bootstrap-artifact-source
を更新します。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID}
次に、すべての既存の nodepool を手動で再イメージ化する必要があります。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
注
最初の再イメージ化が完了するまで送信接続を確実に存在させておく必要があります。 再イメージ化が完了したかどうかを確認するには、次を実行します。
NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done
再イメージ化が完了するのを待ってから、次のコマンドを実行して outbound-type
を更新します。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none
既存のすべてのノード プールをもう一度手動で再イメージ化する必要があることに注意してください。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
ネットワーク分離クラスター機能を有効にした後は、忘れずにクラスターのノード プールを再イメージ化してください。 そうしないと、この機能はクラスターに対して有効になりません。
ACR ID を更新する
ネットワーク分離クラスターで使用されるプライベート ACR を更新できます。 ACR リソース ID を確認するには、az aks show
コマンドを使います。
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
ACR ID の更新は、az aks update
および --bootstrap-artifact-source
パラメーターを使用して --bootstrap-container-registry-resource-id
コマンドを実行することによって行います。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <New BYO ACR resource ID>
既存のクラスターで ACR ID を更新する場合は、既存のすべてのノードを手動で再イメージ化する必要があります。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
ネットワーク分離クラスター機能を有効にした後は、忘れずにクラスターのノード プールを再イメージ化してください。 そうしないと、この機能はクラスターに対して有効になりません。
ネットワーク分離クラスターが有効になっていることを検証する
ネットワーク分離クラスター機能が有効になっていることを検証するには、az aks show コマンドを使用します
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
次の出力は、outboundType
プロパティ (none または block) と artifactSource
プロパティ (Cache) の値に基づいて、この機能が有効になっていることを示しています。
"kubernetesVersion": "1.30.3",
"name": "myAKSCluster"
"type": "Microsoft.ContainerService/ManagedClusters"
"properties": {
...
"networkProfile": {
...
"outboundType": "none",
...
},
...
"bootstrapProfile": {
"artifactSource": "Cache",
"containerRegistryId": "/subscriptions/my-subscription-id/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
},
...
}
ネットワーク分離クラスターを無効にする
az aks update
および --bootstrap-artifact-source
パラメーターを指定した --outbound-type
コマンドを実行して、ネットワーク分離クラスター機能を無効にします。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer
既存のクラスターでこの機能を無効にする場合は、既存のすべてのノードを手動で再イメージ化する必要があります。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
ネットワーク分離クラスター機能を無効にした後は、忘れずにクラスターのノード プールを再イメージ化してください。 そうしないと、この機能はクラスターに対して有効になりません。
トラブルシューティング
イメージ プルの失敗などの問題が発生している場合は、「 ネットワーク分離 Azure Kubernetes Service (AKS) クラスターの問題のトラブルシューティング」を参照してください。
次のステップ
Azure Firewall を使って送信制限の構成を設定する場合は、AKS での Azure Firewall を使用したエグレス トラフィックの制御に関する記事をご覧ください。
ポッド間の通信方法の制限、およびクラスター内の East-West トラフィックの制限については、「AKS でネットワーク ポリシーを使用して、ポッド間のトラフィックをセキュリティ保護する」を参照してください。
Azure Kubernetes Service