×

您可以使用应用程序感知配额 (AAQ) 运算符来自定义和管理 OpenShift Container Platform 集群中各个组件的资源配额。

关于 AAQ 运算符

与 OpenShift Container Platform 平台中的原生 ResourceQuota 对象相比,应用程序感知配额 (AAQ) 运算符提供了更灵活和可扩展的配额管理。

在多租户集群环境中,多个工作负载在共享的基础架构和资源上运行,使用 Kubernetes 原生 ResourceQuota 对象来限制 CPU 和内存的总消耗会给 OpenShift Virtualization 工作负载带来基础架构开销和实时迁移方面的挑战。

OpenShift Virtualization 需要大量计算资源分配来处理虚拟机 (VM) 实时迁移和管理虚拟机基础架构开销。升级 OpenShift Virtualization 时,必须迁移虚拟机才能升级 virt-launcher Pod。但是,在存在资源配额的情况下迁移虚拟机可能会导致迁移以及随后的升级失败。

使用 AAQ,您可以为虚拟机分配资源,而不会干扰集群级活动,例如升级和节点维护。AAQ 运算符还支持非计算资源,从而无需分别管理原生资源配额和 AAQ API 对象。

AAQ 运算符控制器和自定义资源

AAQ 运算符引入了两个新的 API 对象,定义为自定义资源定义 (CRD),用于跨多个命名空间管理替代配额实现。

  • ApplicationAwareResourceQuota:设置对每个命名空间强制执行的聚合配额限制。ApplicationAwareResourceQuota API 与原生 ResourceQuota 对象兼容,并共享相同的规范和状态定义。

    示例清单
    apiVersion: aaq.kubevirt.io/v1alpha1
    kind: ApplicationAwareResourceQuota
    metadata:
      name: example-resource-quota
    spec:
      hard:
        requests.memory: 1Gi
        limits.memory: 1Gi
        requests.cpu/vmi: "1" (1)
        requests.memory/vmi: 1Gi (2)
    # ...
    1 默认命名空间中允许的虚拟机工作负载的最大 CPU 量。
    2 默认命名空间中允许的虚拟机工作负载的最大 RAM 量。
  • ApplicationAwareClusterResourceQuota:在集群范围内镜像 ApplicationAwareResourceQuota 对象。它与原生 ClusterResourceQuota API 对象兼容,并共享相同的规范和状态定义。创建 AAQ 集群配额时,您可以通过编辑 spec.selector.labelsspec.selector.annotations 字段,根据注释选择、标签选择或两者同时选择多个命名空间。

    示例清单
    apiVersion: aaq.kubevirt.io/v1alpha1
    kind: ApplicationAwareClusterResourceQuota (1)
    metadata:
      name: example-resource-quota
    spec:
      quota:
        hard:
        requests.memory: 1Gi
        limits.memory: 1Gi
        requests.cpu/vmi: "1"
        requests.memory/vmi: 1Gi
      selector:
        annotations: null
        labels:
          matchLabels:
            kubernetes.io/metadata.name: default
    # ...
    1 只有当 HyperConverged 自定义资源 (CR) 中的 spec.allowApplicationAwareClusterResourceQuota 字段设置为 true 时,才能创建 ApplicationAwareClusterResourceQuota 对象。

    如果同时设置了 spec.selector.labelsspec.selector.annotations 字段,则仅选择同时匹配这两个字段的命名空间。

AAQ 控制器使用调度门机制来评估是否有足够的资源可用于运行工作负载。如果是,则从 Pod 中删除调度门,并将其视为已准备好进行调度。配额使用情况状态将更新为指示使用了多少配额。

如果工作负载的 CPU 和内存请求和限制超过强制配额使用限制,则 Pod 将保持SchedulingGated状态,直到有足够的配额可用。AAQ 控制器会创建一个类型为Warning的事件,其中包含配额超出原因的详细信息。您可以使用oc get events命令查看事件详细信息。

spec.nodeName字段设置为特定节点的 Pod 无法使用与HyperConverged CR 中定义的spec.namespaceSelector标签匹配的命名空间。

启用 AAQ 运算符

要部署 AAQ 运算符,请在HyperConverged自定义资源 (CR) 中将enableApplicationAwareQuota特性门设置为true

先决条件
  • 您可以作为具有cluster-admin权限的用户访问集群。

  • 您已安装 OpenShift CLI (oc)。

步骤
  • 通过运行以下命令,将HyperConverged CR 中的enableApplicationAwareQuota特性门设置为true

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv \
     --type json -p '[{"op": "add", "path": "/spec/featureGates/enableApplicationAwareQuota", "value": true}]'

使用 CLI 配置 AAQ 运算符

您可以通过指定HyperConverged自定义资源 (CR) 中spec.applicationAwareConfig对象的字段来配置 AAQ 运算符。

先决条件
  • 您可以作为具有cluster-admin权限的用户访问集群。

  • 您已安装 OpenShift CLI (oc)。

步骤
  • 通过运行以下命令更新HyperConverged CR

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv --type merge -p '{
      "spec": {
        "applicationAwareConfig": {
          "vmiCalcConfigName": "DedicatedVirtualResources",
          "namespaceSelector": {
            "matchLabels": {
              "app": "my-app"
            }
          },
          "allowApplicationAwareClusterResourceQuota": true
        }
      }
    }'

    其中

    vmiCalcConfigName

    指定如何管理运行虚拟机 (VM) 工作负载的 Pod 的资源计数。可能的值为:

    • VmiPodUsage:与原生资源配额相同的方式计算与 VM 关联的 Pod 的计算资源,并排除与迁移相关的资源。

    • VirtualResources:根据 VM 规范计算计算资源,使用 VM RAM 大小表示内存,使用虚拟 CPU 表示处理能力。

    • DedicatedVirtualResources(默认):类似于VirtualResources,但通过在 CPU 和内存资源名称中添加/vmi后缀来分离与 VM 关联的 Pod 的资源跟踪。例如,requests.cpu/vmirequests.memory/vmi

    namespaceSelector

    确定在创建 Pod 时为其添加 AAQ 调度门的命名空间。如果未定义命名空间选择器,则 AAQ 运算符默认情况下将目标命名空间设置为具有application-aware-quota/enable-gating标签的命名空间。

    allowApplicationAwareClusterResourceQuota

    如果设置为true,则可以创建和管理ApplicationAwareClusterResourceQuota对象。将此属性设置为true可能会增加调度时间。