Managed Fleet 名前空間を作成して構成する

適用対象: ✔️ ハブ クラスターを含む Fleet Manager

この記事では、Fleet Manager を使用して、複数のクラスター上の名前空間のリソース クォータ、ネットワーク ポリシー、および委任されたユーザー アクセスを定義するマネージドフリート名前空間を作成および構成する方法について説明します。

アクセス権を持つ既存の Managed Fleet 名前空間を表示またはアクセスする場合は、「 Managed Fleet 名前空間の表示とアクセス」を参照してください。

既知の制限事項

  • Managed Fleet 名前空間が単一クラスターの マネージド Kubernetes 名前空間 を利用する場合、その逆も同様に、所有権が競合する可能性があります。 回避するには、マネージドフリートと Kubernetes 名前空間の両方に対して keep の削除ポリシーを使用します。
  • クラスターは、Managed Fleet 名前空間をホストする Fleet Manager によって管理されるメンバーである必要があります。
  • クラスターには、少なくとも 1.30.0 の Kubernetes バージョンが必要です。 このバージョンより下のクラスター では、 クラスター上のユーザーが配置された Kubernetes リソースを変更できなくなります。
  • Managed Fleet 名前空間スコープに割り当てられた RBAC ロールは、メンバー クラスター上で同じ名前のアンマネージド Kubernetes 名前空間に同等のアクセス権を付与します。

開始する前に

  • Terraform をインストールして構成します。

  • Terraform によって作成されるマネージドフリート名前空間を確認するには、Azure CLIがインストールされている必要があります。 インストールまたはアップグレードする必要には、「Azure CLI のインストール」をご覧ください。

  • マネージドフリート名前空間を確認するには、fleet Azure CLI拡張機能バージョン 1.8.0 以降が必要です。 az extension addコマンドとaz extension updateコマンドを使用して、インストールして最新バージョンに更新できます。

    az extension add --name fleet
    az extension update --name fleet
    
  • ハブ クラスターを備えた Fleet Manager をまだお持ちでない場合、この記事の前半では、Managed Fleet Namespace サンプルとは別の Terraform サンプルと state を使用して、その Fleet Manager を作成します。 既にある場合は、そのリソース グループと Fleet Manager の名前を書き留め、「 Terraform を使用したマネージドフリート名前空間の作成」に進みます。

  • 前提条件の Terraform サンプルでは、Fleet Manager とハブ クラスターのみが作成されます。メンバー クラスターは作成または参加しません。 Managed Fleet 名前空間を作成し、メンバー クラスターを参加させることなくその構成を表示できますが、名前空間が実際にメンバー クラスターにロールアウト (伝達) されていることを確認するには、少なくとも 1 つの AKS クラスターが Fleet に参加している必要があります。 まだない場合は、既存のサポート対象のガイダンスを使用して、少なくとも 1 つの Azure Kubernetes Service (AKS) クラスターを作成してフリートに参加させる方法を参照してください。

  • この記事を完了するには、Azure CLI バージョン 2.78.0 以降がインストールされている必要があります。 インストールまたはアップグレードする必要には、「Azure CLI のインストール」をご覧ください。

  • fleet Azure CLI 拡張機能バージョン 1.8.0 以降が必要です。 az extension addコマンドとaz extension updateコマンドを使用して、インストールして最新バージョンに更新できます。

    # Install the extension
    az extension add --name fleet
    
    # Update the extension
    az extension update --name fleet
    
  • az extension show コマンドを使用して、フリート拡張機能のバージョンが少なくとも 1.8.0 であることを確認します。

    az extension show --name fleet
    
  • サブスクリプション ID、リソース グループ、フリート、フリート メンバーに次の環境変数を設定します。

    export SUBSCRIPTION_ID=<subscription-id>
    export GROUP=<resource-group-name>
    export FLEET=<fleet-name>
    export FLEET_ID=<fleet-id>
    
  • az account set コマンドを使用して、既定の Azure サブスクリプションを設定します。

    az account set --subscription ${SUBSCRIPTION_ID}
    

新しいマネージド フリート名前空間を作成する

az fleet namespace create コマンドを使用して、新しいマネージドフリート名前空間を作成します。

    az fleet namespace create \
        --resource-group $GROUP \
        --fleet-name $FLEET \
        --name my-managed-namespace \ 
        --annotations annotation1=value1 annotation2=value2 \
        --labels team=myTeam label2=value2 \
        --cpu-requests 1m \
        --cpu-limits 4m \
        --memory-requests 1Mi \
        --memory-limits 4Mi \
        --ingress-policy allowAll \
        --egress-policy allowAll \
        --delete-policy keep \
        --adoption-policy never

注

これらの設定は省略可能です。ネットワーク ポリシー、コンピューティング クォータ、削除と導入ポリシー、ラベルと注釈。

ネットワーク ポリシーを使用する場合、割り当てられている Microsoft Entra ID ロールで Microsoft.ContainerService/managedClusters/networking.k8s.io/networkpolicies/write などのAzure Kubernetes Service RBAC Writer アクションを持つユーザーは、Kubernetes API を使用してさらにネットワーク ポリシーを追加できます。

たとえば、管理者がイングレス/エグレスに Deny All ポリシーを適用し、ユーザーが Kubernetes API を介して名前空間の Allow ポリシーを適用した場合、 Allow ポリシーは Deny All ポリシーよりも優先され、名前空間に対するトラフィックのフローが許可されます。 この追加動作は、ネットワーク ポリシーの標準です。

ユーザーまたはグループのアクセス権を割り当てる

Azure RBAC 組み込みロールのいずれかを使用して、メンバー クラスター間で Managed Fleet 名前空間のユーザーにアクセス権を付与できるようになりました。

az role assignment create コマンドを使用してロールの割り当てを作成します。

次の例では、ユーザーにメンバー クラスターに対する Azure Kubernetes Fleet Manager RBAC ライター ロールを、my-managed-namespace マネージド フリート名前空間を受け取る任意のクラスターについて割り当てます。

az role assignment create \
    --role "Azure Kubernetes Fleet Manager RBAC Writer for Member Clusters" \
    --assignee <USER-ENTRA-ID> \
    --scope "$FLEET_ID/managedNamespaces/my-managed-namespace"

メンバー クラスターを追加する

必要なメンバー クラスター名の一覧を指定することで、マネージド名前空間をデプロイするメンバー クラスターを制御できます。

az fleet namespace create パラメーターで --member-cluster-names コマンドを使用して、マネージド名前空間をデプロイするメンバー クラスターの完全な一覧を指定します。 マネージド名前空間は、リスト内のすべてのクラスターに伝達されます。

この例では、マネージド名前空間が contoso-prd-01-fm および contoso-prd-02-fmにデプロイされます。

az fleet namespace create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name my-managed-namespace \
    --member-cluster-names contoso-prd-01-fm contoso-prd-02-fm

メンバー クラスターを削除する

マネージド フリート名前空間からメンバー クラスターを削除する場合、その名前空間を適用するメンバー クラスターの一覧から除外します。

az fleet namespace create パラメーターで --member-cluster-names コマンドを使用して、マネージド名前空間を維持するメンバー クラスターの一覧を指定します。 マネージド名前空間は、一覧から除外されたすべてのクラスターから削除されます。

この例では、マネージド名前空間が contoso-prd-02-fmから削除されます。

az fleet namespace create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name my-managed-namespace \
    --member-cluster-names contoso-prd-01-fm

既存のマネージドフリート名前空間を構成する

既存の Managed Fleet 名前空間のネットワーク ポリシー、リソース クォータ、ラベル、注釈を変更するには、 az fleet namespace create コマンドを使用してパラメーター値を更新します。 このコマンドはアップサート操作を実行し、名前空間が既に存在する場合は更新します。

Important

既存のマネージド名前空間を更新するときは、変更しない場合でも、保持するすべてのパラメーターを指定する必要があります。 省略したパラメーターはすべて既定値にリセットされます。 これには、ネットワーク ポリシー、リソース クォータ、ラベル、注釈、削除ポリシー、導入ポリシー、メンバー クラスター名が含まれます。

次の例では、既存のマネージド名前空間のネットワーク ポリシー、リソース クォータ、ラベル、注釈を更新します。

az fleet namespace create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name my-managed-namespace \
    --annotations "updated-annotation=new-value" \
    --labels "team=updatedTeam environment=production" \
    --cpu-requests 1000m \
    --cpu-limits 2000m \
    --memory-requests 1000Mi \
    --memory-limits 1000Mi \
    --ingress-policy allowAll \
    --egress-policy allowAll \
    --delete-policy keep \
    --adoption-policy never \
    --member-cluster-names contoso-prd-01-fm contoso-prd-02-fm

マネージド フリート名前空間の構成を表示する

az fleet namespace show コマンドを使用して、特定のマネージドフリート名前空間の詳細を表示します。

az fleet namespace show \ 
    --resource-group $GROUP \ 
    --fleet-name $FLEET \ 
    --name my-managed-namespace \ 
    -o table 

出力は、次の出力例のようになります。

AdoptionPolicy  DeletePolicy   ETag                                    Location   Name                  ProvisioningState   ResourceGroup
--------------  ------------   -------------------------------------   --------   --------------------  -----------------   -------------
Always          Delete         "aaaaaaaa-0b0b-1c1c-2d2d-333333333333   westus2    my-managed-namespace  Succeeded           test-rg

マネージドフリート名前空間を削除する

az fleet namespace delete コマンドを使用してマネージド フリート名前空間を削除します。

az fleet namespace delete \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name my-managed-namespace 

Warnung

DeletePolicyが delete に設定されている Fleet マネージド名前空間を削除することは、永続的なアクションです。 不明な場合は、名前空間を保持するようにポリシーを更新して keep する必要があります。

未解決のアクセス許可を回避するために、Azure RBAC の割り当ては常に削除されます。

新しいマネージド フリート名前空間を作成する

新しいマネージドフリート名前空間は、Fleet Manager 内または Kubernetes センターから作成できます。

フリート マネージャーで開始:

  • Azure portal で、Azure Kubernetes Fleet Manager リソースに移動します。
  • 左側のメニューの [ フリート リソース] で、[ 名前空間] を選択します。
  • メニューから [+ 作成] を選択した後、[マネージド フリート ネームスペース] を選択します。

Azure Kubernetes Fleet Manager でマネージド フリート名前空間を作成するための Azure portal メニューのスクリーンショット。

Kubernetes の中央から開始

  • Azure portal で Kubernetes Center - マネージド名前空間 を開きます。
  • メニューから [+ 作成] を選択した後、[マネージド フリート ネームスペース] を選択します。
  • サブスクリプションと Fleet Manager インスタンスを選択します。

マネージドフリート名前空間を作成するための Azure portal Kubernetes Center メニューのスクリーンショット。

  • [スコープ] に次のいずれかのオプションを選択します。
    • 新規 - Fleet Manager ハブ クラスターに存在しない新しい Kubernetes 名前空間を作成します。 新しい名前空間の名前を入力 します 。
    • マネージドに変換 する - Fleet Manager ハブ クラスターで既存の Kubernetes 名前空間を使用します。 Fleet Manager ハブ クラスターの名前空間一覧から名前空間を選択します。

新しい Managed Fleet 名前空間に対してプロジェクトの詳細が完了した [基本] タブを示す Azure portal のスクリーンショット。

ユーザーまたはグループのアクセス権を割り当てる

配布先のクラスターでマネージドフリート名前空間にアクセスする Microsoft Entra ユーザーとグループを選択します。

新しいマネージド フリート名前空間に対して完了したアクセスの詳細を示す Azure portal のスクリーンショット。

注

このステップはオプションです。 ユーザーまたはグループを割り当てずに、Managed Fleet 名前空間を作成して配布できます。 これにより、アクセス権をすぐに付与せずに名前空間を配布できます。

ネットワーク ポリシーとコンピューティング クォータを追加する

分散する各クラスターの名前空間との間のネットワーク トラフィックのフローを制御し、名前空間の CPU とメモリ のリソース クォータを定義します。

新しいマネージドフリート名前空間の完成したネットワーク ポリシーとコンピューティング クォータを示す Azure portal のスクリーンショット。

注

これらの設定は省略可能です。 ネットワーク ポリシーやクォータ制御を適用せずに、Managed Fleet 名前空間を作成して配布できます。

割り当てられている Microsoft Entra ID ロールに対する Microsoft.ContainerService/managedClusters/networking.k8s.io/networkpolicies/write アクション ( Azure Kubernetes Service RBAC Writer など) を持つユーザーは、Kubernetes API を使用してさらにネットワーク ポリシーを追加できます。

たとえば、管理者がイングレス/エグレスに Deny All ポリシーを適用し、ユーザーが Kubernetes API を介して名前空間の Allow ポリシーを適用した場合、 Allow ポリシーは Deny All ポリシーよりも優先され、名前空間に対するトラフィックのフローが許可されます。 この追加動作は、ネットワーク ポリシーの標準です。

メンバー クラスターの選択

マネージド名前空間を配布するメンバー クラスターを定義するには、次のように追加します。

  • メニューから [ + 追加] を選択します。
  • [ メンバー クラスターの選択 ] ダイアログで、メンバー クラスターを検索し、チェック ボックスをオンにして選択します。
  • 最後に、[ 選択 ] を選択してメンバー クラスターを追加します。

新しいマネージドフリート名前空間をホストするために選択された 2 つのメンバー クラスターを示す Azure portal のスクリーンショット。

注

このステップはオプションです。 メンバー クラスターを指定しない場合、Managed Fleet 名前空間は Fleet Manager ハブ クラスターにのみデプロイされます。 メンバー クラスターは後で追加できます。

ラベル、注釈、タグを設定する

オプションの Kubernetes ラベルと注釈、および自動化とリソース管理に使用できるメタデータを提供する Azure Resource Manager (ARM) タグを定義します。

新しいマネージドフリート名前空間のラベルと注釈の設定を示す Azure portal のスクリーンショット。

注

このステップはオプションです。 ラベル、注釈、タグは後で管理できます。

マネージド フリート名前空間を作成する

新しい Managed Fleet 名前空間のすべてのプロパティを構成したら、[ 作成] を選択して、名前空間を作成する前に詳細を確認できます。

Azure Resource Manager デプロイがすぐに開始され、Fleet Manager ワークロードの配置が開始され、選択したクラスターに名前空間が配布されます。

デプロイが完了すると、Fleet Manager の名前空間の一覧にマネージドフリート名前空間が表示されます。

ハブ クラスター上の他の名前空間と共に一覧表示された新しいマネージドフリート名前空間を含む Azure portal のスクリーンショット。

クラスター間での Kubernetes 名前空間のロールアウトを確認するには、 リソース配置を使用し、Managed Fleet 名前空間と同じ名前のリソース配置を探します。

新しい Managed Fleet 名前空間のリソース配置の状態を示す Azure portal のスクリーンショット。

既存のマネージドフリート名前空間を構成する

マネージドフリート名前空間は、Fleet Manager 内または Kubernetes センターから見つけることができます。

フリート マネージャーで開始:

  • Azure portal で、Azure Kubernetes Fleet Manager リソースに移動します。
  • 左側のメニューの [ フリート リソース] で、[ 名前空間] を選択します。

Kubernetes の中央から開始

構成の変更

Managed Fleet 名前空間の概要画面で適切な項目の横にある 編集 を選択して、ネットワーク ポリシー、リソース クォータ、ラベル、注釈、タグを変更します。

ラベル、注釈、またはタグの横にある 編集 を選択すると、ダイアログ ボックスが開き、これら 3 つの項目のいずれかを変更できます。

ネットワーク ポリシーまたはリソース クォータ オプションの横にある 編集 を選択すると、ダイアログ ボックスが開き、これらの項目を変更できます。

マネージド フリート名前空間の概要画面を示す Azure portal のスクリーンショット。編集オプションが赤いボックスで強調表示されています。

ユーザーまたはグループのアクセスを変更する

Managed Fleet 名前空間は Azure Resource Manager (ARM) リソースであるため、ユーザーとグループのアクセスの管理は、管理フリート名前空間の概要画面の左側ナビゲーションで アクセス制御 (IAM) を選択することで実現できます。

メンバー クラスターを変更する

Managed Fleet 名前空間の概要で、左側のナビゲーションで [メンバー クラスター ] を選択します。

メンバー クラスターを削除するには:

  • 行の左側にあるチェック ボックスをオンにして、削除するクラスターを選択します。
  • 上部のナビゲーションで、[ 削除] を選択します。
  • アクションを確認し、[ 削除] を選択します。

メンバー クラスターを追加するには:

  • メニューから [ + 追加] を選択します。
  • [ メンバー クラスターの追加 ] ダイアログで、メンバー クラスターを検索し、チェック ボックスをオンにして選択します。
  • 最後に、[ 追加] を選択してメンバー クラスターを追加します。

マネージドフリート名前空間から削除する準備ができている 1 つのメンバー クラスターが選択されていることを示す Azure portal のスクリーンショット。

Managed Fleet 名前空間をホストしているクラスターが変更されると、概要が更新され、名前空間をアクティブにホストしているクラスターが表示されます。

マネージドフリート名前空間を削除する

管理対象フリート名前空間の概要で、上部のナビゲーションで 削除 を選択します。

[ 管理対象フリート名前空間の削除 ] の確認で、必要なオプションを選択します。

  • 名前空間を保持し、管理機能を削除 します。Managed Fleet 名前空間は標準の Kubernetes 名前空間に変換され、Fleet Manager ハブ クラスターとメンバー クラスターに残りますが、Azure Resource Manager (ARM) によって管理されなくなります。
  • 名前空間と関連するすべてのリソースを削除 します。Managed Fleet 名前空間 ARM リソースと、Fleet Manager ハブ クラスターとメンバー クラスターの両方の Kubernetes 名前空間が削除されます。

Warnung

名前空間と関連付けられているすべてのリソースを削除することは、永続的なアクションです。 不明な場合は、名前空間を保持することを選択する必要があります。

どちらの場合も、残されたアクセス許可を防ぐために、Azure RBAC 割り当てが削除されます。

新しいマネージド フリート名前空間を作成する

このセクションの Terraform サンプルは、それぞれ独自の Terraform 状態を持つ 2 つのディレクトリに分割されています。これは、ハブ クラスターで Fleet Manager を作成する前提条件サンプルと、既存の Fleet Manager にマネージドフリート名前空間を作成するシナリオ サンプルです。 Fleet Manager と Managed Fleet 名前空間を別々の状態に保つことで、ハブ クラスターを持つ既存の Fleet Manager に対してマネージドフリート名前空間を作成できます。 このセットアップは、Terraform を使用して Fleet Manager を作成したかどうかに関係なく機能します。 フリートマネージャーやその他のマネージドフリート名前空間に影響を与えることなく、マネージドフリート名前空間を破棄できます。

ハブ クラスターを使用して Fleet Manager を作成する

ハブ クラスターを持つ Fleet Manager が既にある場合は、「Terraform を使用して マネージドフリート名前空間を作成 する」に進み、そのセクションでそのリソース グループと Fleet Manager 名を使用します。

  1. サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。 各サンプルは独自の Terraform 状態を保持するため、この記事で後述する Managed Fleet 名前空間サンプルに使用するディレクトリとは別のディレクトリを使用します。

  2. providers.tf という名前のファイルを作成し、次のコードを挿入します。

    terraform {
      required_version = ">= 1.5.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    provider "azapi" {}
    
  3. variables.tf という名前のファイルを作成し、次のコードを挿入します。

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group"
    }
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    variable "fleet_name" {
      type        = string
      description = "Name of the fleet resource. If left blank, this value is randomly generated."
      default     = ""
    }
    
  4. main.tf という名前のファイルを作成し、次のコードを挿入します。

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "fleet_rg" {
      name     = random_pet.rg_name.id
      location = var.resource_group_location
    }
    
    resource "random_string" "fleet_name" {
      length  = 54
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    locals {
      fleet_name = coalesce(var.fleet_name != "" ? var.fleet_name : null, random_string.fleet_name.result)
    }
    
    # A fleet with a hub cluster is required for features such as managed namespaces,
    # which the plain azurerm_kubernetes_fleet_manager resource cannot provision because
    # its hub_profile attribute is deprecated and is no longer sent to the API.
    resource "azapi_resource" "fleet" {
      type      = "Microsoft.ContainerService/fleets@2025-03-01"
      name      = local.fleet_name
      location  = azurerm_resource_group.fleet_rg.location
      parent_id = azurerm_resource_group.fleet_rg.id
    
      body = {
        properties = {
          hubProfile = {
            dnsPrefix = local.fleet_name
          }
        }
      }
    
      identity {
        type = "SystemAssigned"
      }
    
      response_export_values = ["name"]
    }
    
  5. outputs.tf という名前のファイルを作成し、次のコードを挿入します。

    output "resource_group_name" {
      value = azurerm_resource_group.fleet_rg.name
    }
    
    output "fleet_name" {
      value = azapi_resource.fleet.name
    }
    

このサンプルでは、azurerm プロバイダーのhub_profile属性が非推奨になり、Fleet API が受け入れなくなったため、azurerm_kubernetes_fleet_managerではなく、azapi_resource リソースの種類を使用して、ハブ クラスターを含むリソース グループと Fleet Manager を作成します。 fleet_name変数を設定しないと、Terraform によってランダムな名前が生成されます。

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

terraform init

terraform fmt を実行して、構成ファイルを一貫して書式設定します。

terraform fmt

terraform 検証を実行して、構成ファイルが構文的に有効であることを確認します。

terraform validate

実行計画を作成するために terraform plan を実行してください。

terraform plan -out main.tfplan

クラウドインフラストラクチャに対して実行計画を適用するには、terraform apply を実行してください。

terraform apply main.tfplan

Terraform の出力からリソース グループと Fleet Manager の名前を保存します。 これらの値は、Managed Fleet 名前空間のサンプルに必要です。

resource_group_name=$(terraform output -raw resource_group_name)
fleet_manager_name=$(terraform output -raw fleet_name)

このサンプルでは、メンバークラスターを作成したり、フリートに参加させたりすることはありません。 az fleet member list コマンドを使用して、Fleet Manager にメンバー クラスターが既に参加しているかどうかを確認します。

az fleet member list \
    --resource-group $resource_group_name \
    --fleet-name $fleet_manager_name \
    -o table

このコマンドでメンバーが返されない場合でも、次のセクションを完了してマネージドフリート名前空間を作成し、その構成を表示できますが、 少なくとも 1 つの AKS クラスターを作成してフリートに参加するまで、メンバー クラスターにロールアウトされることを確認することはできません。

Terraform を使用してマネージドフリート名前空間を作成する

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

  2. providers.tf という名前のファイルを作成し、次のコードを挿入します。

    terraform {
      required_version = ">= 1.5.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    provider "azapi" {}
    
  3. variables.tf という名前のファイルを作成し、次のコードを挿入します。

    variable "resource_group_name" {
      type        = string
      description = "Name of the resource group that contains the Fleet Manager."
    }
    
    variable "fleet_name" {
      type        = string
      description = "Name of the existing Azure Kubernetes Fleet Manager."
    }
    
    variable "managed_namespace_name" {
      type        = string
      description = "Name of the Managed Fleet Namespace."
      default     = "platform-ns"
    
      validation {
        condition     = can(regex("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", var.managed_namespace_name)) && length(var.managed_namespace_name) <= 63
        error_message = "The managed namespace name must be 1-63 characters, use lowercase letters, numbers, or hyphens, and start and end with a lowercase letter or number."
      }
    }
    
    variable "tags" {
      type        = map(string)
      description = "Tags to apply to the Managed Fleet Namespace."
      default = {
        environment = "demo"
        managed_by  = "terraform"
      }
    }
    
  4. main.tf という名前のファイルを作成し、次のコードを挿入します。

    data "azurerm_client_config" "current" {}
    
    data "azurerm_resource_group" "fleet_rg" {
      name = var.resource_group_name
    }
    
    locals {
      fleet_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}/resourceGroups/${var.resource_group_name}/providers/Microsoft.ContainerService/fleets/${var.fleet_name}"
    }
    
    resource "azapi_resource" "managed_fleet_namespace" {
      type      = "Microsoft.ContainerService/fleets/managedNamespaces@2025-08-01-preview"
      name      = var.managed_namespace_name
      parent_id = local.fleet_id
      location  = data.azurerm_resource_group.fleet_rg.location
      tags      = var.tags
    
      body = {
        properties = {
          adoptionPolicy = "Never"
          deletePolicy   = "Keep"
          managedNamespaceProperties = {
            labels = {
              team        = "platform"
              environment = "demo"
            }
            annotations = {
              owner                          = "aks-fleet-demo"
              "app.kubernetes.io/managed-by" = "terraform"
            }
            defaultNetworkPolicy = {
              ingress = "AllowAll"
              egress  = "AllowAll"
            }
            defaultResourceQuota = {
              cpuRequest    = "100m"
              cpuLimit      = "500m"
              memoryRequest = "128Mi"
              memoryLimit   = "512Mi"
            }
          }
          propagationPolicy = {
            type = "Placement"
            placementProfile = {
              defaultClusterResourcePlacement = {
                policy = {
                  placementType = "PickAll"
                }
              }
            }
          }
        }
      }
    }
    
    
    
  5. outputs.tf という名前のファイルを作成し、次のコードを挿入します。

    output "managed_fleet_namespace_id" {
      description = "Resource ID of the Managed Fleet Namespace."
      value       = azapi_resource.managed_fleet_namespace.id
    }
    
  6. terraform.tfvars.example という名前のファイルを作成し、次のコードを挿入します。

    resource_group_name    = "<resource-group-name>"
    fleet_name             = "<fleet-manager-name>"
    managed_namespace_name = "platform-ns"
    
  7. terraform.tfvars.exampleを同じディレクトリ内のterraform.tfvarsにコピーします。 resource_group_nameとfleet_nameは、前のセクションで保存した値 (または既存の Fleet Manager の値) に設定します。 managed_namespace_name名前空間に必要な名前を設定します。

    cp terraform.tfvars.example terraform.tfvars
    

このサンプルでは、独自の Fleet Manager は作成されません。 代わりに、 azurerm_resource_group と azurerm_client_config データ ソースを使用して、リソース グループと現在のサブスクリプションを検索します。 次に、マネージドフリート名前空間の親として使用するために、 fleet_name 変数に名前付けされた既存の Fleet Manager のリソース ID を構築します。 このサンプルでは、2 つのサンプル間で Terraform の状態を共有することなく、前提条件の状態、あるいはハブ クラスターを持つ既存のフリート マネージャーから、フリート マネージャーの情報を取得する仕組みとなっています。

このサンプルでは、Microsoft.ContainerService/fleets/managedNamespacesのプレビュー API バージョン2025-08-01-previewazapi_resourceリソースの種類を使用して名前空間を作成します。これは、このリソースの種類にネイティブ azurerm リソースがないためです。 次のプロパティは、 main.tf でハードコーディングされ、変数として公開されません。 変更するには、 body.properties ブロックを直接編集します。

  • adoptionPolicyは Never に設定され、deletePolicyは Keep に設定され、この記事で前述したAzure CLIの既定値と一致します。
  • managedNamespaceProperties.labels は、Kubernetes ラベル team=platform および environment=demoを設定します。
  • managedNamespaceProperties.annotations は、Kubernetes 注釈 owner=aks-fleet-demo と app.kubernetes.io/managed-by=terraformを設定します。
  • managedNamespaceProperties.defaultNetworkPolicy は、 ingress と egress の両方を AllowAllに設定します。
  • managedNamespaceProperties.defaultResourceQuota は、 cpuRequest=100m、 cpuLimit=500m、 memoryRequest=128Mi、および memoryLimit=512Miを設定します。
  • propagationPolicy.placementProfile.defaultClusterResourcePlacement.policy.placementType は PickAllに設定されているため、名前空間は現在 Fleet に参加しているすべてのメンバー クラスターに伝達されます。 Azure CLIの --member-cluster-names パラメーターとは異なり、このサンプルでは、特定の名前付きメンバー クラスターをターゲットにする方法は公開されていません。 配置対象をクラスターのサブセットに限定するには、このページの Azure CLI または Azure portal の切り替えを使用するか、Microsoft.ContainerService fleets ARM template reference に従って placementProfile 内の main.tf ブロックを拡張します。

名前空間自体の Kubernetes ラベルではなく、Managed Fleet 名前空間リソースの Azure Resource Manager (ARM) タグにマップされる唯一の変数は、tagsです。 これは任意で、設定しない場合、{ environment = "demo", managed_by = "terraform" } では既定で variables.tf になります。 サンプルの terraform.tfvars.example には tagsが含まれていないため、既定値をオーバーライドする場合にのみ、 terraform.tfvars ファイルに追加します。

terraform init を実行して、Terraform のデプロイを初期化します。

terraform init

terraform fmt を実行して、構成ファイルを一貫して書式設定します。

terraform fmt

terraform 検証を実行して、構成ファイルが構文的に有効であることを確認します。

terraform validate

実行計画を作成するために terraform plan を実行してください。

terraform plan -out main.tfplan

クラウドインフラストラクチャに対して実行計画を適用するには、terraform apply を実行してください。

terraform apply main.tfplan

ユーザーまたはグループのアクセス権を割り当てる

Terraform では、このサンプルAzure RBAC ロールの割り当ては管理されません。 az role assignment create コマンドを使用して、メンバー クラスター全体でマネージドフリート名前空間へのアクセス権をユーザーに付与します。 スコープとして Terraform 出力を使用します。

managed_namespace_id=$(terraform output -raw managed_fleet_namespace_id)
az role assignment create \
    --role "Azure Kubernetes Fleet Manager RBAC Writer for Member Clusters" \
    --assignee <USER-ENTRA-ID> \
    --scope "$managed_namespace_id"

メンバー クラスターを追加または削除する

サンプルの propagationPolicy は PickAllを使用するため、名前空間は常に Fleet のすべての現在のメンバー クラスターに伝達されます。 Fleet にメンバー クラスターを追加すると、そのクラスターに名前空間が自動的に追加され、Fleet からメンバー クラスターが削除されると、そのクラスターから自動的に名前空間が削除されます。 このサンプルでは、Azure CLIの --member-cluster-names パラメーターの場合と同様に、メンバー クラスター名の特定のリストをターゲットにすることはできません。 特定のメンバー クラスターを選択する必要がある場合は、代わりにこのページのAzure CLIまたはAzure ポータルのピボットを使用します。

既存のマネージドフリート名前空間を構成する

Terraform は、 azapi_resource 型のアップサートを実行するため、サンプルを変更して再適用することで、既存のマネージドフリート名前空間を更新できます。

  • ARM タグを変更するには、terraform.tfvarsでtags変数を追加または更新します (省略可能であり、terraform.tfvars.exampleには含まれません)。
  • Kubernetes ラベル、注釈、ネットワーク ポリシー、またはリソース クォータを変更するには、main.tfの managedNamespaceProperties ブロック内の対応する値を編集します。 サンプルでは、これらの設定は変数として公開されません。

変更を行った後、マネージドフリート名前空間ディレクトリで terraform plan -out main.tfplan と terraform apply main.tfplan を再実行します。

マネージド フリート名前空間の構成を表示する

Terraform の出力は、Managed Fleet 名前空間のリソース ID のみを返します。 ID からリソース グループ、フリート マネージャー、および名前空間の名前を抽出します。 次に、 az fleet namespace show コマンドを使用して、名前空間の詳細を表示します。

managed_namespace_id=$(terraform output -raw managed_fleet_namespace_id)
resource_group_name=$(echo $managed_namespace_id | cut -d'/' -f5)
fleet_manager_name=$(echo $managed_namespace_id | cut -d'/' -f9)
managed_namespace_name=$(echo $managed_namespace_id | cut -d'/' -f11)
az fleet namespace show \
    --resource-group $resource_group_name \
    --fleet-name $fleet_manager_name \
    --name $managed_namespace_name \
    -o table

メンバー クラスター間での名前空間のロールアウトを確認するには、 リソース配置を使用し、Managed Fleet 名前空間と同じ名前のリソース配置を探します。 az fleet namespace showを使用して名前空間の構成を確認する場合、メンバー クラスターを Fleet に参加させる必要はありませんが、ロールアウトまたは配置の状態を確認するには、少なくとも 1 つのメンバー クラスターが参加している必要があります。 まだ作成していない場合は、まず「少なくとも 1 つの Azure Kubernetes Service (AKS) クラスターを作成し、フリートに参加させる」を参照してください。

マネージドフリート名前空間を削除する

その Managed Fleet Namespace が属する Fleet Manager を削除する前に、Managed Fleet Namespace を削除してください。

Managed Fleet 名前空間サンプルを含むディレクトリで、-destroy フラグを指定して terraform プランを実行し、破棄実行プランを作成します。

terraform plan -destroy -out main.destroy.tfplan

terraform apply を実行して破棄計画を適用します。

terraform apply main.destroy.tfplan

Warnung

DeleteのdeletePolicyで構成されたマネージドフリート名前空間を削除することは永続的なアクションです。 このサンプルではdeletePolicyをKeepに設定するため、ARM リソースが破棄された後も Kubernetes 名前空間は Fleet Manager ハブ クラスターとメンバー クラスター上に残りますが、Azure Resource Managerによって管理されなくなります。 代わりに名前空間をどこでも削除する場合は、リソースを破棄する前に、deletePolicyを main.tf にDeleteし、再適用するように変更します。

Managed Fleet Namespace をスコープとする Azure RBAC の割り当ては、不要なアクセス許可が残存しないよう、常に削除されます。

この記事に対してのみハブ クラスターの前提条件サンプルを含む Fleet Manager をデプロイし、それ以外の場合は必要ない場合は、そのサンプルのディレクトリに切り替えて破棄します。

terraform plan -destroy -out main.destroy.tfplan
terraform apply main.destroy.tfplan

Warnung

このコマンドは、Fleet Manager だけでなく、前提条件のサンプルによって作成された Fleet Manager、そのハブ クラスター、およびリソース グループを削除します。 このコマンドを実行する前に、リソース グループに保持する他のリソースが含まれていないことを確認し、他の Managed Fleet 名前空間またはメンバー クラスターが Fleet Manager に依存していないことを確認します。

次のステップ