device plugin具体是怎么跟kubelet进行交互的?

Kubernetes 的 Device Plugin 与 Kubelet 之间使用Unix Domain Socket,通过 gRPC 协议进行交互。

交互流程概述

整个交互过程主要包括插件注册、资源分配和资源回收三个关键阶段,下面是详细的步骤说明:

1. 插件注册

  • 监听套接字:Kubelet 启动后,会在节点上创建一个 Unix Domain Socket(UDS),并监听该套接字等待 Device Plugin 连接。通常,Kubelet 的 UDS 路径为 /var/lib/kubelet/device-plugins/kubelet.sock。
  • 插件启动:Device Plugin 启动时,会扫描节点上的硬件设备,收集设备信息,如设备 ID、健康状态等。
  • 建立连接:Device Plugin 会连接到 Kubelet 创建的 UDS,通过 gRPC 协议向 Kubelet 发起注册请求。
  • 注册请求:在注册请求中,Device Plugin 会提供以下信息:
    • 插件名称:用于标识该 Device Plugin。
    • 设备资源类型:例如 nvidia.com/gpu 表示 NVIDIA GPU 设备。
    • 设备列表:包含每个设备的详细信息,如设备 ID、健康状态等。
  • 注册响应:Kubelet 收到注册请求后,会验证请求信息的有效性。如果验证通过,Kubelet 会更新节点的资源信息,将这些设备资源添加到节点的可用资源列表中,并向 Device Plugin 返回注册成功的响应。

2. 资源分配

  • Pod 调度:当用户创建一个 Pod 并在其配置文件中请求使用特定硬件设备资源时,Kubernetes 调度器会根据节点的可用资源信息将 Pod 调度到拥有足够设备资源的节点上。
  • 分配请求:Pod 被调度到节点后,Kubelet 会根据 Pod 的资源请求,向对应的 Device Plugin 发起设备分配请求。分配请求中会包含所需的设备数量和资源类型等信息。
  • 分配响应:Device Plugin 收到分配请求后,会从可用设备列表中选择合适的设备分配给 Pod,并将分配的设备信息(如设备 ID)返回给 Kubelet。
  • 容器创建:Kubelet 在收到分配响应后,会将分配的设备信息传递给容器运行时(如 Docker),以便在创建容器时将设备挂载到容器中。

3. 资源回收

  • Pod 终止:当 Pod 被删除或者终止时,Kubelet 会通知对应的 Device Plugin 回收分配给该 Pod 的设备。
  • 回收操作:Device Plugin 收到回收通知后,会将这些设备标记为可用状态,以便后续的 Pod 使用。

代码示例(gRPC 服务定义)

以下是一个简化的 gRPC 服务定义示例,展示了 Device Plugin 和 Kubelet 之间的交互接口:

syntax = "proto3";

package deviceplugin;

// 设备信息
message Device {
  string ID = 1;
  string Health = 2;
}

// 注册请求
message RegisterRequest {
  string PluginName = 1;
  string ResourceName = 2;
  repeated Device Devices = 3;
}

// 注册响应
message RegisterResponse {
  bool Success = 1;
}

// 分配请求
message AllocateRequest {
  repeated ContainerAllocateRequest ContainerRequests = 1;
}

// 容器分配请求
message ContainerAllocateRequest {
  string ContainerID = 1;
  repeated string DevicesIDs = 2;
}

// 分配响应
message AllocateResponse {
  repeated ContainerAllocateResponse ContainerResponses = 1;
}

// 容器分配响应
message ContainerAllocateResponse {
  string ContainerID = 1;
  repeated string DevicesIDs = 2;
}

// Device Plugin 服务
service DevicePlugin {
  // 注册方法
  rpc Register(RegisterRequest) returns (RegisterResponse) {}
  // 分配方法
  rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
}

通过上述的 gRPC 服务定义,Device Plugin 和 Kubelet 可以进行有效的通信,实现硬件设备的注册、分配和回收等操作。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐