次の方法で共有


Azure Kubernetes Fleet Manager を使用したインテリジェントなクラスター間 Kubernetes リソース配置

アプリケーション開発者は、多くの場合、Kubernetes リソースを複数のクラスターにデプロイする必要があります。 Fleet オペレーターは多くの場合、ワークロードのための最適なクラスターを、経験則 (たとえばコンピューティングのコスト) や使用可能リソース (メモリと CPU など) に基づいて選ぶ必要があります。 複数のクラスターでこれらの Kubernetes リソースを手動で作成、更新、追跡するのは手間がかかります。 この記事では、Azure Kubernetes Fleet Manager のインテリジェントな Kubernetes リソース配置機能を使用して、これらのシナリオに対処する方法について説明します。

Fleet Manager のリソース配置機能では、次のクラスター プロパティに基づいてスケジュールの決定を行うことができます。

  • ノード数
  • ターゲット メンバー クラスターのコンピューティング/メモリのコスト
  • ターゲット メンバー クラスターでのリソース (CPU またはメモリ) の可用性

この記事の概念の詳細については、「ハブ クラスターからメンバー クラスターへの Kubernetes リソース配置」を参照してください。

前提条件

  • アクティブなサブスクリプションを含む Azure アカウントが必要です。 無料でアカウントを作成できます

  • ハブ クラスターと 1 つ以上のメンバー クラスターを持つ Fleet Manager が必要です。 お持ちでない場合は、 クイックスタート に従って、ハブ クラスターを使用して Fleet Manager を作成します。 次に、Azure Kubernetes Service (AKS) クラスターをメンバーとして参加させます。

    ヒント

    AKS メンバー クラスターは、ご自分が関心のあるクラスター プロパティ (場所、ノード数、リソース、またはコスト) を使用して配置をテストできるように、構成する必要があります。

  • 以下の環境変数を設定します。

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • この記事の内容を完了するには、Azure CLI バージョン 2.58.0 以降がインストールされている必要があります。 インストールとアップグレードについては、「Azure CLI のインストール」を参照してください。

  • Kubernetes CLI (kubectl) がまだインストールされていない場合は、次のコマンドを使用してインストールしてください。

    az aks install-cli
    
  • Azure CLI 拡張機能の fleet が必要です。 これは、次のコマンドを実行してインストールできます。

    az extension add --name fleet
    

    最新バージョンの拡張機能に更新するには、az extension update コマンドを実行します。

    az extension update --name fleet
    
  • kubectl が Fleet Manager ハブ クラスターに接続することを承認します。

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

メンバー クラスターのプロパティを検査する

ハブ クラスターに対するクエリを実行してメンバー クラスターのラベル、プロパティ、リソースを取得します。 結果を読むことができるように、YAML として出力します。

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

生成された YAML ファイルには、配置ポリシーの構築に使用できる詳細情報 (ラベルとプロパティ) が含まれています。 次に例を示します。

apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
  annotations:
    ...
  labels:
    fleet.azure.com/location: eastus2
    fleet.azure.com/resource-group: resource-group
    fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
  name: cluster01
  resourceVersion: "123456"
  uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
  ...
status:
  ...
  properties:
    kubernetes-fleet.io/node-count:
      observationTime: "2024-09-19T01:33:54Z"
      value: "2"
    kubernetes.azure.com/per-cpu-core-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.073"
    kubernetes.azure.com/per-gb-memory-cost:
      observationTime: "2024-09-19T01:33:54Z"
      value: "0.022"
  resourceUsage:
    allocatable:
      cpu: 3800m
      memory: 10320392Ki
    available:
      cpu: 2740m
      memory: 8821256Ki
    capacity:
      cpu: "4"
      memory: 14195208Ki

ポリシーで使用できるラベルとプロパティを特定するために、各メンバー クラスターに対してこのステップを繰り返します。

ワークロードを配置できるように準備する

次に、ハブ クラスターにワークロードをパブリッシュして、メンバー クラスターに配置できるようにします。

  1. このワークロード用の名前空間をハブ クラスター上に作成します。

    kubectl create namespace test-app 
    
  2. サンプル ワークロードを、ハブ クラスター上の新しい名前空間にデプロイできます。 これらの種類の Kubernetes リソースにはカプセル化が必要ないため、変更なしでデプロイできます。

    1. 次の YAML を sample-workload.yaml という名前のファイルに保存します。

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
        namespace: test-app
      spec:
        selector:
          app: nginx
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
        type: LoadBalancer
      ---
      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: nginx:1.16.1 
              ports:
              - containerPort: 80
      
    2. ワークロード定義を、ご自分のハブ クラスターにデプロイします。

      kubectl apply -f sample-workload.yaml
      

ワークロード定義がデプロイされたので、Fleet Manager のインテリジェントな配置機能をテストできるようになりました。

ワークロード配置ポリシーをテストする

次に示すサンプルは、概念ドキュメントと併せて、独自の ClusterResourcePlacement オブジェクトを記述するためのガイドとして使用できます。

それぞれのサンプル ポリシーを試す場合は、前の ClusterResourcePlacement オブジェクトを必ず削除してください。

クラスター ノード数に基づく配置

この例では、Descending の順序を使用したプロパティの並べ替え機能を示しています。 この順序は、Fleet Manager がノード数が多いクラスターを優先することを意味します。

ノード数が最も多いクラスターは重み 20 を受け取り、最も低いクラスターは重み 0 を受け取ります。 他のクラスターには、重みの計算式を使用して計算された、比例的な重みが与えられます。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

ラベル セレクターとプロパティ並べ替えを使用する配置

この例では、ラベル env=prod を持つクラスターのみが重みを受け取ります。 そのラベル制約を満たすクラスターには、そのメンバー クラスター内の CPU の合計量に基づいた比例的な重みが与えられます。

この例では、preferredDuringSchedulingIgnoredDuringExecution アフィニティに対し、ラベル セレクターとプロパティ並べ替え機能の両方を使用する方法を示します。 ラベル セレクターに失敗したメンバー クラスターは重みを受け取りません。 ラベル セレクターを満たすメンバー クラスターは、プロパティ並べ替えで指定された比例的な重みを受け取ります。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                metricSorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

メモリと CPU コアのコストに基づく配置

この例の並べ替え子には Ascending 順序があるため、Fleet Manager では、メモリコストと CPU コア コストが低いクラスターが優先されます。 メモリと CPU コアのコストが最も低いクラスターに与えられる重みは 20 で、最も高いクラスターには重み 0 が与えられます。 他のクラスターには、重みの計算式を使用して計算された比例的な重みが与えられます。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-demo
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-app
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-gb-memory-core-cost
                sortOrder: Ascending
          - weight: 20
            preference:
              propertySorter:
                name: kubernetes.azure.com/per-cpu-core-cost
                sortOrder: Ascending

配置の状態を表示する

配置の状態を表示したい場合は、Azure portal または kubectl コマンドを使用できます。

配置の進行状況を表示する方法の詳細については、「ClusterResourcePlacement API を使用してメンバー クラスターにリソースを伝達する」でご確認ください。

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

Azure portal または kubectl コマンドを使用してクラスター リソースの配置を削除する方法の詳細については、リソースの伝達に関する記事で「リソースをクリーンアップする」を参照してください。