次の方法で共有


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

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

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

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

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

前提条件

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

  • ユーザーは、1 つ以上のメンバー クラスターを持つ Kubernetes Fleet リソースを持っている必要があります。 お持ちでない場合は、クイックスタート に従い、ハブ クラスターを使用して Kubernetes Fleet リソースを作成します。 次に、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 から Kubernetes Fleet ハブ クラスターへの接続を承認します。

    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
      

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

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

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

Note

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

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

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

ノード数が最も多いクラスターは重み 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 であるため、Kubernetes Fleet は、メモリと 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 コマンドを使用してクラスター リソースの配置を削除する方法の詳細については、リソースの伝達に関する記事で「リソースをクリーンアップする」を参照してください。