在 Kueue 中对预置请求进行故障排除

在 Kueue 中对配置请求的状态进行故障排除

此文档可帮助你对配置请求进行故障排除,配置请求是 ClusterAutoscaler 定义的 API。

Kueue 通过 Provisioning Admission Check Controller 创建 ProvisioningRequest,并将它们视为 Admission Check。为了让 Kueue 允许工作负载,为其创建的 ProvisioningRequest 需要成功。

在开始之前

在开始故障排除之前,请确保您的集群满足以下要求

  • 您的集群已启用 ClusterAutoscaler,并且 ClusterAutoscaler 支持 ProvisioningRequest API。查看您的云提供商文档以确定支持 ProvisioningRequest 的最低版本。如果您使用 GKE,您的集群应运行版本 1.28.3-gke.1098000 或更高版本。
  • 您使用支持 ProvisioningRequest 的节点类型。这可能因您的云提供商而异。
  • Kueue 的版本为 v0.5.3 或更高版本。
  • 您已在 功能门配置 中启用 ProvisioningACC。对于 Kueue v0.7.0 或更高版本,此功能门默认启用。

识别作业的 Provisioning Request

请参阅 故障排除作业指南,了解如何识别作业的工作负载。

您可以运行以下命令,在工作负载状态的 admissionChecks 字段中查看 Provisioning Request(和其他 Admission Check)的简要状态。

kubectl describe workload WORKLOAD_NAME

Kueue 使用命名模式创建 ProvisioningRequest,这有助于您识别与工作负载相对应的请求。

[NAME OF YOUR WORKLOAD]-[NAME OF THE ADMISSION CHECK]-[NUMBER OF RETRY]

例如

sample-job-2zcsb-57864-sample-admissioncheck-1

当作业的节点已配置时,Kueue 还会将注释 cluster-autoscaler.kubernetes.io/consume-provisioning-request 添加到工作负载状态中的 .admissionChecks[*].podSetUpdate[*] 字段。此注释的值是 Provisioning Request 的名称。

kubectl describe workload 命令的输出应类似于以下内容

[...]
Status:
  Admission Checks:
    Last Transition Time:  2024-05-22T10:47:46Z
    Message:               Provisioning Request was successfully provisioned.
    Name:                  sample-admissioncheck
    Pod Set Updates:
      Annotations:
        cluster-autoscaler.kubernetes.io/consume-provisioning-request:  sample-job-2zcsb-57864-sample-admissioncheck-1
        cluster-autoscaler.kubernetes.io/provisioning-class-name:       queued-provisioning.gke.io
      Name:                                                             main
    State:                                                              Ready

我的配置请求的当前状态是什么?

作业未运行的一个可能原因是 ProvisioningRequest 正在等待配置。要了解是否为这种情况,可以通过运行以下命令查看 Provisioning Request 的状态

kubectl get provisioningrequest PROVISIONING_REQUEST_NAME

如果是这种情况,输出应类似于以下内容

NAME                                                 ACCEPTED   PROVISIONED   FAILED   AGE
sample-job-2zcsb-57864-sample-admissioncheck-1       True       False         False    20s

您还可以通过运行以下命令查看 ProvisioningRequest 的更详细状态

kubectl describe provisioningrequest PROVISIONING_REQUEST_NAME

如果 ProvisioningRequest 无法配置节点,错误输出可能类似于以下内容

[...]
Status:
  Conditions:
    Last Transition Time:  2024-05-22T13:04:54Z
    Message:               Provisioning Request wasn't accepted.
    Observed Generation:   1
    Reason:                NotAccepted
    Status:                False
    Type:                  Accepted
    Last Transition Time:  2024-05-22T13:04:54Z
    Message:               Provisioning Request wasn't provisioned.
    Observed Generation:   1
    Reason:                NotProvisioned
    Status:                False
    Type:                  Provisioned
    Last Transition Time:  2024-05-22T13:06:49Z
    Message:               max cluster limit reached, nodepools out of resources: default-nodepool (cpu, memory)
    Observed Generation:   1
    Reason:                OutOfResources
    Status:                True
    Type:                  Failed

请注意,Failed 条件的 ReasonMessage 值可能与您的输出不同,具体取决于阻止配置的原因。

配置请求状态在 .conditions[*].status 字段中描述。空字段表示 ProvisioninongRequest 仍由 ClusterAutoscaler 处理。否则,它将进入以下列出的状态之一

  • Accepted - 表示 ProvisioningRequest 已被 ClusterAutoscaler 接受,因此 ClusterAutoscaler 将尝试为其配置节点。
  • Provisioned - 表示已创建所有请求的资源,并且它们在集群中可用。VM 创建成功完成后,ClusterAutoscaler 将设置此条件。
  • Failed - 表示无法获取资源来满足此 ProvisioningRequest。条件原因和消息将包含有关失败内容的更多详细信息。
  • BookingExpired - 表示 ProvisioningRequest 之前具有已配置条件,并且容量预留时间已到期。
  • CapacityRevoked - 表示请求的资源不再有效。

状态转换如下

Provisioning Request’s states

为什么不创建配置请求?

如果 Kueue 未为您的作业创建配置请求,请尝试检查以下要求

a. 确保 Kueue 的控制器管理器启用了 ProvisioningACC 功能门

运行以下命令以检查 Kueue 的控制器管理器是否已启用 ProvisioningACC 特性门

kubectl describe pod -n kueue-system kueue-controller-manager-

Kueue 容器的参数应类似于以下内容

    ...
    Args:
      --config=/controller_manager_config.yaml
      --zap-log-level=2
      --feature-gates=ProvisioningACC=true

对于 Kueue v0.7.0 或更高版本,此特性默认启用,因此您可能看到不同的输出。

b. 确保您的工作负载已预留配额

要检查您的工作负载在 ClusterQueue 中是否已预留配额,请通过运行以下命令检查您的工作负载状态

kubectl describe workload WORKLOAD_NAME

输出应类似于以下内容

[...]
Status:
  Conditions:
    Last Transition Time:  2024-05-22T10:26:40Z
    Message:               Quota reserved in ClusterQueue cluster-queue
    Observed Generation:   1
    Reason:                QuotaReserved
    Status:                True
    Type:                  QuotaReserved

如果您获得的输出类似于以下内容

  Conditions:
    Last Transition Time:  2024-05-22T08:48:47Z
    Message:               couldn't assign flavors to pod set main: insufficient unused quota for memory in flavor default-flavor, 4396Mi more needed
    Observed Generation:   1
    Reason:                Pending
    Status:                False
    Type:                  QuotaReserved

这意味着您在 ClusterQueue 中没有足够的可用配额。

您的工作负载未预留配额的其他原因可能与 LocalQueue/ClusterQueue 配置错误有关,例如

Status:
  Conditions:
    Last Transition Time:  2024-05-22T08:57:09Z
    Message:               ClusterQueue cluster-queue doesn't exist
    Observed Generation:   1
    Reason:                Inadmissible
    Status:                False
    Type:                  QuotaReserved

您可以检查 ClusterQueue 和 LocalQueue 是否已准备好接收您的工作负载。有关更多详细信息,请参阅 队列故障排除

c. 确保准入检查处于活动状态

要检查您的作业使用的准入检查是否处于活动状态,请运行以下命令

kubectl describe admissionchecks ADMISSIONCHECK_NAME

其中 ADMISSIONCHECK_NAME 是在您的 ClusterQueue 规范中配置的名称。有关更多详细信息,请参阅 准入检查文档

准入检查的状态应类似于

...
Status:
  Conditions:
    Last Transition Time:  2024-03-08T11:44:53Z
    Message:               The admission check is active
    Reason:                Active
    Status:                True
    Type:                  Active

如果上述步骤均无法解决您的问题,请通过 Slack wg-batch 频道 联系我们