diff --git a/content/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md b/content/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md index 80fad2f03a..a848019cd8 100644 --- a/content/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md +++ b/content/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md @@ -256,6 +256,38 @@ The general workflow of a device plugin includes the following steps: 如果操作成功,则设备插件将返回 `AllocateResponse`,其中包含用于访问被分配的设备容器运行时的配置。 kubelet 将此信息传递到容器运行时。 + + `AllocateResponse` 包含零个或多个 `ContainerAllocateResponse` 对象。 + 设备插件在这些对象中给出为了访问设备而必须对容器定义所进行的修改。 + 这些修改包括: + + + * 注解 + * 设备节点 + * 环境变量 + * 挂载点 + * 完全限定的 CDI 设备名称 + + {{< note >}} + + 设备管理器处理完全限定的 CDI 设备名称时需要启用 `DevicePluginCDIDevices` 特性门控。 + 这是在 v1.28 版本中作为 Alpha 特性添加的。 + {{< /note >}} + ## 监控设备插件资源 {#monitoring-device-plugin-resources} -{{< feature-state for_k8s_version="v1.15" state="beta" >}} +{{< feature-state for_k8s_version="v1.28" state="stable" >}} ### `GetAllocatableResources` gRPC 端点 {#grpc-endpoint-getallocatableresources} -{{< feature-state state="beta" for_k8s_version="v1.23" >}} +{{< feature-state state="stable" for_k8s_version="v1.28" >}} -从 Kubernetes v1.23 开始,`GetAllocatableResources` 被默认启用。 -你可以通过关闭 `KubeletPodResourcesGetAllocatable` -[特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)来禁用。 - -在 Kubernetes v1.23 之前,要启用这一功能,`kubelet` 必须用以下标志启动: - -``` ---feature-gates=KubeletPodResourcesGetAllocatable=true -``` - -动态资源分配是一个用于在 Pod 之间和 Pod 内部容器之间请求和共享资源的新 API。 +动态资源分配是一个用于在 Pod 之间和 Pod 内部容器之间请求和共享资源的 API。 它是对为通用资源所提供的持久卷 API 的泛化。第三方资源驱动程序负责跟踪和分配资源。 不同类型的资源支持用任意参数进行定义和初始化。 @@ -49,10 +49,10 @@ Kubernetes v{{< skew currentVersion >}} 包含用于动态资源分配的集群 ## API {#api} `resource.k8s.io/v1alpha2` -{{< glossary_tooltip text="API 组" term_id="api-group" >}}提供四种新类型: +{{< glossary_tooltip text="API 组" term_id="api-group" >}}提供四种类型: -`core/v1` 的 `PodSpec` 在新的 `resourceClaims` 字段中定义 Pod 所需的 ResourceClaim。 +`core/v1` 的 `PodSpec` 在 `resourceClaims` 字段中定义 Pod 所需的 ResourceClaim。 该列表中的条目引用 ResourceClaim 或 ResourceClaimTemplate。 当引用 ResourceClaim 时,使用此 PodSpec 的所有 Pod (例如 Deployment 或 StatefulSet 中的 Pod)共享相同的 ResourceClaim 实例。 @@ -265,23 +265,58 @@ running Pods. For more information on the gRPC endpoints, see the kubelet 提供了一个 gRPC 服务,以便发现正在运行的 Pod 的动态资源。 有关 gRPC 端点的更多信息,请参阅[资源分配报告](/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources)。 - -## 限制 {#limitations} + -调度器插件必须参与调度那些使用 ResourceClaim 的 Pod。 -通过设置 `nodeName` 字段绕过调度器会导致 kubelet 拒绝启动 Pod, -因为 ResourceClaim 没有被保留或甚至根本没有被分配。 -未来可能[去除该限制](https://github.com/kubernetes/kubernetes/issues/114005)。 +## 预调度的 Pod + +当你(或别的 API 客户端)创建设置了 `spec.nodeName` 的 Pod 时,调度器将被绕过。 +如果 Pod 所需的某个 ResourceClaim 尚不存在、未被分配或未为该 Pod 保留,那么 kubelet +将无法运行该 Pod,并会定期重新检查,因为这些要求可能在以后得到满足。 + + +这种情况也可能发生在 Pod 被调度时调度器中未启用动态资源分配支持的时候(原因可能是版本偏差、配置、特性门控等)。 +kube-controller-manager 能够检测到这一点,并尝试通过触发分配和/或预留所需的 ResourceClaim 来使 Pod 可运行。 + + +然而,最好避免这种情况,因为分配给节点的 Pod 会锁住一些正常的资源(RAM、CPU), +而这些资源在 Pod 被卡住时无法用于其他 Pod。为了让一个 Pod 在特定节点上运行, +同时仍然通过正常的调度流程进行,请在创建 Pod 时使用与期望的节点精确匹配的节点选择算符: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: pod-with-cats +spec: + nodeSelector: + kubernetes.io/hostname: name-of-the-intended-node + ... +``` + + +你还可以在准入时变更传入的 Pod,取消设置 `.spec.nodeName` 字段,并改为使用节点选择算符。