Azure Kubernetes Fleet Manager を使用したインテリジェントなクラスター間 Kubernetes リソースの配置 (プレビュー)

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

概要

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

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

重要

Azure Kubernetes Fleet Manager のプレビュー機能は、セルフサービス、オプトイン ベースで利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Fleet Manager のプレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。

この記事では、Azure CLI または Azure portal を使用してクラスター リソース配置を作成する方法を説明します。 詳細については、「フリート ハブ クラスターからメンバー クラスターにリソースを伝播する」を参照してください。

前提条件

メンバー クラスターのプロパティに基づいてスケジュール時にクラスターをフィルター処理する

requiredDuringSchedulingIgnoredDuringExecution のアフィニティの種類を使用すると、プロパティ セレクターを使用して配置の対象となるメンバー クラスターをフィルター処理できます。 プロパティ セレクターは、クラスター プロパティに対する式条件の配列です。

各条件で、次のように指定します。

  • 名前: プロパティの名前。次の形式にする必要があります。

    resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
    

    <CAPACITY-TYPE> は、確認する容量 (使用量情報) に応じて、totalallocatable、または available のいずれかとなり、<RESOURCE-NAME> はリソース (CPU/メモリ) の名前になります。

    たとえば、クラスターの使用可能な CPU 容量に基づいてクラスターを選択する場合は、プロパティ セレクターで使用される名前を resources.kubernetes-fleet.io/available-cpu にする必要があります。 割り当て可能なメモリ容量には、resources.kubernetes-fleet.io/allocatable-memory を使用できます。

  • プロパティの使用可能な値の一覧です。

  • 制約値または必要な値とクラスター上の監視対象の値の間の条件を表すために使用される演算子です。 現在サポートされている演算子は次のとおりです。

    • Gt (より大きい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値より大きくする必要があります。
    • Ge (以上): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値以上にする必要があります。
    • Lt (より小さい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値より小さくする必要があります。
    • Le (以下): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値以下にする必要があります。
    • Eq (等しい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値と等しくする必要があります。
    • Ne (等しくない): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値と等しくなくする必要があります。

    演算子 GtGeLtLeEq、または Ne を使用する場合、条件内の値の一覧には、正確に 1 つの値がある必要があります。

Fleet は、条件で指定されたプロパティに基づいて各クラスターを評価します。 requiredDuringSchedulingIgnoredDuringExecution に一覧されている条件を満たさない場合、このメンバー クラスターはリソースの配置から除外されます。

Note

メンバー クラスターに条件で表されたプロパティがない場合、その条件は自動的に失敗します。

リソースの配置に 5 つ以上のノードを持つクラスターのみを選択する配置ポリシーの例:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

アフィニティ用語 requiredDuringSchedulingIgnoredDuringExecution のラベル セレクターとプロパティ セレクターの両方を使用して、両方の制約で対象となるメンバー クラスターをフィルター処理できます。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      region: east
                  propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

この例では、Kubernetes Fleet は、region=east ラベルとノード数が 5 つ以上の場合にのみ、リソース配置用のクラスターを考慮します。

メンバー クラスターのプロパティに基づくスケジュール時のクラスターのランク付け

preferredDuringSchedulingIgnoredDuringExecution を使用すると、プロパティ ソーターは、その値に基づいて、フリート内のすべてのクラスターを昇順または降順でランク付けします。 重みは、preferredDuringSchedulingIgnoredDuringExecution で指定された重み付けの値に基づいて計算されます。

プロパティ ソーターは、次の要素で構成されます。

  • 名前: 前のセクションで説明したプロパティの書式設定の詳細を含むプロパティの名前です。
  • 並べ替え順序: 並べ替え順序は、Ascending または Descending にすることができます。 Ascending 順序を使用すると、Kubernetes Fleet は、監視対象の値が低いメンバー クラスターを優先します。 Descending 順序を使用すると、監視対象の値が高いメンバー クラスターが優先されます。

並べ替え順序 Descending の場合、比例重みは次の式を使用して計算されます。

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

たとえば、使用可能な CPU 容量のプロパティに基づいてクラスターを降順にランク付けし、次の使用可能な CPU を持つ 3 つのクラスターのフリートがあるとします。

クラスター 使用可能な CPU 容量
bravelion 100
smartfish 20
jumpingcat 10

この場合、ソーターは次の重みを計算します。

クラスター 使用可能な CPU 容量 体重
bravelion 100 (100 - 10) / (100 - 10) = 重みの 100%
smartfish 20 (20 - 10) / (100 - 10) = 重みの 11.11%
jumpingcat 10 (10 - 10) / (100 - 10) = 重みの 0%

並べ替え順序 Ascending の場合、比例重みは次の式を使用して計算されます。

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

たとえば、per-CPU-core-cost に基づいてクラスターを昇順にランク付けし、次の CPU コア コストを持つ 3 つのクラスターのフリートがあるとします。

クラスター CPU あたりのコア コスト
bravelion 1
smartfish 0.2
jumpingcat 0.1

この場合、ソーターは次の重みを計算します。

クラスター CPU あたりのコア コスト 体重
bravelion 1 1 - ((1 - 0.1) / (1 - 0.1)) = 重みの 0%
smartfish 0.2 1 - ((0.2 - 0.1) / (1 - 0.1)) = 重みの 88.89%
jumpingcat 0.1 1 - (0.1 - 0.1) / (1 - 0.1) = 重みの 100%

次の例では、Descending の順序を使用してプロパティ ソーターを示します。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes.azure.com/node-count
                  sortOrder: Descending

この例では、Fleet はノード数が多いクラスターを優先します。 ノード数が最も多いクラスターは重み 20 を受け取り、最も低いクラスターは 0 を受け取ります。 他のクラスターは、重みの計算式を使用して計算された比例重みを受け取ります。

preferredDuringSchedulingIgnoredDuringExecution アフィニティでは、ラベル セレクターとプロパティ ソーターの両方を使用できます。 ラベル セレクターに失敗したメンバー クラスターは重みを受け取りません。 ラベル セレクターを満たすメンバー クラスターは、プロパティ ソーターで指定された比例重みを受け取ります。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  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

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

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

ClusterResourcePlacement オブジェクトを使用する必要がなくなった場合は、kubectl delete コマンドを使用して削除できます。 次の例では、crp という名前の ClusterResourcePlacement オブジェクトを削除します。

kubectl delete clusterresourceplacement crp

次のステップ

リソース伝達の詳細について確認するには、以下のリソースを参照してください。