×

设备插件允许您在 OpenShift Container Platform Pod 中使用特定类型的设备(GPU、InfiniBand 或其他需要厂商特定初始化和设置的类似计算资源),而无需编写自定义代码。

了解设备插件

设备插件提供了一种一致且可移植的解决方案,用于跨集群使用硬件设备。设备插件通过扩展机制为这些设备提供支持,使这些设备可用于容器,提供这些设备的健康检查,并安全地共享它们。

OpenShift Container Platform 支持设备插件 API,但设备插件容器由各个厂商支持。

设备插件是在节点上运行的 gRPC 服务(独立于 `kubelet`),负责管理特定的硬件资源。任何设备插件都必须支持以下远程过程调用 (RPC)

service DevicePlugin {
      // GetDevicePluginOptions returns options to be communicated with Device
      // Manager
      rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {}

      // ListAndWatch returns a stream of List of Devices
      // Whenever a Device state change or a Device disappears, ListAndWatch
      // returns the new list
      rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}

      // Allocate is called during container creation so that the Device
      // Plug-in can run device specific operations and instruct Kubelet
      // of the steps to make the Device available in the container
      rpc Allocate(AllocateRequest) returns (AllocateResponse) {}

      // PreStartcontainer is called, if indicated by Device Plug-in during
      // registration phase, before each container start. Device plug-in
      // can run device specific operations such as resetting the device
      // before making devices available to the container
      rpc PreStartcontainer(PreStartcontainerRequest) returns (PreStartcontainerResponse) {}
}

设备插件示例

为了方便设备插件参考实现,设备管理器代码中有一个存根设备插件:vendor/k8s.io/kubernetes/pkg/kubelet/cm/deviceplugin/device_plugin_stub.go

部署设备插件的方法

  • 守护程序集是推荐的设备插件部署方法。

  • 启动后,设备插件将尝试在节点上的 /var/lib/kubelet/device-plugin/ 创建一个 UNIX 域套接字,以服务来自设备管理器的 RPC。

  • 由于设备插件必须管理硬件资源,访问主机文件系统以及套接字创建,因此必须在特权安全上下文中运行它们。

  • 有关部署步骤的更具体详细信息,请参阅每个设备插件实现。

了解设备管理器

设备管理器提供了一种机制,可以使用称为设备插件的插件来宣传专用节点硬件资源。

您可以宣传专用硬件,而无需任何上游代码更改。

OpenShift Container Platform 支持设备插件 API,但设备插件容器由各个厂商支持。

设备管理器将设备宣传为**扩展资源**。用户 Pod 可以使用与请求任何其他**扩展资源**相同的**Limit/Request** 机制来使用设备管理器宣传的设备。

启动后,设备插件通过调用/var/lib/kubelet/device-plugins/kubelet.sock 上的 `Register` 向设备管理器注册自身,并在/var/lib/kubelet/device-plugins/<plugin>.sock 启动 gRPC 服务以服务设备管理器请求。

设备管理器在处理新的注册请求时,会在设备插件服务上调用 `ListAndWatch` 远程过程调用 (RPC)。作为响应,设备管理器通过 gRPC 流从插件获取**设备**对象的列表。设备管理器将继续监视流中的新更新,来自插件。在插件端,插件也将保持流打开,每当任何设备的状态发生变化时,新的设备列表都会通过相同的流连接发送到设备管理器。

在处理新的 Pod 准入请求时,Kubelet 将请求的 `Extended Resources` 传递给设备管理器以进行设备分配。设备管理器检查其数据库以验证是否存在相应的插件。如果插件存在并且存在可分配的空闲设备以及本地缓存,则会在该特定设备插件上调用 `Allocate` RPC。

此外,设备插件还可以执行其他一些特定于设备的操作,例如驱动程序安装、设备初始化和设备重置。这些功能因实现而异。

启用设备管理器

启用设备管理器以实现设备插件,无需任何上游代码更改即可宣传专用硬件。

设备管理器提供了一种机制,可以使用称为设备插件的插件来宣传专用节点硬件资源。

  1. 通过输入以下命令,获取与要配置的节点类型的静态 `MachineConfigPool` CRD 关联的标签。执行以下步骤之一

    1. 查看机器配置

      # oc describe machineconfig <name>

      例如

      # oc describe machineconfig 00-worker
      示例输出
      Name:         00-worker
      Namespace:
      Labels:       machineconfiguration.openshift.io/role=worker (1)
      
      1 设备管理器所需的标签。
步骤
  1. 为您的配置更改创建自定义资源 (CR)。

    设备管理器 CR 的示例配置
    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: devicemgr (1)
    spec:
      machineConfigPoolSelector:
        matchLabels:
           machineconfiguration.openshift.io: devicemgr (2)
      kubeletConfig:
        feature-gates:
          - DevicePlugins=true (3)
    1 为 CR 命名。
    2 从机器配置池中输入标签。
    3 DevicePlugins设置为'true'。
  2. 创建设备管理器。

    $ oc create -f devicemgr.yaml
    示例输出
    kubeletconfig.machineconfiguration.openshift.io/devicemgr created
  3. 确保设备管理器已实际启用,方法是确认节点上已创建/var/lib/kubelet/device-plugins/kubelet.sock。这是设备管理器gRPC服务器监听新的插件注册的UNIX域套接字。只有在启用设备管理器时,启动Kubelet才会创建此套接字文件。