使用 Azure Kubernetes 舰队管理器的智能跨群集 Kubernetes 资源放置(预览版)

应用程序开发人员通常需要将 Kubernetes 资源部署到多个群集中。 舰队操作员通常需要选择最佳群集,以便根据试探法(如群集中的计算成本)或可用资源(如内存和 CPU)放置工作负载。 跨多个群集手动创建、更新和跟踪这些 Kubernetes 资源非常繁琐。 本文介绍 Azure Kubernetes 舰队管理器(Kubernetes 舰队)如何允许你使用智能 Kubernetes 资源放置功能应对这些场景。

概述

Kubernetes 舰队提供的资源放置功能可以根据以下属性做出计划决策:

  • 节点计数
  • 目标成员群集中的计算成本
  • 目标成员群集中的资源(CPU/内存)可用性

重要

Azure Kubernetes 舰队管理器预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

本文讨论如何创建群集资源放置,这可以通过 Azure CLI 或 Azure 门户完成。 有关详细信息,请参阅将资源从舰队中心群集传播到成员群集

先决条件

根据成员群集属性在计划时筛选群集

requiredDuringSchedulingIgnoredDuringExecution 相关性类型要求筛选有资格使用属性选择器放置的成员群集。 属性选择器是针对群集属性的表达式条件数组。

在每个条件中,指定:

  • 名称:属性的名称,应采用以下格式:

    resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
    

    <CAPACITY-TYPE>totalallocatableavailable 之一,具体取决于要检查的容量(使用情况信息),而 <RESOURCE-NAME> 是资源(CPU/内存)的名称。

    例如,如果要根据群集的可用 CPU 容量选择群集,则属性选择器中使用的名称应为 resources.kubernetes-fleet.io/available-cpu。 对于可分配的内存容量,可以使用 resources.kubernetes-fleet.io/allocatable-memory

  • 一个值列表,这些值是属性的可能值。

  • 一个运算符,用于表示约束/所需值与群集上观察到的值之间的条件。 当前支持以下运算符:

    • Gt(大于):群集给定属性观察到的值必须大于条件中的值,然后才能选取资源放置。
    • Ge(大于或等于):群集给定属性观察到的值必须大于或等于条件中的值,然后才能选取资源放置。
    • Lt(小于):群集给定属性观察到的值必须小于条件中的值,然后才能选取资源放置。
    • Le(小于或等于):群集给定属性观察到的值必须小于或等于条件中的值,然后才能选取资源放置。
    • Eq(等于):群集给定属性观察到的值必须等于条件中的值,然后才能选取资源放置。
    • Ne(不等于):群集给定属性观察到的值必须不等于条件中的值,然后才能选取资源放置。

    如果使用运算符 GtGeLtLeEqNe,则条件中的值列表应正好有一个值。

舰队根据条件中指定的属性评估每个群集。 未能满足 requiredDuringSchedulingIgnoredDuringExecution 下列出的条件会从资源放置中排除此成员群集。

注意

如果成员群集不具有条件中表示的属性,则将自动使条件失败。

仅选择具有大于或等于五个节点的群集进行资源放置的示例放置策略:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

可以在 requiredDuringSchedulingIgnoredDuringExecution 相关性术语下同时使用标签和属性选择器来基于这两个约束筛选符合条件的成员群集。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      region: east
                  propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

在此示例中,Kubernetes 舰队仅当群集具有 region=east 标签且节点计数大于或等于五时,才考虑将其用于资源放置。

根据成员群集属性在计划时设置群集的优先级

使用 preferredDuringSchedulingIgnoredDuringExecution 时,属性排序器会根据其值按升序或降序顺序设置舰队中所有群集的优先级。 权重是根据在 preferredDuringSchedulingIgnoredDuringExecution 下指定的权重值计算得出的。

属性排序器包括:

  • 名称:属性的名称,其中包含上一节中涵盖的属性的格式设置的详细信息。
  • 排序顺序:排序顺序可以是 Ascending,也可以是 Descending。 使用 Ascending 顺序时,Kubernetes 舰队首选具有较低观察到的值的成员群集。 使用 Descending 顺序时,首选具有较高观察到的值的成员群集。

对于排序顺序 Descending,使用公式计算成比例权重:

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

例如,假设要根据可用 CPU 容量的属性按降序顺序设置群集的优先级,并且有一个包含三个群集的舰队,其中包含以下可用 CPU:

群集 可用 CPU 容量
bravelion 100
smartfish 20
jumpingcat 10

在这种情况下,排序器将计算以下权重:

群集 可用 CPU 容量 Weight
bravelion 100 (100 - 10) / (100 - 10) = 100% 的权重
smartfish 20 (20 - 10) / (100 - 10) = 11.11% 的权重
jumpingcat 10 (10 - 10) / (100 - 10) = 0% 的权重

对于排序顺序 Ascending,使用公式计算成比例权重:

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

例如,假设要根据可用 CPU 核心成本按升序顺序设置群集的优先级,并且有一个包含三个群集的舰队,其中包含以下 CPU 核心成本:

群集 每 CPU 核心成本
bravelion 1
smartfish 0.2
jumpingcat 0.1

在这种情况下,排序器将计算以下权重:

群集 每 CPU 核心成本 Weight
bravelion 1 1 - ((1 - 0.1) / (1 - 0.1)) = 0% 的权重
smartfish 0.2 1 - ((0.2 - 0.1) / (1 - 0.1)) = 88.89% 的权重
jumpingcat 0.1 1 - (0.1 - 0.1) / (1 - 0.1) = 100% 的权重

以下示例使用 Descending 顺序展示属性排序器:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes.azure.com/node-count
                  sortOrder: Descending

在此示例中,舰队将首选具有更高节点计数的群集。 节点计数最高的群集将获得权重 20,节点计数最低的群集将获得权重 0。 其他群集将使用权重计算公式获得计算得出的成比例权重。

可以在 preferredDuringSchedulingIgnoredDuringExecution 相关性下同时使用标签选择器和属性排序器。 使标签选择器失败的成员群集不会获得任何权重。 满足标签选择器的成员群集将得到在属性排序器下指定的成比例权重。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  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

在此示例中,如果群集具有标签 env=prod,则只会获得额外的权重。 如果它满足基于标签的约束,则根据该成员群集中的 CPU 总量给出成比例权重。

清理资源

如果不再需要使用 ClusterResourcePlacement 对象,可以使用 kubectl delete 命令将其删除。 以下示例删除名为 crpClusterResourcePlacement 对象:

kubectl delete clusterresourceplacement crp

后续步骤

若要了解有关资源传播的详细信息,请参阅以下资源: