次の方法で共有


ネットワーク分離 Azure Kubernetes Service (AKS) クラスターを作成する

通常、組織には、データ流出のリスクを排除するために、クラスターからのエグレス (送信) ネットワーク トラフィックを規制する厳密なセキュリティとコンプライアンスの要件があります。 既定では、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 を作成し、アーティファクト キャッシュを有効にする

  1. プライベート リンクを使用して 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)
    
  2. 次のコマンドに従って 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 でネットワーク ポリシーを使用して、ポッド間のトラフィックをセキュリティ保護する」を参照してください。