Azure Kubernetes Fleet Manager を使用したインテリジェントなクラスター間 Kubernetes リソースの配置 (プレビュー)
アプリケーション開発者は、多くの場合、Kubernetes リソースを複数のクラスターにデプロイする必要があります。 Fleet オペレーターは、多くの場合、ヒューリスティックに基づいて、クラスター内のコンピューティング コスト、またはメモリや CPU などの使用可能なリソースなどのワークロードを配置するための最適なクラスターを選ぶ必要があります。 複数のクラスターでこれらの Kubernetes リソースを手動で作成、更新、追跡するのは手間がかかります。 この記事では、Azure Kubernetes Fleet Manager (Kubernetes Fleet) によって、インテリジェントな Kubernetes リソース配置機能を使用してこれらのシナリオに対処する方法について説明します。
概要
Kubernetes Fleet には、次のプロパティに基づいてスケジュールの決定を行うことができるリソース配置機能が用意されています。
- ノード数
- ターゲット メンバー クラスターのコンピューティング コスト
- ターゲット メンバー クラスターでのリソース (CPU またはメモリ) の可用性
重要
Azure Kubernetes Fleet Manager のプレビュー機能は、セルフサービス、オプトイン ベースで利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 Azure Kubernetes Fleet Manager のプレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。
この記事では、Azure CLI または Azure portal を使用してクラスター リソース配置を作成する方法を説明します。 詳細については、「フリート ハブ クラスターからメンバー クラスターにリソースを伝播する」を参照してください。
前提条件
- このクイックスタートで使用される概念と用語を把握するために、「リソース伝達の概念の概要」を参照してください。
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- 1 つのハブ クラスターと複数のメンバー クラスターを持つフリート リソースが必要です。 存在しない場合は、「Azure CLI を使用して Azure Kubernetes Fleet Manager リソースを作成し、メンバー クラスターを参加させる」を参照してください。
- ハブ クラスターの Kubernetes API へのアクセス権が必要です。 アクセス権がない場合は、「Azure Kubernetes Fleet Manager を使用したフリート リソースの Kubernetes API へのアクセス」を参照してください。
メンバー クラスターのプロパティに基づいてスケジュール時にクラスターをフィルター処理する
requiredDuringSchedulingIgnoredDuringExecution のアフィニティの種類を使用すると、プロパティ セレクターを使用して配置の対象となるメンバー クラスターをフィルター処理できます。 プロパティ セレクターは、クラスター プロパティに対する式条件の配列です。
各条件で、次のように指定します。
名前: プロパティの名前。次の形式にする必要があります。
resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
<CAPACITY-TYPE>
は、確認する容量 (使用量情報) に応じて、total
、allocatable
、またはavailable
のいずれかとなり、<RESOURCE-NAME>
はリソース (CPU/メモリ) の名前になります。たとえば、クラスターの使用可能な CPU 容量に基づいてクラスターを選択する場合は、プロパティ セレクターで使用される名前を
resources.kubernetes-fleet.io/available-cpu
にする必要があります。 割り当て可能なメモリ容量には、resources.kubernetes-fleet.io/allocatable-memory
を使用できます。プロパティの使用可能な値の一覧です。
制約値または必要な値とクラスター上の監視対象の値の間の条件を表すために使用される演算子です。 現在サポートされている演算子は次のとおりです。
Gt
(より大きい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値より大きくする必要があります。Ge
(以上): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値以上にする必要があります。Lt
(より小さい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値より小さくする必要があります。Le
(以下): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値以下にする必要があります。Eq
(等しい): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値と等しくする必要があります。Ne
(等しくない): 指定されたプロパティのクラスターの監視対象の値は、リソースの配置に対して選択する前に、条件の値と等しくなくする必要があります。
演算子
Gt
、Ge
、Lt
、Le
、Eq
、または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
次のステップ
リソース伝達の詳細について確認するには、以下のリソースを参照してください。