From b058c022bb06f550529f93e90a1f0c90cb5c4ba3 Mon Sep 17 00:00:00 2001 From: windsonsea Date: Sat, 10 Dec 2022 12:28:05 +0800 Subject: [PATCH] [zh] sync device-plugins.md --- .../compute-storage-net/device-plugins.md | 149 +++++++++++------- 1 file changed, 93 insertions(+), 56 deletions(-) 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 db0530d77f..a94af793a4 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 @@ -1,18 +1,21 @@ --- title: 设备插件 -description: 设备插件可以让你配置集群以支持需要特定于供应商设置的设备或资源,例如 GPU、NIC、FPGA 或非易失性主存储器。 +description: > + 设备插件可以让你配置集群以支持需要特定于供应商设置的设备或资源,例如 GPU、NIC、FPGA 或非易失性主存储器。 content_type: concept weight: 20 --- -{{< feature-state for_k8s_version="v1.10" state="beta" >}} +{{< feature-state for_k8s_version="v1.26" state="stable" >}} ### 示例 {#example-pod} * 插件通过 Unix socket 在主机路径 `/var/lib/kubelet/device-plugins/kubelet.sock` 处向 kubelet 注册自身。 @@ -244,15 +250,14 @@ to the container runtime. ### Handling kubelet restarts A device plugin is expected to detect kubelet restarts and re-register itself with the new -kubelet instance. In the current implementation, a new kubelet instance deletes all the existing Unix sockets -under `/var/lib/kubelet/device-plugins` when it starts. A device plugin can monitor the deletion +kubelet instance. A new kubelet instance deletes all the existing Unix sockets under +`/var/lib/kubelet/device-plugins` when it starts. A device plugin can monitor the deletion of its Unix socket and re-register itself upon such an event. --> ### 处理 kubelet 重启 {#handling-kubelet-restarts} 设备插件应能监测到 kubelet 重启,并且向新的 kubelet 实例来重新注册自己。 -在当前实现中,当 kubelet 重启的时候,新的 kubelet 实例会删除 `/var/lib/kubelet/device-plugins` -下所有已经存在的 Unix 套接字。 +新的 kubelet 实例启动时会删除 `/var/lib/kubelet/device-plugins` 下所有已经存在的 Unix 套接字。 设备插件需要能够监控到它的 Unix 套接字被删除,并且当发生此类事件时重新注册自己。 ## API 兼容性 {#api-compatibility} -Kubernetes 设备插件支持还处于 beta 版本。所以在稳定版本出来之前 API 会以不兼容的方式进行更改。 +之前版本控制方案要求设备插件的 API 版本与 Kubelet 的版本完全匹配。 +自从此特性在 v1.12 中进阶为 Beta 后,这不再是硬性要求。 +API 是版本化的,并且自此特性进阶 Beta 后一直表现稳定。 +因此,kubelet 升级应该是无缝的,但在稳定之前 API 仍然可能会有变更,还不能保证升级不会中断。 + +{{< caution >}} + +尽管 Kubernetes 的设备管理器(Device Manager)组件是正式发布的特性, +但**设备插件 API** 还不稳定。有关设备插件 API 和版本兼容性的信息, +请参阅[设备插件 API 版本](/zh-cn/docs/reference/node/device-plugin-api-versions/)。 +{{< caution >}} + + 作为一个项目,Kubernetes 建议设备插件开发者: -* 注意未来版本的更改 +* 注意未来版本中设备插件 API 的变更。 * 支持多个版本的设备插件 API,以实现向后/向前兼容性。 -如果你启用 DevicePlugins 功能,并在需要升级到 Kubernetes 版本来获得较新的设备插件 API -版本的节点上运行设备插件,请在升级这些节点之前先升级设备插件以支持这两个版本。 + +若在需要升级到具有较新设备插件 API 版本的某个 Kubernetes 版本的节点上运行这些设备插件, +请在升级这些节点之前先升级设备插件以支持这两个版本。 采用该方法将确保升级期间设备分配的连续运行。 这一 `List` 端点提供运行中 Pod 的资源信息,包括类似独占式分配的 CPU ID、设备插件所报告的设备 ID 以及这些设备分配所处的 NUMA 节点 ID。 @@ -406,7 +434,7 @@ message ContainerDevices { {{< note >}} @@ -450,6 +479,7 @@ update and Kubelet needs to be restarted to reflect the correct resource capacit 如果目标是评估空闲/未分配的资源,此调用应该与 List() 端点一起使用。 除非暴露给 kubelet 的底层资源发生变化,否则 `GetAllocatableResources` 得到的结果将保持不变。 这种情况很少发生,但当发生时(例如:热插拔,设备健康状况改变),客户端应该调用 `GetAlloctableResources` 端点。 + 然而,调用 `GetAllocatableResources` 端点在 cpu、内存被更新的情况下是不够的, Kubelet 需要重新启动以获取正确的资源容量和可分配的资源。 {{< /note >}} @@ -466,12 +496,10 @@ message AllocatableResourcesResponse { 从 Kubernetes v1.23 开始,`GetAllocatableResources` 被默认启用。 你可以通过关闭 `KubeletPodResourcesGetAllocatable` @@ -479,12 +507,15 @@ Preceding Kubernetes v1.23, to enable this feature `kubelet` must be started wit 在 Kubernetes v1.23 之前,要启用这一功能,`kubelet` 必须用以下标志启动: -`--feature-gates=KubeletPodResourcesGetAllocatable=true` +``` +--feature-gates=KubeletPodResourcesGetAllocatable=true +``` `ContainerDevices` 会向外提供各个设备所隶属的 NUMA 单元这类拓扑信息。 NUMA 单元通过一个整数 ID 来标识,其取值与设备插件所报告的一致。 @@ -500,7 +531,8 @@ DaemonSet, `/var/lib/kubelet/pod-resources` must be mounted as a {{< glossary_tooltip term_id="volume" >}} in the device monitoring agent's [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core). -Support for the `PodResourcesLister service` requires `KubeletPodResources` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) to be enabled. +Support for the `PodResourcesLister service` requires `KubeletPodResources` +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) to be enabled. It is enabled by default starting with Kubernetes 1.15 and is v1 since Kubernetes 1.20. --> gRPC 服务通过 `/var/lib/kubelet/pod-resources/kubelet.sock` 的 UNIX 套接字来提供服务。 @@ -524,7 +556,9 @@ gRPC 服务通过 `/var/lib/kubelet/pod-resources/kubelet.sock` 的 UNIX 套接 {{< feature-state for_k8s_version="v1.18" state="beta" >}} 拓扑管理器是 Kubelet 的一个组件,它允许以拓扑对齐方式来调度资源。 为了做到这一点,设备插件 API 进行了扩展来包括一个 `TopologyInfo` 结构体。 @@ -540,17 +574,18 @@ message NUMANode { ``` 设备插件希望拓扑管理器可以将填充的 TopologyInfo 结构体作为设备注册的一部分以及设备 ID 和设备的运行状况发送回去。然后设备管理器将使用此信息来咨询拓扑管理器并做出资源分配决策。 @@ -577,8 +612,10 @@ pluginapi.Device{ID: "25102017", Health: pluginapi.Healthy, Topology:&pluginapi. Here are some examples of device plugin implementations: * The [AMD GPU device plugin](https://github.com/RadeonOpenCompute/k8s-device-plugin) -* The [Intel device plugins](https://github.com/intel/intel-device-plugins-for-kubernetes) for Intel GPU, FPGA, QAT, VPU, SGX, DSA, DLB and IAA devices -* The [KubeVirt device plugins](https://github.com/kubevirt/kubernetes-device-plugins) for hardware-assisted virtualization +* The [Intel device plugins](https://github.com/intel/intel-device-plugins-for-kubernetes) for + Intel GPU, FPGA, QAT, VPU, SGX, DSA, DLB and IAA devices +* The [KubeVirt device plugins](https://github.com/kubevirt/kubernetes-device-plugins) for + hardware-assisted virtualization * The [NVIDIA GPU device plugin for Container-Optimized OS](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu) * The [RDMA device plugin](https://github.com/hustcat/k8s-rdma-device-plugin) * The [SocketCAN device plugin](https://github.com/collabora/k8s-socketcan)