適用対象: ✔️ ハブ クラスターを含む Fleet Manager
Azure Kubernetes Fleet Manager のリソース配置により、名前空間とその子リソースを含むクラスター スコープのリソースを、フリート内の複数のクラスターに分散して同期できます。 この機能を使用すると、インフラストラクチャ全体で一貫したリソース構成を確保し、手動によるオーバーヘッドを減らし、単一の信頼できるソースで大規模に複雑なワークロードを管理できるため、マルチクラスターのデプロイが簡素化されます。 この記事では、 ClusterResourcePlacement を使用して名前空間とそのワークロードをメンバー クラスターに配布する方法について説明します。
名前空間内に個々のリソースを分散するには、名前空間 スコープのリソース配置に関するドキュメントを参照してください。
この記事の手順は、Azure ポータルまたはAzure CLIを使用して実行できます。
Note
Fleet Manager のリソース配置は、AKS とAzure Arc対応 Kubernetes クラスターで使用できます。
始める前の準備
- Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- この記事で使用される概念と用語については、 リソース配置の概念の概要 を参照してください。
- ハブ クラスターとメンバー クラスターを含む Fleet Manager が必要です。 お持ちでない場合は、「Azure CLI を使用して Azure Kubernetes Fleet Manager リソースを作成し、メンバー クラスターを参加させる」を参照してください。
- ハブ クラスターの Kubernetes API へのアクセス権が必要です。 アクセス権がない場合は、「Azure Kubernetes Fleet Manager ハブ クラスターの Kubernetes API にアクセスする」を参照してください。
名前空間とそのリソースをメンバー クラスターに配布する
DeploymentとServiceを使用して、フリート内のすべてのクラスターにデプロイする単純なシナリオを使用します。 Fleet Manager ハブ クラスターに名前空間を作成し、それにワークロードを追加してから、 ClusterResourcePlacement を使用して、 PickAll 配置ポリシーを使用して、名前空間とそのすべての内容をすべてのメンバー クラスターに配布します。
サブスクリプション ID、リソース グループ、Kubernetes Fleet リソースのための次の環境変数を設定します。
export SUBSCRIPTION_ID=<subscription-id> export GROUP=<resource-group-name> export FLEET=<fleet-name>[
az account set][az-account-set] コマンドを使用して、既定のAzure サブスクリプションを設定します。az account set \ --subscription ${SUBSCRIPTION_ID}[
az fleet get-credentials][az-fleet-get-credentials] コマンドを使用して、Kubernetes Fleet ハブ クラスターの kubeconfig ファイルを取得します。az fleet get-credentials \ --resource-group ${GROUP} \ --name ${FLEET}出力は次のようになります。
Merged "hub" as current context in /home/fleet/.kube/configNote
フリートがハブレスであることを示すメッセージで
InvalidHubOperationの種類のエラーが発生した場合は、ハブ クラスターを追加します。 詳細については、「 アップグレード ハブ クラスターの種類」を参照してください。ハブ クラスターに名前空間を作成します。
kubectl create namespace test-app次の YAML を
test-workload.yamlとして保存します。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: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancerkubectlを使用して、テスト ワークロードを Fleet Manager ハブ クラスターにステージングします。kubectl apply -f test-workload.yaml次の YAML を
crp-distribute-workload.yamlとして保存します。apiVersion: placement.kubernetes-fleet.io/v1 kind: ClusterResourcePlacement metadata: name: distribute-test-app spec: resourceSelectors: - group: "" kind: Namespace version: v1 name: test-app policy: placementType: PickAll配置マニフェストを Fleet Manager ハブ クラスターに適用します。
kubectl apply -f crp-distribute-workload.yamlNote
リソースのロールアウトは、マニフェストが適用されるとすぐに開始されます。 暗黙的な
RollingUpdate戦略が使用されます。 ロールアウトをさらに制御する方法については、 リソース配置のロールアウト戦略の定義を参照してください。リソースの配置の進行状況を確認します。
kubectl get clusterresourceplacement distribute-test-app
出力は次の例のようになります。
NAME GEN SCHEDULED SCHEDULEDGEN APPLIED APPLIEDGEN AGE
distribute-test-app 2 True 2 True 2 10s
- 配置の詳細を表示します。
kubectl describe clusterresourceplacement distribute-test-app
出力は次の例のようになります。
Name: distribute-test-app
Namespace:
Labels: <none>
Annotations: <none>
API Version: placement.kubernetes-fleet.io/v1
Kind: ClusterResourcePlacement
Metadata:
Creation Timestamp: 2024-04-01T18:55:31Z
Finalizers:
kubernetes-fleet.io/crp-cleanup
kubernetes-fleet.io/scheduler-cleanup
Generation: 2
Resource Version: 6949
UID: 815b1d81-61ae-4fb1-a2b1-06794be3f986
Spec:
Policy:
Placement Type: PickAll
Resource Selectors:
Group:
Kind: Namespace
Name: test-app
Version: v1
Revision History Limit: 10
Strategy:
Type: RollingUpdate
Status:
Conditions:
Last Transition Time: 2024-04-01T18:55:31Z
Message: found all the clusters needed as specified by the scheduling policy
Observed Generation: 2
Reason: SchedulingPolicyFulfilled
Status: True
Type: ClusterResourcePlacementScheduled
Last Transition Time: 2024-04-01T18:55:36Z
Message: All 3 cluster(s) are synchronized to the latest resources on the hub cluster
Observed Generation: 2
Reason: SynchronizeSucceeded
Status: True
Type: ClusterResourcePlacementSynchronized
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully applied resources to 3 member clusters
Observed Generation: 2
Reason: ApplySucceeded
Status: True
Type: ClusterResourcePlacementApplied
Observed Resource Index: 0
Placement Statuses:
Cluster Name: membercluster1
Conditions:
Last Transition Time: 2024-04-01T18:55:31Z
Message: Successfully scheduled resources for placement in membercluster1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
Observed Generation: 2
Reason: ScheduleSucceeded
Status: True
Type: ResourceScheduled
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully Synchronized work(s) for placement
Observed Generation: 2
Reason: WorkSynchronizeSucceeded
Status: True
Type: WorkSynchronized
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully applied resources
Observed Generation: 2
Reason: ApplySucceeded
Status: True
Type: ResourceApplied
Cluster Name: membercluster2
Conditions:
Last Transition Time: 2024-04-01T18:55:31Z
Message: Successfully scheduled resources for placement in membercluster2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
Observed Generation: 2
Reason: ScheduleSucceeded
Status: True
Type: ResourceScheduled
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully Synchronized work(s) for placement
Observed Generation: 2
Reason: WorkSynchronizeSucceeded
Status: True
Type: WorkSynchronized
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully applied resources
Observed Generation: 2
Reason: ApplySucceeded
Status: True
Type: ResourceApplied
Cluster Name: membercluster3
Conditions:
Last Transition Time: 2024-04-01T18:55:31Z
Message: Successfully scheduled resources for placement in membercluster3 (affinity score: 0, topology spread score: 0): picked by scheduling policy
Observed Generation: 2
Reason: ScheduleSucceeded
Status: True
Type: ResourceScheduled
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully Synchronized work(s) for placement
Observed Generation: 2
Reason: WorkSynchronizeSucceeded
Status: True
Type: WorkSynchronized
Last Transition Time: 2024-04-01T18:55:36Z
Message: Successfully applied resources
Observed Generation: 2
Reason: ApplySucceeded
Status: True
Type: ResourceApplied
Selected Resources:
Kind: Namespace
Name: my-namespace
Version: v1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal PlacementScheduleSuccess 108s cluster-resource-placement-controller Successfully scheduled the placement
Normal PlacementSyncSuccess 103s cluster-resource-placement-controller Successfully synchronized the placement
Normal PlacementRolloutCompleted 103s cluster-resource-placement-controller Resources have been applied to the selected clusters
Azure ポータルで、Fleet Manager に移動します。
サービス メニューの [フリート リソース] で、[名前空間] >[+ 作成] を選択します。
Note
フリート リソースが表示されない場合は、Fleet Manager にハブ クラスターがありません。 追加方法の詳細については、 アップグレード ハブ クラスターの種類に関する説明を参照してください。
メニューで [ 名前空間] を選択し、[ 名前] を入力して、[ 作成] を選択します。
しばらくすると、ページが更新され、Fleet Manager ハブ クラスターの名前空間の一覧に名前空間が表示されます。 これで、メンバー クラスター間で配布するリソースをホストする準備ができました。
名前空間の一覧の上部にある [+ 作成>YAML を適用する] を選択し、次のサンプルを使用します。
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: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57 ports: - containerPort: 80apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer次の図に示すように、サンプルをコピーして貼り付け、一度に 1 つずつ適用します。
これで、名前空間とそのワークロードをメンバー クラスターに配布する準備ができました。 デプロイとサービスは、Fleet Manager ハブ クラスターではスケジュールされていません。
[サービス] メニューの [ フリート リソース] で、[ リソースの配置>+ 作成] を選択します。
[基本] タブで次のオプションを構成します。
[ 配置の詳細] に、配置の名前を入力します。
[ リソースの詳細] で、[ スコープ] を クラスター スコープ のままにし、配布するリソースのグループ バージョンの種類 (GVK) と名前を入力します。 このサンプルでは、次の値を使用します。
group: "" kind: Namespace version: v1 name: test-app[ メンバー クラスターの選択] で、[ 配置の種類 ] で [ すべてのクラスター] を選択します。
[ロールアウト]では、[ローリング アップデート]戦略を選択したままにします。
[ 次へ ] を選択して、結果の
ClusterResourcePlacementマニフェストを確認します。 必要に応じてマニフェストを変更するか、 検証 (ドライ ラン) オプションを使用して検証するか、[ 確認と作成 ] を選択して最終確認に進むことができます。[ 作成] を選択すると、名前空間の配布がすぐに開始されます。
Note
選択した
RollingUpdate戦略を使用してリソースの配置を適用すると、リソースのロールアウトが直ちに開始されます。 ロールアウトをさらに制御する方法については、 リソース配置のロールアウト戦略の定義を参照してください。ページが更新され、[ リソース 配置] リストに新しく作成された配置が表示されます。 選択されたクラスターの数と、フリートスケジューラが配置ポリシーを満たせるかどうかを示します。
一覧で配置名を選択して、配置のロールアウトの状態を表示します。 個々のクラスターを選択して、そのクラスターでのリソースのロールアウトを表示します。
選択した Kubernetes クラスターで、デプロイおよび運用可能な名前空間、デプロイ、およびサービスを見つけます。
配置を削除してリソースを削除する
Fleet Manager ハブ クラスター上のリソース配置を削除すると、選択したメンバー クラスターから分散リソースが削除されます。
kubectl delete clusterresourceplacement distribute-test-app
関連するコンテンツ
リソースの配置の詳細については、次のリソースを参照してください。