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
ポリシーで使用できるラベルとプロパティを特定するために、各メンバー クラスターに対してこのステップを繰り返します。
ワークロードを配置できるように準備する
次に、ハブ クラスターにワークロードをパブリッシュして、メンバー クラスターに配置できるようにします。
このワークロード用の名前空間をハブ クラスター上に作成します。
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
ワークロード定義がデプロイされたので、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 コマンドを使用してクラスター リソースの配置を削除する方法の詳細については、リソースの伝達に関する記事で「リソースをクリーンアップする」を参照してください。
関連するコンテンツ
- リソース伝達の詳細については、オープンソース Kubernetes Fleet のドキュメントを参照してください。
Azure Kubernetes Service