适用于: ✔️具有中心群集的 Fleet Manager
Azure Kubernetes Fleet Manager 的资源放置功能使您能够跨 Fleet 中的多个群集分发和同步群集作用域资源,包括命名空间及其子资源。 此功能通过确保整个基础结构中的资源配置一致、减少手动开销,并使你能够使用单个事实来源大规模管理复杂的工作负荷,从而简化了多群集部署。 本文逐步介绍如何 ClusterResourcePlacement 将命名空间及其工作负载分发到成员群集。
若要在命名空间内分发单个资源,请参阅 有关命名空间范围资源放置的文档。
可以使用Azure门户或Azure CLI完成本文中的步骤。
注释
可以将 Fleet Manager 的资源放置功能与 AKS 和已启用 Azure Arc 的 Kubernetes 群集配合使用。
在您开始之前
- 如果没有 Azure 试用版订阅,请在开始前创建一个。
- 阅读 资源放置的概念概述 ,了解本文中使用的概念和术语。
- 需要包含一个中心群集和多个成员群集的舰队管理器。 如果没有,请参阅使用 Azure CLI 创建 Azure Kubernetes 舰队管理器资源并加入成员群集。
- 需要访问中心群集的 Kubernetes API。 如果没有访问权限,请参阅访问 Azure Kubernetes 舰队管理器中心群集的 Kubernetes API。
将命名空间及其资源分发到成员群集
使用拥有一个 Deployment 和 Service 的简单场景,将其部署到 fleet 中的所有集群。 在您的 Fleet Manager 中心群集上创建一个命名空间,将工作负载添加到其中,然后使用 ClusterResourcePlacement 并通过 PickAll 放置策略,将该命名空间及其所有内容分发到所有成员群集。
为订阅 ID、资源组和 Kubernetes 舰队资源设置以下环境变量:
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/config注释
如果您收到类型为
InvalidHubOperation的错误,且错误消息提示该 fleet 没有 hub,请添加一个 hub 集群。 有关详细信息,请参阅 升级中心群集类型。在中心群集上创建命名空间。
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: LoadBalancer使用
kubectl将测试工作负荷暂存到 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.yaml注释
清单一经应用,资源部署便会立即开始。 使用隐式
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 中心群集的命名空间列表中。 现在它已准备就绪,可以托管你想要分发到各个成员集群的任何资源。
在命名空间列表顶部,选择“ + 创建>应用 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复制并粘贴这些示例,然后按照下图所示逐个应用。
命名空间及其工作负载现已准备好分发到成员群集。 部署和服务未在 Fleet Manager 中心群集上计划。
在服务菜单上的 “机群资源”下,选择 “资源位置>+ 创建”。
在“基本信息”选项卡上,配置以下选项:
在 “投放详情”中,输入投放名称。
在 “资源详细信息”下,将 范围 保留为 群集范围 ,并输入要分发的资源的组版本类型(GVK)和名称。 在此示例中,使用以下值。
group: "" kind: Namespace version: v1 name: test-app在 “成员集群选择” 中,将 “放置类型” 选择为 “所有集群”。
对于 Rollout,请保持 滚动更新 策略为选中状态。
选择 “下一步 ”以查看生成的
ClusterResourcePlacement清单。 如果需要,可以修改清单,使用 “验证”(试运行) 选项进行验证,或选择“ 查看 + 创建 ”以继续进行最终确认。选择 “创建 ”以立即开始分发命名空间。
注释
使用所选的
RollingUpdate策略应用资源放置后,资源部署会立即开始。 若要了解如何进一步控制部署,请参阅 定义资源放置的部署策略。页面刷新后,资源放置位置列表中会显示新创建的放置位置。 它显示所选集群的数量,以及舰队调度器是否可以满足放置策略要求。
在列表中选择相应的投放位置名称,即可查看其投放状态。 选择单个群集以查看该群集上的资源部署情况。
在选定的 Kubernetes 群集上,可以找到已部署和操作的命名空间、部署和服务。
删除该部署以移除资源
删除 Fleet Manager 中心群集上的资源位置时,将从所选成员群集中删除分布式资源。
kubectl delete clusterresourceplacement distribute-test-app
相关内容
若要了解有关资源放置的详细信息,请参阅以下资源: