监控待处理的工作负载

Alauda Build of Kueue 提供了 VisibilityOnDemand 功能,用于监控待处理的工作负载。工作负载是指运行至完成的应用程序。它可以由一个或多个 Pod 组成,这些 Pod 松散或紧密耦合,共同完成一个任务。工作负载是 Alauda Build of Kueue 中的准入单元。

VisibilityOnDemand 功能使批处理管理员能够监控集群队列和本地队列中的待处理作业流水线,批处理用户则仅能监控本地队列,并帮助用户估算其作业的启动时间。

您可以调节入站请求和高请求量,并为用户提供查看待处理工作负载的权限。

1. API 优先级和公平性

Alauda Build of Kueue 使用 Kubernetes API Priority and Fairness(APF)来帮助管理待处理的工作负载。APF 是一种流量控制机制,允许您定义 API 级别的策略来调节对 API 服务器的入站请求。它保护 API 服务器免受意外高请求量的冲击,同时保护关键流量不受对尽力而为工作负载的限流影响。

示例

apiVersion: flowcontrol.apiserver.k8s.io/v1
kind: FlowSchema
metadata:
  labels:
    name: kueue-visibility
    namespace: cpaas-system
spec:
  distinguisherMethod:
    type: ByUser
  matchingPrecedence: 9000
  priorityLevelConfiguration:
    name: kueue-visibility
  rules:
    - resourceRules:
        - apiGroups:
            - 'visibility.kueue.x-k8s.io'
          clusterScope: true
          namespaces:
            - '*'
          resources:
            - '*'
          verbs:
            - '*'
      subjects:
        - group:
            name: system:unauthenticated
          kind: Group
        - group:
            name: system:authenticated
          kind: Group
---
apiVersion: flowcontrol.apiserver.k8s.io/v1
kind: PriorityLevelConfiguration
metadata:
  name: kueue-visibility
  namespace: cpaas-system
spec:
  limited:
    lendablePercent: 90
    limitResponse:
      queuing:
        handSize: 4
        queueLengthLimit: 50
        queues: 16
      type: Queue
    nominalConcurrencyShares: 10
  type: Limited

2. 提供用户权限

您可以为 Alauda Build of Kueue 部署的用户配置基于角色的访问控制(RBAC)对象。这些对象决定了哪类用户可以创建哪类 Alauda Build of Kueue 对象。

您需要为需要访问特定 API 的用户提供权限。

  • 如果用户需要访问来自 ClusterQueue 资源的待处理工作负载,则需要创建一个 ClusterRoleBinding,引用 ClusterRole kueue-batch-admin-role
  • 如果用户需要访问来自 LocalQueue 资源的待处理工作负载,则需要创建一个 RoleBinding,引用 ClusterRole kueue-batch-user-role

3. 按需监控待处理工作负载

要测试待处理工作负载的监控,必须正确配置 ClusterQueueLocalQueue 资源。之后,您可以在该 LocalQueue 上创建作业。Kueue 会管理由作业创建的工作负载对象,因此,当作业提交并使 ClusterQueue 饱和时,其对应的工作负载可以在待处理工作负载列表中看到。

3.1. 前提条件

  • Alauda Container Platform Web CLI 能与您的集群通信。
  • 您拥有集群管理员权限。

以下操作步骤告诉您如何安装和测试工作负载监控。

3.2. 操作步骤

  1. 运行以下命令创建资源:

    cat <<EOF | kubectl create -f -
    ---
    apiVersion: kueue.x-k8s.io/v1beta2
    kind: ResourceFlavor
    metadata:
      name: "default-flavor"
    ---
    apiVersion: kueue.x-k8s.io/v1beta2
    kind: ClusterQueue
    metadata:
      name: "cluster-queue"
    spec:
      namespaceSelector: {} # 匹配所有命名空间。
      resourceGroups:
      - coveredResources: ["cpu", "memory"]
        flavors:
        - name: "default-flavor"
          resources:
          - name: "cpu"
            nominalQuota: 9
          - name: "memory"
            nominalQuota: 36Gi
    ---
    apiVersion: kueue.x-k8s.io/v1beta2
    kind: LocalQueue
    metadata:
      namespace: "default"
      name: "user-queue"
    spec:
      clusterQueue: "cluster-queue"
    ---
    EOF
  2. 创建包含作业清单的文件:

    cat > job.yaml << EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      generateName: sample-job-
      namespace: default
      labels:
        kueue.x-k8s.io/queue-name: user-queue
    spec:
      parallelism: 3
      completions: 3
      suspend: true
      template:
        spec:
          containers:
          - name: dummy
            image: registry.k8s.io/e2e-test-images/agnhost:2.53
            command: [ "/bin/sh" ]
            args: [ "-c", "sleep 60" ]
            resources:
              requests:
                cpu: "1"
                memory: "200Mi"
          restartPolicy: Never
    EOF
  3. 运行以下命令创建六个作业:

    for i in {1..6}; do kubectl create -f job.yaml;done

3.2.1. 查看 ClusterQueue 中的待处理工作负载

管理员可以使用 Alauda Build of Kueue 的 visibility API 中 ClusterQueue 对象的可见性端点,查看集群级别的所有待处理工作负载。该端点返回当前等待该 ClusterQueue 资源准入的所有工作负载列表。

操作步骤
  1. 运行以下命令查看 ClusterQueue 中的待处理工作负载:

    kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads"

    您应获得类似如下的结果:

    {
     "kind": "PendingWorkloadsSummary",
     "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
     "metadata": {
       "creationTimestamp": null
     },
     "items": [
       {
         "metadata": {
           "name": "job-sample-job-jrjfr-8d56e",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-jrjfr",
               "uid": "5863cf0e-b0e7-43bf-a445-f41fa1abedfa"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 0,
         "positionInLocalQueue": 0
       },
       {
         "metadata": {
           "name": "job-sample-job-jg9dw-5f1a3",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-jg9dw",
               "uid": "fd5d1796-f61d-402f-a4c8-cbda646e2676"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 1,
         "positionInLocalQueue": 1
       },
       {
         "metadata": {
           "name": "job-sample-job-t9b8m-4e770",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-t9b8m",
               "uid": "64c26c73-6334-4d13-a1a8-38d99196baa5"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 2,
         "positionInLocalQueue": 2
       }
     ]
    }

    您可以传递以下可选查询参数:

    limit <integer>:默认值为 1000。指定应获取的最大待处理工作负载数量。

    offset <integer>:默认值为 0。指定应获取的第一个待处理工作负载的位置,起始位置为 0。

  2. 若只想查看 ClusterQueue 中从位置 1 开始的 1 个待处理工作负载,运行:

    kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads?limit=1&offset=1"

3.2.2. 查看 LocalQueue 中的待处理工作负载

用户可以查询 Alauda Build of Kueue 的 visibility API 中 LocalQueue 资源的可见性端点,查看其命名空间内特定租户提交的待处理工作负载。这会返回该队列中其作业的有序列表。

操作步骤
  1. 运行以下命令查看 LocalQueue 中的待处理工作负载:

    kubectl get --raw /apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads

    您应获得类似如下的结果:

    {
     "kind": "PendingWorkloadsSummary",
     "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
     "metadata": {
       "creationTimestamp": null
     },
     "items": [
       {
         "metadata": {
           "name": "job-sample-job-jrjfr-8d56e",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-jrjfr",
               "uid": "5863cf0e-b0e7-43bf-a445-f41fa1abedfa"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 0,
         "positionInLocalQueue": 0
       },
       {
         "metadata": {
           "name": "job-sample-job-jg9dw-5f1a3",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-jg9dw",
               "uid": "fd5d1796-f61d-402f-a4c8-cbda646e2676"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 1,
         "positionInLocalQueue": 1
       },
       {
         "metadata": {
           "name": "job-sample-job-t9b8m-4e770",
           "namespace": "default",
           "creationTimestamp": "2023-12-05T15:42:03Z",
           "ownerReferences": [
             {
               "apiVersion": "batch/v1",
               "kind": "Job",
               "name": "sample-job-t9b8m",
               "uid": "64c26c73-6334-4d13-a1a8-38d99196baa5"
             }
           ]
         },
         "priority": 0,
         "localQueueName": "user-queue",
         "positionInClusterQueue": 2,
         "positionInLocalQueue": 2
       }
     ]
    }

    您可以传递以下可选查询参数:

    limit <integer>:默认值为 1000。指定应获取的最大待处理工作负载数量。

    offset <integer>:默认值为 0。指定应获取的第一个待处理工作负载的位置,起始位置为 0。

  2. 若只想查看 LocalQueue 中从位置 0 开始的 1 个待处理工作负载,运行:

    kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads?limit=1&offset=0"