アプリケーション開発者は、多くの場合、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
ポリシーで使用できるラベルとプロパティを特定するために、各メンバー クラスターに対してこのステップを繰り返します。
ワークロードを配置できるように準備する
次に、ハブ クラスターにワークロードをパブリッシュして、メンバー クラスターに配置できるようにします。
このワークロード用の名前空間をハブ クラスター上に作成します。
kubectl create namespace test-app
サンプル ワークロードを、ハブ クラスター上の新しい名前空間にデプロイできます。 これらの種類の Kubernetes リソースにはカプセル化が必要ないため、変更なしでデプロイできます。
次の 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
ワークロード定義を、ご自分のハブ クラスターにデプロイします。
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 コマンドを使用してクラスター リソースの配置を削除する方法の詳細については、リソースの伝達に関する記事で「リソースをクリーンアップする」を参照してください。
関連するコンテンツ
- リソースの配置の詳細については、オープンソースの KubeFleet ドキュメントを参照してください。
Azure Kubernetes Service