运行普通 Pod

以 Kueue 管理的作业来运行一个或一组 Pod。

本页面展示了如何在运行普通 Pod 时利用 Kueue 的调度和资源管理功能。 Kueue 支持管理单个 Pod一组 Pod

本指南适用于对 Kueue 有基本了解的批处理用户。更多信息请参见 Kueue 概述

开始之前

  1. 默认情况下,pod 集成未启用。 学习如何使用自定义管理器配置安装 Kueue 并启用 pod 集成。

    为了允许 Kubernetes 系统 Pod 成功调度,您必须限制 pod 集成的范围。 推荐的机制是使用 managedJobsNamespaceSelector

    一种方法是仅对特定命名空间启用管理:

    apiVersion: config.kueue.x-k8s.io/v1beta1
    kind: Configuration
    managedJobsNamespaceSelector:
      matchLabels:
       kueue-managed: "true"
    integrations:
      frameworks:
       - "pod"
    

    另一种方法是免除系统命名空间的管理:

    apiVersion: config.kueue.x-k8s.io/v1beta1
    kind: Configuration
    managedJobsNamespaceSelector:
       matchExpressions:
       - key: kubernetes.io/metadata.name
         operator: NotIn
         values: [ kube-system, kueue-system ]
    integrations:
      frameworks:
       - "pod"
    
  1. 如果启用了 Pod 集成,Kueue 将为所有创建的 Pod 运行 Webhook。Webhook namespaceSelector 可用于过滤需要协调的 Pod。默认的 Webhook namespaceSelector 是:

    matchExpressions:
    - key: kubernetes.io/metadata.name
      operator: NotIn
      values: [ kube-system, kueue-system ]
    

    当您通过 Helm 安装 Kueue 时,Webhook 命名空间选择器将匹配 values.yaml 中的 managedJobsNamespaceSelector

    确保 namespaceSelector 永远不匹配 kueue 命名空间,否则 Kueue 部署将无法创建 Pod。

  2. 属于 Kueue 管理的其他 API 资源的 Pod 被排除在 pod 集成的队列之外。 例如,由 batch/v1.Job 管理的 Pod 不会被 pod 集成管理。

  3. 查看管理集群配额了解初始 Kueue 设置的详细信息。

运行由 Kueue 准入的单个 Pod

在 Kueue 上运行 Pod 时,请考虑以下方面:

a. 队列选择

目标本地队列应在 Pod 配置的 metadata.labels 部分中指定。

metadata:
  labels:
    kueue.x-k8s.io/queue-name: user-queue

b. 配置资源需求

工作负载的资源需求可以在 spec.containers 中配置。

    - resources:
        requests:
          cpu: 3

c. “managed” 标签

Kueue 将注入 kueue.x-k8s.io/managed=true 标签来指示哪些 Pod 由其管理。

d. 限制

  • Kueue 管理的 Pod 不能在 kube-systemkueue-system 命名空间中创建。
  • 抢占的情况下,Pod 将被终止和删除。

示例 Pod

这是一个仅休眠几秒钟的示例 Pod:

apiVersion: v1
kind: Pod
metadata:
  generateName: kueue-sleep-
  labels:
    kueue.x-k8s.io/queue-name: user-queue
spec:
  containers:
    - name: sleep
      image: busybox
      command:
        - sleep
      args:
        - 3s
      resources:
        requests:
          cpu: 3
  restartPolicy: OnFailure

您可以使用以下命令创建 Pod:

# 创建 Pod
kubectl create -f kueue-pod.yaml

运行一组一起被准入的 Pod

为了将一组 Pod 作为单个单元运行(称为 Pod 组),请一致地为组的所有成员添加 “pod-group-name” 标签和 “pod-group-total-count” 注解:

metadata:
  labels:
    kueue.x-k8s.io/pod-group-name: "group-name"
  annotations:
    kueue.x-k8s.io/pod-group-total-count: "2"

功能限制

Kueue 仅提供运行 Pod 组所需的最小功能, 仅用于 Pod 由外部控制器直接管理而不需要 Job 级别 CRD 的环境。

作为此设计决策的结果,Kueue 不会重新实现 Kubernetes Job API 中可用的核心功能, 例如高级重试策略。特别是,Kueue 不会重新创建失败的 Pod。

此设计选择影响抢占场景。 当 Kueue 需要抢占表示 Pod 组的工作负载时,Kueue 会发送 删除组中所有 Pod 的请求。创建原始 Pod 的用户或控制器有责任创建替换 Pod。

终止

当成功的 Pod 数量等于 Pod 组大小时,Kueue 认为 Pod 组成功, 并将相关的工作负载标记为已完成。

如果 Pod 组不成功,您可以使用两种方式来终止 Pod 组的执行以释放保留的资源:

  1. 对工作负载对象发出删除请求。Kueue 将终止所有剩余的 Pod。
  2. 在组中至少一个 Pod(可以是替换 Pod)上设置 kueue.x-k8s.io/retriable-in-group: false 注解。 Kueue 将在所有 Pod 终止后将工作负载标记为已完成。

示例 Pod 组

这是一个仅休眠几秒钟的示例 Pod 组:

---
apiVersion: v1
kind: Pod
metadata:
  generateName: sample-leader-
  labels:
    kueue.x-k8s.io/queue-name: user-queue
    kueue.x-k8s.io/pod-group-name: "sample-group"
  annotations:
    kueue.x-k8s.io/pod-group-total-count: "2"
spec:
  restartPolicy: Never
  containers:
  - name: sleep
    image: busybox
    command: ["sh", "-c", 'echo "hello world from the leader pod" && sleep 3']
    resources:
      requests:
        cpu: 3
---
apiVersion: v1
kind: Pod
metadata:
  generateName: sample-worker-
  labels:
    kueue.x-k8s.io/queue-name: user-queue
    kueue.x-k8s.io/pod-group-name: "sample-group"
  annotations:
    kueue.x-k8s.io/pod-group-total-count: "2"
spec:
  restartPolicy: Never
  containers:
  - name: sleep
    image: busybox
    command: ["sh", "-c", 'echo "hello world from the worker pod" && sleep 2']
    resources:
      requests:
        cpu: 3

您可以使用以下命令创建 Pod 组:

kubectl create -f kueue-pod-group.yaml

Kueue 创建的相关工作负载的名称等于 Pod 组的名称。在此示例中为 sample-group, 您可以使用以下命令检查工作负载:

kubectl describe workload/sample-group