管理集群配额

管理集群资源配额,并在租户之间建立公平的共享规则。

此页面展示如何管理集群资源配额,并在租户之间建立公平的共享规则。

此页面的目标受众是 批处理管理员

开始之前

确保满足以下条件

  • 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 管理 资源类型 cpumemory 的使用。每种资源类型都有一个 资源描述,名为 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 架构的节点,即 x86arm,它们在节点标签 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-cqteam-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-cqteam-b-cqarm 规格定义了 borrowingLimit: 0。因此,它们无法相互借用此规格。
  • team-a-cqteam-b-cqx86 规格定义了 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"


上次修改时间:2024 年 6 月 1 日:添加 excludeResourcePrefixes 的文档(#2328)(571a8489)