Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
应用程序开发人员通常需要将 Kubernetes 资源部署到位于云和本地环境中的多个群集。 舰队操作员通常需要根据启发法(如计算成本)或可用资源(例如内存和 CPU)为工作负载选择最佳集群。 跨多个群集手动创建、更新和跟踪这些 Kubernetes 资源非常繁琐。 本文介绍如何在 Azure Kubernetes 机群管理器中使用智能 Kubernetes 资源放置功能来解决这些方案。
Fleet Manager 支持针对群集范围的 (ClusterResourcePlacement) 和命名空间范围的 (ResourcePlacement) 资源进行智能放置。 资源放置功能可以根据以下群集属性做出计划决策:
- 节点计数
- 目标成员群集中的计算/内存成本
- 目标成员群集中的资源(CPU/内存)可用性
有关本文中的概念的详细信息,请参阅 群集范围的资源放置 和 命名空间范围内的资源放置。
先决条件
需要一个具有活动订阅的 Azure 帐户。 创建帐户。
必须具有具有中心群集和一个或多个成员群集的机群管理器。 如果没有,请按照 快速上手指南 创建包含枢纽集群的机群管理器。 然后,以成员身份加入 支持的 Kubernetes 群集 。
小窍门
请确保配置 Kubernetes 群集,以便通过您感兴趣的群集属性(如位置、节点数量、资源或成本)进行放置测试。
设置以下环境变量:
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你需要
fleetAzure CLI 扩展。 通过运行以下命令来安装它: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: chinanorth3
fleet.azure.com/resource-group: resource-group
fleet.azure.com/subscription-id: aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
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(适用于群集范围的资源和整个命名空间)和 ResourcePlacement(适用于特定命名空间范围的资源)的变体。
注意
若要试用每个示例策略,请在应用下一个策略之前删除之前的 ClusterResourcePlacement 或 ResourcePlacement。
基于集群节点计数的部署
此示例显示使用 Descending 顺序的属性排序器。 此顺序意味着 Fleet Manager 更喜欢具有更高节点计数的群集。
节点计数最高的群集获得权重 20,节点计数最低的群集获得权重 0。 其他群集获得通过权重计算公式计算的成比例权重。
ClusterResourcePlacement 示例
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:
propertySorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
ResourcePlacement 示例
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
使用标签选择器和属性排序进行放置
在此示例中,仅当群集具有标签 env=prod 时,才会获得权重。 如果群集满足该标签约束,则 Fleet Manager 会根据该成员群集中 CPU 总量给出比例权重。
此示例演示了如何同时使用标签选择器和属性排序来实现preferredDuringSchedulingIgnoredDuringExecution相关性。 不满足标签选择器的成员群集不会获得任何权重。 满足标签选择器的成员群集将得到在属性排序器下指定的成比例权重。
ClusterResourcePlacement 示例
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
propertySorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
ResourcePlacement 示例
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
propertySorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
基于内存和 CPU 核心成本的分配
由于本示例中的排序器有一个 Ascending 订单,因此 Fleet Manager 更喜欢内存和 CPU 核心成本较低的群集。 内存和 CPU 核心成本最低的群集将获得 20 的权重,最高的群集将获得 0 的权重。 其他群集接收通过权重计算公式计算得出的比例权重。
ClusterResourcePlacement 示例
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
ResourcePlacement 示例
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
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 门户或 kubectl 命令查看位置的状态。
有关如何查看放置进度的详细信息:
- 有关
ClusterResourcePlacement,请参阅 使用 ClusterResourcePlacement API 将资源传播到成员群集。 - 有关
ResourcePlacement,请参阅 使用 ResourcePlacement 放置命名空间范围内的资源。
清理资源
删除资源位置: