管理集群配额
此页面展示如何管理集群资源配额,并在租户之间建立公平的共享规则。
此页面的目标受众是 批处理管理员。
开始之前
确保满足以下条件
- Kubernetes 集群正在运行。
- kubectl 命令行工具已与您的集群建立通信。
- 已安装 Kueue.
已设置单个 ClusterQueue 和单个 ResourceFlavor
在以下步骤中,您将创建一个排队系统,其中包含一个 ClusterQueue 和一个 ResourceFlavor 来管理集群配额。
您可以通过应用 examples/admin/single-clusterqueue-setup.yaml 一次执行所有这些步骤
kubectl apply -f examples/admin/single-clusterqueue-setup.yaml
1. 创建一个 ClusterQueue
创建一个 ClusterQueue 来表示整个集群的资源配额。
编写 ClusterQueue 的清单。它应类似于以下内容
# cluster-queue.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "cluster-queue"
spec:
namespaceSelector: {} # match all.
resourceGroups:
- coveredResources: ["cpu", "memory"]
flavors:
- name: "default-flavor"
resources:
- name: "cpu"
nominalQuota: 9
- name: "memory"
nominalQuota: 36Gi
要创建 ClusterQueue,请运行以下命令
kubectl apply -f cluster-queue.yaml
此 ClusterQueue 管理 资源类型 cpu
和 memory
的使用。每种资源类型都有一个 资源描述,名为 default
,具有标称配额。
空的 namespaceSelector
允许任何命名空间使用这些资源。
2. 创建 ResourceFlavor
ClusterQueue 尚未准备好使用,因为未定义default
风味。
通常,资源风味具有节点标签和/或污点,以确定哪些节点可以提供它。但是,由于我们使用单个风味来表示集群中可用的所有资源,因此您可以创建一个空的 ResourceFlavor。
编写 ResourceFlavor 的清单。它应该类似于以下内容
# default-flavor.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: "default-flavor"
要创建 ResourceFlavor,请运行以下命令
kubectl apply -f default-flavor.yaml
.metadata.name
匹配 ClusterQueue 中的 .spec.resourceGroups[0].flavors[0].name
字段。
3. 创建 LocalQueues
用户无法直接将 工作负载 发送到 ClusterQueues。相反,用户需要将他们的工作负载发送到其命名空间中的队列。因此,为了使队列系统完整,您需要在需要访问 ClusterQueue 的每个命名空间中创建一个队列。
编写 LocalQueue 的清单。它应该类似于以下内容
# default-user-queue.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
namespace: "default"
name: "user-queue"
spec:
clusterQueue: "cluster-queue"
要创建 LocalQueue,请运行以下命令
kubectl apply -f default-user-queue.yaml
多个 ResourceFlavors 设置
您可以为不同的 资源风味 定义配额。
在本节的其余部分中,假设您的集群具有两个 CPU 架构的节点,即 x86
和 arm
,它们在节点标签 cpu-arch
中指定。
1. 创建 ResourceFlavors
编写 ResourceFlavors 的清单。它们应该类似于以下内容
# flavor-x86.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: "x86"
spec:
nodeLabels:
cpu-arch: x86
# flavor-arm.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: "arm"
spec:
nodeLabels:
cpu-arch: arm
要创建 ResourceFlavors,请运行以下命令
kubectl apply -f flavor-x86.yaml -f flavor-arm.yaml
ResourceFlavors 中设置的标签应与节点中的标签匹配。如果您正在使用 集群自动扩缩器(或同等控制器),请确保在添加新节点时将其配置为添加这些标签。
2. 创建引用风味的 ClusterQueue
编写引用风味的 ClusterQueue 清单。它应类似于以下内容
# cluster-queue.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "cluster-queue"
spec:
namespaceSelector: {} # match all.
resourceGroups:
- coveredResources: ["cpu"]
flavors:
- name: "x86"
resources:
- name: "cpu"
nominalQuota: 9
- name: "arm"
resources:
- name: "cpu"
nominalQuota: 12
- coveredResources: ["memory"]
flavors:
- name: "default-flavor"
resources:
- name: "memory"
nominalQuota: 84Gi
字段 .spec.resourceGroups[*].flavors[*].name
中的风味名称应与之前创建的 ResourceFlavors 的名称匹配。
请注意,memory
引用 单风味设置 中创建的 default-flavor
风味。这意味着您不想区分内存是来自 x86
还是 arm
节点。
要创建 ClusterQueue,请运行以下命令
kubectl apply -f cluster-queue.yaml
多个 ClusterQueue 和借用队列
两个或更多 ClusterQueue 可以从同一 队列 中借用其他 ClusterQueue 未使用的配额。
使用以下示例,您可以建立一个包含 ClusterQueue team-a-cq
和 team-b-cq
的队列 team-ab
。
# team-a-cq.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "team-a-cq"
spec:
namespaceSelector: {} # match all.
cohort: "team-ab"
resourceGroups:
- coveredResources: ["cpu", "memory"]
flavors:
- name: "default-flavor"
resources:
- name: "cpu"
nominalQuota: 9
borrowingLimit: 6
- name: "memory"
nominalQuota: 36Gi
borrowingLimit: 24Gi
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "team-b-cq"
spec:
namespaceSelector: {}
cohort: "team-ab"
resourceGroups:
- coveredResources: ["cpu", "memory"]
flavors:
- name: "default-flavor"
resources:
- name: "cpu"
nominalQuota: 12
- name: "memory"
nominalQuota: 48Gi
请注意,ClusterQueue team-a-cq
还定义了 borrowingLimit。这限制了 ClusterQueue 从队列中借用未用配额的能力,即使配额完全未使用,也限制在配置的 borrowingLimit
内。
要创建这些 ClusterQueue,请保存前面的清单并运行以下命令
kubectl apply -f team-a-cq.yaml -f team-b-cq.yaml
具有专用和后备风味的多个 ClusterQueue
即使 ClusterQueue 对某个风味没有 nominalQuota,ClusterQueue 也可以从 队列 中借用资源。这允许您为某个风味提供专用配额,并回退到与其他租户共享的另一个风味的配额。
可以使用每个租户的 ClusterQueue 和共享资源的额外 ClusterQueue 来完成此类设置。例如,两个租户的清单如下所示
# team-a-cq.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "team-a-cq"
spec:
namespaceSelector: {} # match all.
cohort: "team-ab"
resourceGroups:
- coveredResources: ["cpu"]
flavors:
- name: "arm"
resources:
- name: "cpu"
nominalQuota: 9
borrowingLimit: 0
- name: "x86"
resources:
- name: "cpu"
nominalQuota: 0
- coveredResources: ["memory"]
flavors:
- name: "default-flavor"
resources:
- name: "memory"
nominalQuota: 36Gi
# team-b-cq.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "team-b-cq"
spec:
namespaceSelector: {} # match all.
cohort: "team-ab"
resourceGroups:
- coveredResources: ["cpu"]
flavors:
- name: "arm"
resources:
- name: "cpu"
nominalQuota: 12
borrowingLimit: 0
- name: "x86"
resources:
- name: "cpu"
nominalQuota: 0
- coveredResources: ["memory"]
flavors:
- name: "default-flavor"
resources:
- name: "memory"
nominalQuota: 48Gi
# shared-cq.yaml
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: "shared-cq"
spec:
namespaceSelector: {} # match all.
cohort: "team-ab"
resourceGroups:
- coveredResources: ["cpu"]
flavors:
- name: "x86"
resources:
- name: "cpu"
nominalQuota: 6
- coveredResources: ["memory"]
flavors:
- name: "default-flavor"
resources:
- name: "memory"
nominalQuota: 24Gi
请注意以下设置
team-a-cq
和team-b-cq
为arm
规格定义了borrowingLimit: 0
。因此,它们无法相互借用此规格。team-a-cq
和team-b-cq
为x86
规格定义了nominalQuota: 0
。因此,它们没有该规格的任何专用配额,只能从shared-cq
借用。
要创建这些 ClusterQueue,请保存前面的清单并运行以下命令
kubectl apply -f team-a-cq.yaml -f team-b-cq.yaml -f shared-cq.yaml
在配额管理中排除任意资源
默认情况下,管理员必须在 ClusterQueues .spec.resourceGroups[*]
中指定 Pod 所需的所有资源。如果您想在 ClusterQueues 配额管理和准入过程中排除某些资源,可以在 Kueue 配置中指定资源前缀作为群集级设置。
按照 使用自定义配置的安装说明 进行操作,并使用类似于以下内容的字段扩展配置
apiVersion: config.kueue.x-k8s.io/v1beta1
kind: Configuration
resources:
excludeResourcePrefixes:
- "example.com"