Azure Kubernetes Fleet Manager リソース配置を使用して、複数のクラスターにクラスター スコープのリソースをデプロイする

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

Azure Kubernetes Fleet Manager のリソース配置により、名前空間とその子リソースを含むクラスター スコープのリソースを、フリート内の複数のクラスターに分散して同期できます。 この機能を使用すると、インフラストラクチャ全体で一貫したリソース構成を確保し、手動によるオーバーヘッドを減らし、単一の信頼できるソースで大規模に複雑なワークロードを管理できるため、マルチクラスターのデプロイが簡素化されます。 この記事では、 ClusterResourcePlacement を使用して名前空間とそのワークロードをメンバー クラスターに配布する方法について説明します。

名前空間内に個々のリソースを分散するには、名前空間 スコープのリソース配置に関するドキュメントを参照してください。

この記事の手順は、Azure ポータルまたはAzure CLIを使用して実行できます。

Note

Fleet Manager のリソース配置は、AKS とAzure Arc対応 Kubernetes クラスターで使用できます。

始める前の準備

名前空間とそのリソースをメンバー クラスターに配布する

DeploymentServiceを使用して、フリート内のすべてのクラスターにデプロイする単純なシナリオを使用します。 Fleet Manager ハブ クラスターに名前空間を作成し、それにワークロードを追加してから、 ClusterResourcePlacement を使用して、 PickAll 配置ポリシーを使用して、名前空間とそのすべての内容をすべてのメンバー クラスターに配布します。

  1. サブスクリプション ID、リソース グループ、Kubernetes Fleet リソースのための次の環境変数を設定します。

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

    az account set \
        --subscription ${SUBSCRIPTION_ID}
    
  3. [az fleet get-credentials][az-fleet-get-credentials] コマンドを使用して、Kubernetes Fleet ハブ クラスターの kubeconfig ファイルを取得します。

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

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

    Merged "hub" as current context in /home/fleet/.kube/config
    

    Note

    フリートがハブレスであることを示すメッセージで InvalidHubOperation の種類のエラーが発生した場合は、ハブ クラスターを追加します。 詳細については、「 アップグレード ハブ クラスターの種類」を参照してください。

  4. ハブ クラスターに名前空間を作成します。

    kubectl create namespace test-app
    
  5. 次の YAML を test-workload.yamlとして保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: test-app
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    
  6. kubectlを使用して、テスト ワークロードを Fleet Manager ハブ クラスターにステージングします。

    kubectl apply -f test-workload.yaml
    
  7. 次の YAML を crp-distribute-workload.yamlとして保存します。

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: distribute-test-app
    spec:
      resourceSelectors:
        - group: ""
          kind: Namespace
          version: v1          
          name: test-app
      policy:
        placementType: PickAll
    
  8. 配置マニフェストを Fleet Manager ハブ クラスターに適用します。

    kubectl apply -f crp-distribute-workload.yaml
    

    Note

    リソースのロールアウトは、マニフェストが適用されるとすぐに開始されます。 暗黙的な RollingUpdate 戦略が使用されます。 ロールアウトをさらに制御する方法については、 リソース配置のロールアウト戦略の定義を参照してください。

  9. リソースの配置の進行状況を確認します。

kubectl get clusterresourceplacement distribute-test-app

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

NAME                   GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
distribute-test-app    2     True        2              True      2            10s
  1. 配置の詳細を表示します。
kubectl describe clusterresourceplacement distribute-test-app

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

Name:         distribute-test-app
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  Creation Timestamp:  2024-04-01T18:55:31Z
  Finalizers:
    kubernetes-fleet.io/crp-cleanup
    kubernetes-fleet.io/scheduler-cleanup
  Generation:        2
  Resource Version:  6949
  UID:               815b1d81-61ae-4fb1-a2b1-06794be3f986
Spec:
  Policy:
    Placement Type:  PickAll
  Resource Selectors:
    Group:                 
    Kind:                  Namespace
    Name:                  test-app
    Version:               v1
  Revision History Limit:  10
  Strategy:
    Type:  RollingUpdate
Status:
  Conditions:
    Last Transition Time:   2024-04-01T18:55:31Z
    Message:                found all the clusters needed as specified by the scheduling policy
    Observed Generation:    2
    Reason:                 SchedulingPolicyFulfilled
    Status:                 True
    Type:                   ClusterResourcePlacementScheduled
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                All 3 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:    2
    Reason:                 SynchronizeSucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementSynchronized
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                Successfully applied resources to 3 member clusters
    Observed Generation:    2
    Reason:                 ApplySucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementApplied
  Observed Resource Index:  0
  Placement Statuses:
    Cluster Name:  membercluster1
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster2
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster3
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster3 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:     Namespace
    Name:     my-namespace
    Version:  v1
Events:
  Type    Reason                     Age   From                                   Message
  ----    ------                     ----  ----                                   -------
  Normal  PlacementScheduleSuccess   108s  cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       103s  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  103s  cluster-resource-placement-controller  Resources have been applied to the selected clusters
  1. Azure ポータルで、Fleet Manager に移動します。

  2. サービス メニューの [フリート リソース] で、[名前空間] >[+ 作成] を選択します。

    Note

    フリート リソースが表示されない場合は、Fleet Manager にハブ クラスターがありません。 追加方法の詳細については、 アップグレード ハブ クラスターの種類に関する説明を参照してください。

  3. メニューで [ 名前空間] を選択し、[ 名前] を入力して、[ 作成] を選択します。

    Fleet Manager ハブ クラスターに作成されている test-app という名前の名前空間を示すAzure ポータルのスクリーンショット。

    しばらくすると、ページが更新され、Fleet Manager ハブ クラスターの名前空間の一覧に名前空間が表示されます。 これで、メンバー クラスター間で配布するリソースをホストする準備ができました。

  4. 名前空間の一覧の上部にある [+ 作成>YAML を適用する] を選択し、次のサンプルを使用します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: test-app
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    

    次の図に示すように、サンプルをコピーして貼り付け、一度に 1 つずつ適用します。

    Azure ポータルのスクリーンショット。Fleet Manager ハブ クラスターに適用する準備ができているデプロイが設定された [YAML で適用] ダイアログが表示されています。

    これで、名前空間とそのワークロードをメンバー クラスターに配布する準備ができました。 デプロイとサービスは、Fleet Manager ハブ クラスターではスケジュールされていません。

  5. [サービス] メニューの [ フリート リソース] で、[ リソースの配置>+ 作成] を選択します。

  6. [基本] タブで次のオプションを構成します。

    • [ 配置の詳細] に、配置の名前を入力します。

    • [ リソースの詳細] で、[ スコープ]クラスター スコープ のままにし、配布するリソースのグループ バージョンの種類 (GVK) と名前を入力します。 このサンプルでは、次の値を使用します。

      group: ""
      kind: Namespace
      version: v1          
      name: test-app
      
    • [ メンバー クラスターの選択] で、[ 配置の種類 ] で [ すべてのクラスター] を選択します。

    • [ロールアウト]では、[ローリング アップデート]戦略を選択したままにします。

    Azure ポータルのスクリーンショット。test-app と呼ばれる名前空間のクラスター スコープのリソース配置の完了した [基本] タブが表示されています。

  7. [ 次へ ] を選択して、結果の ClusterResourcePlacement マニフェストを確認します。 必要に応じてマニフェストを変更するか、 検証 (ドライ ラン) オプションを使用して検証するか、[ 確認と作成 ] を選択して最終確認に進むことができます。

    Azure ポータルのスクリーンショット。テスト アプリと呼ばれる名前空間に対するクラスター スコープのリソース配置に対するドライ ラン検証が成功した [Review YAML]\(YAML の確認\) タブが表示されています。

  8. [ 作成] を選択すると、名前空間の配布がすぐに開始されます。

    test-app と呼ばれる名前空間のクラスター スコープのリソース配置の [確認と作成] タブを示すAzure ポータルのスクリーンショット。

    Note

    選択した RollingUpdate 戦略を使用してリソースの配置を適用すると、リソースのロールアウトが直ちに開始されます。 ロールアウトをさらに制御する方法については、 リソース配置のロールアウト戦略の定義を参照してください。

  9. ページが更新され、[ リソース 配置] リストに新しく作成された配置が表示されます。 選択されたクラスターの数と、フリートスケジューラが配置ポリシーを満たせるかどうかを示します。

    Azure ポータルのスクリーンショット。リソース配置の一覧に、distribute-test-app という 1 つのリソース配置が表示されています。

  10. 一覧で配置名を選択して、配置のロールアウトの状態を表示します。 個々のクラスターを選択して、そのクラスターでのリソースのロールアウトを表示します。

    Azure ポータルのスクリーンショット。distribute-test-app と呼ばれるリソース配置の詳細なロールアウト情報が示されています。

選択した Kubernetes クラスターで、デプロイおよび運用可能な名前空間、デプロイ、およびサービスを見つけます。

配置を削除してリソースを削除する

Fleet Manager ハブ クラスター上のリソース配置を削除すると、選択したメンバー クラスターから分散リソースが削除されます。

kubectl delete clusterresourceplacement distribute-test-app
  1. サービス メニューの [Fleet リソース] の下で、[リソースの配置] を選択します。

  2. リソースの配置の一覧で、配置を選択し、[削除] を選択 します

  3. [削除] で、正しい配置を選択したことを確認します。 準備ができたら、[削除の確認]>[削除] の順に選択します。

    Azure ポータルのスクリーンショット。distribute-test-app と呼ばれるリソース配置が削除されています。

  4. ページが更新され、配置がリストに表示されなくなります。 リソースはメンバー クラスターから削除されます。

リソースの配置の詳細については、次のリソースを参照してください。