本文已发布一年以上。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.26:设备管理器正式发布

设备插件框架在 Kubernetes v1.8 版本中引入,作为一个与供应商无关的框架,用于启用外部设备的发现、声明和分配,而无需修改核心 Kubernetes。该功能在 v1.10 中升级为 Beta。随着最近 Kubernetes v1.26 的发布,设备管理器现在已全面可用 (GA)。

在 kubelet 中,设备管理器使用 gRPC 通过 Unix 套接字促进与设备插件的通信。设备管理器和设备插件都充当 gRPC 服务器和客户端,分别服务和连接到暴露的 gRPC 服务。设备插件提供 kubelet 连接的 gRPC 服务,用于设备发现、声明(作为扩展资源)和分配。设备管理器连接到 kubelet 提供的 Registration gRPC 服务,以在 kubelet 中注册自身。

请参阅文档,了解有关 pod 如何请求设备插件向集群公开的设备的示例

以下是一些设备插件的示例实现

自设备插件框架引入以来的值得注意的进展

Kubelet API 移动到 kubelet staging 仓库

外部 deviceplugin API 包从 v1.17 中的 k8s.io/kubernetes/pkg/kubelet/apis/ 移动到 k8s.io/kubelet/pkg/apis/。有关此更改背后的基本原理的更多详细信息,请参阅将面向外部的 kubelet API 移动到暂存

设备插件 API 更新

引入了额外的 gRPC 端点

  1. GetDevicePluginOptions 由设备插件使用,向 DeviceManager 传达选项,以指示是否支持 PreStartContainerGetPreferredAllocation 或其他未来可选调用,并且可以在将设备提供给容器之前调用。
  2. GetPreferredAllocation 允许设备插件将分配偏好转发给 DeviceManager,以便将其信息纳入其分配决策中。DeviceManager 将在 pod 准入时调用插件,请求从可用设备列表中首选的给定大小的设备分配,以便做出更明智的决策。例如,指定设备间约束,以指示在将设备分配给容器时首选最佳连接的设备集。
  3. 如果设备插件在注册阶段指示,则在每个容器启动之前调用 PreStartContainer。它允许设备插件在请求的设备上运行特定于设备的操作。例如,在容器开始运行之前重新配置或重新编程 FPGA。

引入这些更改的拉取请求在此处

  1. 如果插件需要,则在容器启动之前调用 preStart RPC 调用
  2. 将 GetPreferredAllocation() 调用添加到 v1beta1 设备插件 API

随着上述端点的引入,kubelet 中的设备管理器和设备管理器之间的交互可以如下所示

Representation of the Device Plugin framework showing the relationship between the kubelet and a device plugin

设备插件框架概述

设备插件注册过程的语义变化

设备插件代码已重构,以在 devicemanager 包下分离“plugin”包,为引入 v1beta2 设备插件 API 奠定基础。这将允许在 devicemanager 中添加对同时服务多个设备插件 API 的支持。

通过此重构工作,设备插件现在必须在向 kubelet 注册自身之前开始提供其 gRPC 服务。以前,这两个操作是异步的,设备插件可以在启动 gRPC 服务器之前注册自身,但现在情况并非如此。有关更多详细信息,请参阅PR #109016Issue #112395

动态资源分配

在 Kubernetes 1.26 中,受 Kubernetes 中如何处理持久卷的启发,引入了动态资源分配,以满足对资源要求更复杂的设备,例如

  1. 将设备初始化和分配与 pod 生命周期解耦。
  2. 促进容器和 pod 之间设备的动态共享。
  3. 支持自定义特定于资源的参数
  4. 启用特定于资源的设置和清理操作
  5. 启用对网络连接资源的支持,而不仅仅是节点本地资源

设备插件 API 现在稳定吗?

否,设备插件 API 仍然不稳定;可用的最新设备插件 API 版本是 v1beta1。社区计划引入 v1beta2 API,以一次服务多个插件 API。使用请求/响应类型的每个 API 调用将允许添加对较新 API 版本的支持,而无需显式升级 API。

除此之外,社区中还有现有提案,以引入额外的端点KEP-3162:向设备管理器 API 添加 Deallocate 和 PostStopContainer