From 4000d0a925d4efc280e9f757eebbbfaa13807b76 Mon Sep 17 00:00:00 2001 From: "xin.li" Date: Sun, 15 Dec 2024 20:34:46 +0800 Subject: [PATCH] [zh-cn]sync dynamic-resource-allocation.md Signed-off-by: xin.li --- .../dynamic-resource-allocation.md | 383 +++++++++++------- 1 file changed, 228 insertions(+), 155 deletions(-) diff --git a/content/zh-cn/docs/concepts/scheduling-eviction/dynamic-resource-allocation.md b/content/zh-cn/docs/concepts/scheduling-eviction/dynamic-resource-allocation.md index b4ac8fb565d49..9baa3640a9c16 100644 --- a/content/zh-cn/docs/concepts/scheduling-eviction/dynamic-resource-allocation.md +++ b/content/zh-cn/docs/concepts/scheduling-eviction/dynamic-resource-allocation.md @@ -2,6 +2,15 @@ title: 动态资源分配 content_type: concept weight: 65 +api_metadata: +- apiVersion: "resource.k8s.io/v1beta1" + kind: "ResourceClaim" +- apiVersion: "resource.k8s.io/v1beta1" + kind: "ResourceClaimTemplate" +- apiVersion: "resource.k8s.io/v1beta1" + kind: "DeviceClass" +- apiVersion: "resource.k8s.io/v1beta1" + kind: "ResourceSlice" --- - -使用结构化参数进行核心动态资源分配: - {{< feature-state feature_gate_name="DynamicResourceAllocation" >}} - -使用控制平面控制器进行动态资源分配: - {{< feature-state feature_gate_name="DRAControlPlaneController" >}} 动态资源分配是一个用于在 Pod 之间和 Pod 内部容器之间请求和共享资源的 API。 它是持久卷 API 针对一般资源的泛化。通常这些资源是 GPU 这类设备。 @@ -50,7 +55,15 @@ handles allocation in cooperation with the Kubernetes scheduler. Kubernetes 通过**结构化参数**(在 Kubernetes 1.30 中引入)处理资源的分配。 不同类别的资源支持任意参数来定义要求和初始化。 -当驱动程序提供**控制平面控制器**时,驱动程序本身与 Kubernetes 调度器合作一起处理资源分配。 + +Kubernetes v1.26 至 1.31 包含了**经典 DRA** 的(Alpha)实现,该实现已不再支持。 +本文档适用于 Kubernetes v{{< skew currentVersion >}},解释了 Kubernetes +中当前的动态资源分配方法。 ## {{% heading "prerequisites" %}} @@ -72,10 +85,10 @@ Kubernetes v{{< skew currentVersion >}} 包含用于动态资源分配的集群 ## API -`resource.k8s.io/v1alpha3` +`resource.k8s.io/v1beta1` {{< glossary_tooltip text="API 组" term_id="api-group" >}} 提供了以下类型: @@ -117,43 +130,21 @@ DeviceClass 对 ResourceClaim 中某个设备的每个分配请求都必须准确引用一个 DeviceClass。 -PodSchedulingContext -: 供控制平面和资源驱动程序内部使用, - 在需要为 Pod 分配 ResourceClaim 且这些 ResourceClaim 使用控制平面控制器时协调 Pod 调度。 - ResourceSlice -: 与结构化参数一起使用,以发布有关集群中可用资源的信息。 - - -资源驱动程序的开发者决定他们是要使用控制平面控制器自己处理资源分配, -还是依赖 Kubernetes 使用结构化参数来处理资源分配。 -自定义控制器提供更多的灵活性,但对于节点本地资源,集群自动扩缩可能无法可靠工作。 -结构化参数使集群自动扩缩成为可能,但可能无法满足所有使用场景。 +: 用于 DRA 驱动程序发布关于集群中可用资源的信息。 -当驱动程序使用结构化参数时,所有选择设备的参数都在 -ResourceClaim 和 DeviceClass 中以树内类型被定义。 -配置参数可以作为任意 JSON 对象嵌入其中。 +所有选择设备的参数都在 ResourceClaim 和 DeviceClass 中使用内置类型定义。 +其中可以嵌入配置参数。哪些配置参数有效取决于 DRA 驱动程序 —— Kubernetes 只是将它们传递下去而不进行解释。 ## 调度 {#scheduling} - -### 使用控制平面控制器 {#with-control-plane-controller} - - -与原生资源(CPU、RAM)和扩展资源(由设备插件管理,并由 kubelet 公布)不同, -如果没有结构化参数,调度器无法知道集群中有哪些动态资源, -也不知道如何将它们拆分以满足特定 ResourceClaim 的要求。 -资源驱动程序负责这些任务。 -资源驱动程序在为 ResourceClaim 保留资源后将其标记为“已分配(Allocated)”。 -然后告诉调度器集群中可用的 ResourceClaim 的位置。 - - -当 Pod 被调度时,调度器检查 Pod 所需的所有 ResourceClaim,并创建一个 PodScheduling 对象, -通知负责这些 ResourceClaim 的资源驱动程序,告知它们调度器认为适合该 Pod 的节点。 -资源驱动程序通过排除没有足够剩余资源的节点来响应调度器。 -一旦调度器有了这些信息,它就会选择一个节点,并将该选择存储在 PodScheduling 对象中。 -然后,资源驱动程序为其分配 ResourceClaim,以便资源可用于该节点。 -完成后,Pod 就会被调度。 - - -作为此过程的一部分,ResourceClaim 会为 Pod 保留。 -目前,ResourceClaim 可以由单个 Pod 独占使用或不限数量的多个 Pod 使用。 - - -除非 Pod 的所有资源都已分配和保留,否则 Pod 不会被调度到节点,这是一个重要特性。 -这避免了 Pod 被调度到一个节点但无法在那里运行的情况, -这种情况很糟糕,因为被挂起 Pod 也会阻塞为其保留的其他资源,如 RAM 或 CPU。 - -{{< note >}} - -由于需要额外的通信,使用 ResourceClaim 的 Pod 的调度将会变慢。 -请注意,这也可能会影响不使用 ResourceClaim 的 Pod,因为一次仅调度一个 -Pod,在使用 ResourceClaim 处理 Pod 时会进行阻塞 API 调用, -从而推迟调度下一个 Pod。 -{{< /note >}} - ### 使用结构化参数 {#with-structured-parameters} -当驱动程序使用结构化参数时,调度器负责在 Pod 需要资源时为 ResourceClaim 分配资源。 +调度器负责在 Pod 需要资源时为 ResourceClaim 分配资源。 通过从 ResourceSlice 对象中检索可用资源的完整列表, 跟踪已分配给现有 ResourceClaim 的资源,然后从剩余的资源中进行选择。 @@ -392,18 +309,13 @@ later. Such a situation can also arise when support for dynamic resource allocation was not enabled in the scheduler at the time when the Pod got scheduled (version skew, configuration, feature gate, etc.). kube-controller-manager -detects this and tries to make the Pod runnable by triggering allocation and/or -reserving the required ResourceClaims. +detects this and tries to make the Pod runnable by reserving the required +ResourceClaims. However, this only works if those were allocated by +the scheduler for some other pod. --> 这种情况也可能发生在 Pod 被调度时调度器中未启用动态资源分配支持的时候(原因可能是版本偏差、配置、特性门控等)。 -kube-controller-manager 能够检测到这一点,并尝试通过触发分配和/或预留所需的 ResourceClaim 来使 Pod 可运行。 - -{{< note >}} - -这仅适用于不使用结构化参数的资源驱动程序。 -{{< /note >}} +kube-controller-manager 能够检测到这一点,并尝试通过预留所需的一些 ResourceClaim 来使 Pod 可运行。 +然而,这只有在这些 ResourceClaim 已经被调度器为其他 Pod 分配的情况下才有效。 你还可以在准入时变更传入的 Pod,取消设置 `.spec.nodeName` 字段,并改为使用节点选择算符。 + +## 管理性质的访问 {#admin-access} + +{{< feature-state feature_gate_name="DRAAdminAccess" >}} + + +你可以在 ResourceClaim 或 ResourceClaimTemplate 中标记一个请求为具有特权特性。 +具有管理员访问权限的请求可以允许用户访问使用中的设备,并且在将设备提供给容器时可能授权一些额外的访问权限: + +```yaml +apiVersion: resource.k8s.io/v1beta1 +kind: ResourceClaimTemplate +metadata: + name: large-black-cat-claim-template +spec: + spec: + devices: + requests: + - name: req-0 + deviceClassName: resource.example.com + adminAccess: true +``` + + +如果此特性被禁用,创建此类 ResourceClaim 时将自动移除 `adminAccess` 字段。 + +管理性质访问是一种特权模式,在多租户集群中不应该对普通用户开放。 +集群管理员可以通过安装类似于以下示例的验证准入策略来限制哪些负载能够使用此特性。 +集群管理员至少需要调整 name 属性并将 "dra.example.com" 替换为有意义的值。 + + +```yaml +# 仅将管理性质访问权限授予具有 "admin-access.dra.example.com" 标签的命名空间。 +# 也可以采用其他方式做出此类决定。 +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicy +metadata: + name: resourceclaim-policy.dra.example.com +spec: + failurePolicy: Fail + matchConstraints: + resourceRules: + - apiGroups: ["resource.k8s.io"] + apiVersions: ["v1alpha3", "v1beta1"] + operations: ["CREATE", "UPDATE"] + resources: ["resourceclaims"] + validations: + - expression: '! object.spec.devices.requests.exists(e, has(e.adminAccess) && e.adminAccess)' + reason: Forbidden + messageExpression: '"admin access to devices not enabled"' +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicyBinding +metadata: + name: resourceclaim-binding.dra.example.com +spec: + policyName: resourceclaim-policy.dra.example.com + validationActions: [Deny] + matchResources: + namespaceSelector: + matchExpressions: + - key: admin-access.dra.example.com + operator: DoesNotExist +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicy +metadata: + name: resourceclaimtemplate-policy.dra.example.com +spec: + failurePolicy: Fail + matchConstraints: + resourceRules: + - apiGroups: ["resource.k8s.io"] + apiVersions: ["v1alpha3", "v1beta1"] + operations: ["CREATE", "UPDATE"] + resources: ["resourceclaimtemplates"] + validations: + - expression: '! object.spec.spec.devices.requests.exists(e, has(e.adminAccess) && e.adminAccess)' + reason: Forbidden + messageExpression: '"admin access to devices not enabled"' +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingAdmissionPolicyBinding +metadata: + name: resourceclaimtemplate-binding.dra.example.com +spec: + policyName: resourceclaimtemplate-policy.dra.example.com + validationActions: [Deny] + matchResources: + namespaceSelector: + matchExpressions: + - key: admin-access.dra.example.com + operator: DoesNotExist +``` + + +ResourceClaim 设备状态 {#resourceclaim-device-status} + +{{< feature-state feature_gate_name="DRAResourceClaimDeviceStatus" >}} + + +驱动程序可以报告资源申领中各个已分配设备的、特定于驱动程序的设备状态。 +例如,可以在 ResourceClaim 状态中报告分配给网络接口设备的 IP。 + +驱动程序设置状态,信息的准确性取决于 DRA 驱动程序的具体实现。因此,所报告的设备状态可能并不总是反映设备状态的实时变化。 + +当此特性被禁用时,该字段会在存储 ResourceClaim 时自动清除。 + +针对一个已经设置了 `status.devices` 字段的现有 ResourceClaim 而言,如果 DRA +驱动能够更新该 ResourceClaim,则有可能支持 ResourceClaim 设备状态这一特性。 + ## 启用动态资源分配 {#enabling-dynamic-resource-allocation} - -动态资源分配是一个 **Alpha 特性**,只有在启用 `DynamicResourceAllocation` +动态资源分配是一个 **Beta 特性**,默认关闭,只有在启用 `DynamicResourceAllocation` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/) -和 `resource.k8s.io/v1alpha3` +和 `resource.k8s.io/v1beta1` {{< glossary_tooltip text="API 组" term_id="api-group" >}} 时才启用。 有关详细信息,参阅 `--feature-gates` 和 `--runtime-config` [kube-apiserver 参数](/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/)。 kube-scheduler、kube-controller-manager 和 kubelet 也需要设置该特性门控。 -当资源驱动程序使用控制平面控制器时,除了需要启用 `DynamicResourceAllocation` 外, -还必须启用 `DRAControlPlaneController` 特性门控。 +当资源驱动程序报告设备状态时,除了需要启用 `DynamicResourceAllocation` 外, +还必须启用 `DRAResourceClaimDeviceStatus` 特性门控。 -当可以创建设置了 `spec.controller` 字段的 ResourceClaim 时,控制平面控制器是受支持的。 -当 `DRAControlPlaneController` 特性被禁用时,存储 ResourceClaim 时该字段会自动被清除。 - +### 启用管理性质访问 {#enabling-admin-access} + +[管理性质访问](#admin-access) 是一个 **Alpha 级别特性**,仅在 kube-apiserver 和 kube-scheduler +中启用了 `DRAAdminAccess` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)时才生效。 + + +### 启用设备状态 {#enabling-device-status} + +[ResourceClaim 设备状态](#resourceclaim-device-status) 是一个 **Alpha 级别特性**, +仅在 kube-apiserver 中启用了 `DRAResourceClaimDeviceStatus` +[特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)时才生效。 + ## {{% heading "whatsnext" %}} - 了解更多该设计的信息, - 参阅[使用结构化参数的动态资源分配 KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4381-dra-structured-parameters) - 和[使用控制平面控制器的动态资源分配 KEP](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3063-dynamic-resource-allocation/README.md)。 + 参阅[使用结构化参数的动态资源分配 KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4381-dra-structured-parameters)。