这篇文章发布已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否仍然准确。

Kubernetes 1.26:设备管理器进入 GA

设备插件框架在 Kubernetes v1.8 版本中引入,作为一个供应商独立的框架,可以在不修改核心 Kubernetes 的情况下实现外部设备的发现、发布和分配。该功能在 v1.10 版本中进入 Beta 阶段。随着 Kubernetes v1.26 的最新发布,设备管理器现已正式发布 (GA)。

在 kubelet 内部,设备管理器通过 Unix 域套接字使用 gRPC 促进与设备插件的通信。设备管理器和设备插件都充当 gRPC 服务器和客户端,分别提供服务和连接暴露的 gRPC 服务。设备插件提供一个 gRPC 服务,kubelet 连接到该服务以进行设备发现、发布(作为扩展资源)和分配。设备管理器连接到由 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 迁移到 staging

设备插件 API 更新

引入了额外的 gRPC 端点

  1. 设备插件使用 GetDevicePluginOptionsDeviceManager 通信选项,以指示是否支持 PreStartContainerGetPreferredAllocation 或其他未来的可选调用,以及这些调用是否可以在设备对容器可用之前调用。
  2. GetPreferredAllocation 允许设备插件将分配偏好转发给 DeviceManager,以便后者可以将其信息纳入分配决策。DeviceManager 会在 Pod 准入时调用插件,要求从可用设备列表中获取给定大小的优先设备分配,从而做出更明智的决策。例如,在为容器分配设备时,指定设备间的约束以指示对最佳连接设备集的偏好。
  3. PreStartContainer 会在每个容器启动前被调用,如果设备插件在注册阶段指定了需要此调用。它允许设备插件对所请求的设备执行特定于设备的操作。例如,在容器开始运行之前重新配置或重新编程 FPGA。

引入这些更改的 Pull Request 在这里

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

通过引入上述端点,kubelet 中的设备管理器与设备插件之间的交互可以如下图所示

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

设备插件框架概述

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

设备插件代码被重构,将 'plugin' 包分离到 devicemanager 包下,为引入 v1beta2 设备插件 API 奠定基础。这将允许 devicemanager 添加同时支持多个设备插件 API 的功能。

通过此次重构工作,现在设备插件必须先启动其 gRPC 服务,然后才能向 kubelet 注册自身。之前,这两个操作是异步的,设备插件可以在启动 gRPC 服务器之前注册,现在不再是这样了。更多详情,请参阅 PR #109016Issue #112395

动态资源分配

在 Kubernetes 1.26 中,受 Kubernetes 处理 Persistent Volumes 的方式启发,引入了 动态资源分配,以满足具有更复杂资源需求的设备,例如

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

设备插件 API 现在稳定了吗?

不,设备插件 API 仍然不稳定;最新的设备插件 API 版本是 v1beta1。社区计划引入 v1beta2 API 以同时支持多个插件 API。具有请求/响应类型的每个 API 调用将允许添加对更新 API 版本的支持,而无需显式提升 API 版本。

此外,社区中还有引入额外端点的现有提议 KEP-3162:将 Deallocate 和 PostStopContainer 添加到 Device Manager API