ネットワーク分離 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.73.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 統合で構成されたネットワーク分離クラスターを使用している場合は、「API Server VNet integration with Azure Kubernetes Serviceの使用」の前提条件とガイダンスに従ってください。

環境変数の設定

この記事全体で使用する環境変数を設定します。 ACR 名はグローバルに一意である必要があり、小文字の英数字のみを含む必要があります。

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
AKS_NAME="myAKSCluster"
VNET_NAME="myVNet"
AKS_SUBNET_NAME="aksSubnet"
ACR_SUBNET_NAME="acrSubnet"
APISERVER_SUBNET_NAME="apiServerSubnet"
REGISTRY_NAME="myregistry${RANDOM}"
CLUSTER_IDENTITY_NAME="clusterIdentity"
KUBELET_IDENTITY_NAME="kubeletIdentity"

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
  • アクティブなサブスクリプションを持つ Azure アカウント。 アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Terraform をインストールして構成します
  • Azure CLIaz loginを使用してインストールおよびサインインします。これは、デプロイの確認とクラスターへの接続に使用されます。 まだインストールしていない場合は、Azure CLIをインストールします。
  • kubectl クラスターに接続するためにインストールされます。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 ローカルにインストールするには、 az aks install-cli コマンドを使用します。
  • jq インストール済み。デプロイを確認するときに Terraform の状態を解析するために使用されます。 Azure Cloud Shellは既にjqインストールされています。

AKS で管理される ACR を使用してネットワーク分離クラスターをデプロイする

このオプションでは、AKS が ACR リソースを作成、管理、調整します。 アクセス許可を割り当てたり、ACR を管理したりする必要はありません。 AKS は、ネットワーク分離クラスターで使用されるキャッシュ規則、プライベート リンク、およびプライベート エンドポイントを管理します。

ネットワーク分離クラスターを作成する

ネットワーク分離 AKS クラスターを作成する場合は、プライベート リンク ベースまたは API Server VNet 統合のいずれかのプライベート クラスター モードを選択します。

ネットワーク分離の要件に基づいて、成果物のソースと送信の種類を設定します。

パラメーター 受け入れ可能な値/効果
--bootstrap-artifact-source Directは、Microsoft Artifact Registry (MAR) からイメージを直接プルし、ネットワーク分離されません。 Cache は、プライベート ACR からイメージをプルし、ネットワーク分離されています。
--outbound-type none ではクラスターのアウトバウンド接続は設定されないため、これらは自分で設定できます。 block (プレビュー) は、すべての送信接続をブロックします。

--bootstrap-artifact-source、および --enable-private-cluster パラメーターを使用して --outbound-type コマンドを実行して、プライベート リンクベースのネットワーク分離クラスターを作成します。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster

API Server 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} --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

次に、既存のすべてのノード プールを手動で再イメージ化する必要があります。

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

重要

アーティファクト ソースをキャッシュに更新した直後に、クラスターのノード プールを再イメージ化することを忘れないでください。 そうしないと、この機能はクラスターに対して有効になりません。

Bring Your Own ACR を使用してネットワーク分離クラスターをデプロイする

AKS では、独自の (BYO) ACR の持ち込みがサポートされています。 BYO ACR シナリオをサポートするには、AKS クラスターを作成する前に、ACR プライベート エンドポイントとプライベート DNS ゾーンを構成する必要があります。

次の手順では、これらのリソースを準備する方法を示します。

  • AKS と ACR 用のカスタム仮想ネットワークとサブネット。
  • ACR、ACR キャッシュ ルール、プライベート エンドポイント、プライベート DNS ゾーン。
  • カスタム コントロール プレーン ID と kubelet ID。

手順 1: 仮想ネットワークとサブネットを作成する

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: 仮想ネットワークの送信接続を無効にする (省略可能)

たとえば、既定の送信アクセスを false に設定して、AKS サブネットをプライベートにします。

az network vnet subnet update --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${AKS_SUBNET_NAME} --default-outbound false

サポートされているその他の方法と移行に関する考慮事項については、「 仮想ネットワークの送信接続を無効にする」を参照してください。

手順 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}.{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)

既存の AKS クラスターを更新する場合は、前述の ID 作成コマンドをスキップし、既存の kubelet ID オブジェクト ID を取得します。

KUBELET_IDENTITY_PRINCIPAL_ID=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --query identityProfile.kubeletidentity.objectId -o tsv)

Kubelet ID に ACR プルアクセス許可を付与する

レジストリのロールの割り当てアクセス許可モードを確認し、対応するプル ロールを選択します。 ABAC が有効なレジストリでは、 Container Registry Repository Reader ロールが使用されます。 ABAC 対応以外のレジストリでは、 AcrPull ロールが使用されます。

ROLE_ASSIGNMENT_MODE=$(az acr show --name ${REGISTRY_NAME} --resource-group ${RESOURCE_GROUP} --query roleAssignmentMode -o tsv)

if [[ "${ROLE_ASSIGNMENT_MODE}" == "rbac-abac" ]]; then
  ACR_PULL_ROLE="Container Registry Repository Reader"
else
  ACR_PULL_ROLE="AcrPull"
fi

az role assignment create --role "${ACR_PULL_ROLE}" --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 Directは、Microsoft Artifact Registry (MAR) からイメージを直接プルし、ネットワーク分離されません。 Cache は、プライベート ACR からイメージをプルし、ネットワーク分離されています。
--outbound-type none ではクラスターのアウトバウンド接続は設定されないため、これらは自分で設定できます。 block (プレビュー) は、すべての送信接続をブロックします。

必要なパラメーターを指定して az aks create コマンドを実行し、ACR にアクセスする、プライベート リンクに基づくネットワーク分離クラスターを作成します。

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --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 Server VNet 統合

API Server 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 --delegations Microsoft.ContainerService/managedClusters

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

az role assignment create --scope ${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} --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 --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

既存の AKS クラスターを更新する

新しいクラスターを作成するのではなく、既存の AKS クラスターでネットワーク分離を有効にする場合は、az aks update コマンドを使用します。

BYO ACR のプライベート エンドポイントとプライベート DNS ゾーンを作成するときは、既存の仮想ネットワークと既存の AKS クラスターのサブネットを使用します。 適切な ACR プル ロールを kubelet ID に割り当てるときは、既存の 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}

次に、既存のすべてのノード プールを手動で再イメージ化する必要があります。

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

重要

アーティファクト ソースをキャッシュに更新した直後に、クラスターのノード プールを再イメージ化することを忘れないでください。 そうしないと、この機能はクラスターに対して有効になりません。

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

重要

ネットワーク分離クラスター機能を有効にした後は、忘れずにクラスターのノード プールを再イメージ化してください。 そうしないと、この機能はクラスターに対して有効になりません。

Terraform を使用してネットワーク分離クラスターをデプロイする

この Terraform サンプルでは、この記事で前述した AKS マネージド ACR オプションを使用して、ネットワーク分離クラスターをデプロイします。 AzureRM プロバイダーは、このサンプルで使用するすべてのネットワーク分離ブートストラップ設定をまだ公開していないため、このサンプルでは AzAPI プロバイダーを使用して、必要な API バージョンに対してマネージド クラスター リソースをデプロイします。 Bring Your Own (BYO) ACR オプションの Terraform サンプルは現在使用できません。 BYO ACR を使用するには、この記事で前述したAzure CLIガイダンスに従ってください。

このサンプルでは、次のリソースをデプロイします。

  • リソース グループ (Microsoft.Resources/resourceGroups)。
  • ネットワーク分離された AKS クラスター (Microsoft.ContainerService/managedClusters) で、次を使用します。
    • システム割り当てマネージド ID。
    • 1 つの Standard_D2s_v3 ノードを持ち、自動スケールが無効になっている 1 つのシステム ノード プール。
    • azureネットワーク プラグイン。outboundTypenoneに設定されているため、クラスターにはブートストラップ用の送信ネットワーク依存関係がありません。
    • apiServerAccessProfile.enablePrivateClustertrue に設定すると、プライベート リンク ベースのプライベート クラスターが作成されます。
    • bootstrapProfile.artifactSource Cacheに設定されているため、AKS は独自の ACR キャッシュを作成、管理、調整して、Microsoft Artifact Registry (MAR) から直接プルするのではなく、クラスターをブートストラップします。 この記事で前述したように、この ACR を自分で作成または管理する必要はありません。AKS は、ネットワーク分離クラスターで使用されるキャッシュ ルール、プライベート リンク、およびプライベート エンドポイントを処理します。

クラスターは、デプロイ リージョンでサポートされている既定の Kubernetes バージョンで作成されます。 特定のバージョンをピン留めするには、main.tfでクラスターのproperties ブロックにkubernetesVersionを追加し、az aks get-versions コマンドを使用して、リージョンでバージョンが使用可能であることを確認します。

  1. サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。

  2. main.tfという名前のファイルを作成し、次のテスト済みのサンプル構成をコピーします。

    terraform {
      required_version = ">= 1.6.0"
    
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.6"
        }
      }
    }
    
    provider "azapi" {}
    
    resource "random_string" "suffix" {
      length  = 6
      upper   = false
      special = false
    }
    
    locals {
      location            = "westus2"
      resource_group_name = "rg-aks-network-isolated-${random_string.suffix.result}"
      aks_name            = "aks-netisolated-${random_string.suffix.result}"
      dns_prefix          = "aksnetiso${random_string.suffix.result}"
    }
    
    resource "azapi_resource" "resource_group" {
      type     = "Microsoft.Resources/resourceGroups@2024-03-01"
      name     = local.resource_group_name
      location = local.location
    }
    
    resource "azapi_resource" "aks_cluster" {
      type      = "Microsoft.ContainerService/managedClusters@2025-08-01"
      name      = local.aks_name
      parent_id = azapi_resource.resource_group.id
      location  = local.location
    
      identity {
        type = "SystemAssigned"
      }
    
      body = {
        properties = {
          dnsPrefix = local.dns_prefix
          agentPoolProfiles = [
            {
              name              = "systempool"
              count             = 1
              vmSize            = "Standard_D2s_v3"
              mode              = "System"
              osType            = "Linux"
              type              = "VirtualMachineScaleSets"
              enableAutoScaling = false
            }
          ]
          networkProfile = {
            networkPlugin = "azure"
            outboundType  = "none"
          }
          apiServerAccessProfile = {
            enablePrivateCluster = true
          }
          bootstrapProfile = {
            artifactSource = "Cache"
          }
        }
      }
    }
    

Terraform を初期化する

terraform init を実行して、Terraform のデプロイを初期化します。 このコマンドは、このサンプルのリソースを管理するために必要な azapi プロバイダーと random プロバイダーをダウンロードします。

terraform init -upgrade

構成の書式設定と検証

terraform fmtを実行して構成ファイルの書式を設定し、terraform validateして構成が構文的に有効であることを確認します。

terraform fmt
terraform validate

Terraform実行計画を作成する

terraform planを実行して実行プランを作成します。

terraform plan -out main.tfplan

Terraform 実行プランを適用する

terraform applyを実行して、Azure サブスクリプションに実行プランを適用します。

terraform apply main.tfplan

リソース グループと、ネットワーク分離されたプライベート AKS クラスターの作成が完了するまでに数分かかります。

デプロイメントを確認する

このサンプルでは Terraform 出力が定義されていないため、jqterraform show -jsonを使用して、terraform apply完了後に生成されたリソース グループとクラスター名をリソースの状態から取得します。 azapi プロバイダーを使用して両方のリソースを管理し、そのname属性には解決されたリソース名が保持されます。

RESOURCE_GROUP=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.resource_group") | .values.name')
AKS_NAME=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.aks_cluster") | .values.name')

az aks show コマンドを使用して、予想されるネットワーク分離設定でクラスターが作成されたことを確認します。

az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --query "{outboundType:networkProfile.outboundType, artifactSource:bootstrapProfile.artifactSource, privateCluster:apiServerAccessProfile.enablePrivateCluster}"

出力には、noneoutboundType に設定され、CacheartifactSource に設定され、trueprivateCluster に設定されていると表示されており、クラスターがネットワークから分離され、AKS 管理の ACR キャッシュからブートストラップされることが確認できます。

クラスターに接続する

これはプライベート クラスターであるため、ネットワーク通信回線を持つクライアントからクラスターのプライベート エンドポイント (同じ仮想ネットワークまたはピアリングされた仮想ネットワーク内の VM など) に接続するか、クラスターの仮想ネットワークに接続されている場合はAzure Cloud Shellします。 az aks get-credentials コマンドを使用してクラスターの資格情報を取得し、kubectl get nodes コマンドを使用して接続を確認します。

az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
kubectl get nodes

リソースをクリーンアップする

この記事で作成したリソースが不要になった場合は、追加の料金が発生しないように、リソースを削除します。

Warning

terraform destroyを実行すると、リソース グループや AKS クラスターなど、この構成の Terraform 状態ファイルで追跡されているすべてのリソースが削除されます。 破棄する前に計画を慎重に確認し、共有インフラストラクチャまたは運用インフラストラクチャに対して実行しないようにします。

-destroy フラグを指定してterraform planを実行して、Terraform が削除する内容を確認します。

terraform plan -destroy -out main.destroy.tfplan

terraform applyを実行して破棄計画を適用し、このサンプルによって作成されたすべてのリソースを削除します。

terraform apply main.destroy.tfplan

AKS でネットワーク分離クラスターが有効になっていることを検証する

ネットワーク分離クラスター機能が有効になっていることを検証するには、 az aks show コマンドを使用します。

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

次の出力は、 none 送信の種類で構成されたネットワーク分離クラスターを示しています。 outboundTypenoneまたはblockに設定されていること、およびartifactSourceCacheに設定されていることを確認します。 containerRegistryId フィールドは、ブートストラップに使用される ACR を識別します。

{
  "kubernetesVersion": "<major>.<minor>.<patch>",
  "name": "myAKSCluster",
  "type": "Microsoft.ContainerService/ManagedClusters",
  "properties": {
    "networkProfile": {
      "outboundType": "none"
    },
    "bootstrapProfile": {
      "artifactSource": "Cache",
      "containerRegistryId": "/subscriptions/my-subscription-id/resourceGroups/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
    }
  }
}

AKS でネットワーク分離クラスターを無効にする

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 でネットワーク ポリシーを使用して、ポッド間のトラフィックをセキュリティ保護する」を参照してください。