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)
# ...
您可以使用应用程序感知配额 (AAQ) 运算符来自定义和管理 OpenShift Container Platform 集群中各个组件的资源配额。
与 OpenShift Container Platform 平台中的原生 ResourceQuota
对象相比,应用程序感知配额 (AAQ) 运算符提供了更灵活和可扩展的配额管理。
在多租户集群环境中,多个工作负载在共享的基础架构和资源上运行,使用 Kubernetes 原生 ResourceQuota
对象来限制 CPU 和内存的总消耗会给 OpenShift Virtualization 工作负载带来基础架构开销和实时迁移方面的挑战。
OpenShift Virtualization 需要大量计算资源分配来处理虚拟机 (VM) 实时迁移和管理虚拟机基础架构开销。升级 OpenShift Virtualization 时,必须迁移虚拟机才能升级 virt-launcher
Pod。但是,在存在资源配额的情况下迁移虚拟机可能会导致迁移以及随后的升级失败。
使用 AAQ,您可以为虚拟机分配资源,而不会干扰集群级活动,例如升级和节点维护。AAQ 运算符还支持非计算资源,从而无需分别管理原生资源配额和 AAQ API 对象。
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.labels
或 spec.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 对象。 |
如果同时设置了 |
AAQ 控制器使用调度门机制来评估是否有足够的资源可用于运行工作负载。如果是,则从 Pod 中删除调度门,并将其视为已准备好进行调度。配额使用情况状态将更新为指示使用了多少配额。
如果工作负载的 CPU 和内存请求和限制超过强制配额使用限制,则 Pod 将保持SchedulingGated
状态,直到有足够的配额可用。AAQ 控制器会创建一个类型为Warning
的事件,其中包含配额超出原因的详细信息。您可以使用oc get events
命令查看事件详细信息。
将 |
要部署 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}]'
您可以通过指定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/vmi
和requests.memory/vmi
。
namespaceSelector
确定在创建 Pod 时为其添加 AAQ 调度门的命名空间。如果未定义命名空间选择器,则 AAQ 运算符默认情况下将目标命名空间设置为具有application-aware-quota/enable-gating
标签的命名空间。
allowApplicationAwareClusterResourceQuota
如果设置为true
,则可以创建和管理ApplicationAwareClusterResourceQuota
对象。将此属性设置为true
可能会增加调度时间。