k8s CSI 插件注册原理
一、CSI Driver 如何注册到 kubelet 的
1、启动 CSI Node Server
-
CSI Node Server 启动,CSI plugin(CSI driver)创建 Unix Domain Socket (
csi-driver.sock
)。 -
位置 : 通常位于
/var/lib/kubelet/plugins/<drivername.example.com>/csi.sock
。 -
用途 : 用于后续 kubelet 与 CSI Node Server 之间的通信。
2、启动 Node Driver Registrar
-
Node Driver Registrar 启动,并创建 Unix Domain Socket (
reg.sock
)。 -
位置 : 通常位于
/var/lib/kubelet/plugins_registry/<drivername.example.com>-reg.sock
。 -
用途 : 用于 kubelet 与 Node Driver Registrar 之间的通信。
-
实现逻辑 : Node Driver Registrar 实现 GetInfo 和 NotifyRegistrationStatus 方法。
3、Node Driver Registrar 获取 CSI Plugin 信息
-
Node Driver Registrar 连接到 CSI plugin(CSI driver) 的 Unix Domain Socket (
csi-driver.sock
)。 -
Node Driver Registrar 调用 Identity Server 的 GetPluginInfo 方法以获取 获取 CSI plugin 的 driver 名称。
-
通信方式 : Unix Domain Socket 通过 gRPC 协议。
4、Kubelet 发现 Node Driver Registrar
-
Kubelet 的pluginManager 模块通过 Watcher 监控 /var/lib/kubelet/plugins_registry/ 目录。
-
Kubelet 发现 Node Driver Registrar 的 Unix Domain Socket (reg.sock)。
-
Kubelet 通过 Unix Domain Socket (reg.sock) 调用 GetInfo 方法以获取 csi plugin 类型、csi plugin 的 driver 名称、csi plugin 暴露的 grpc 服务 socket 地址以及 csi plugin 支持的版本。
-
通信方式 : Unix Domain Socket 通过 gRPC 协议。
5、Kubelet 获取 Node Server 信息
-
Kubelet 使用从 Node Driver Registrar 获取的 socket 地址 (csi-driver.sock) 连接到 CSI Node Server。
-
Kubelet 调用 Node Server 的 NodeGetInfo 方法以获取 Node Server 的详细信息,如nodeID、存储卷最大挂载数、拓扑信息。
-
通信方式 : Unix Domain Socket 通过 gRPC 协议。
6、更新 Node 和 CSINode 对象
-
Kubelet 根据从 Node Server 获取的信息更新 Node 节点的 Annotations。
-
Kubelet 创建或更新 CSINode 对象以记录 Node Server 支持的 CSI Plugin 信息。
7、通知注册状态
-
Kubelet 通过 Unix Domain Socket (reg.sock) 调用 Node-Driver-Registrar 的 NotifyRegistrationStatus 方法以通知 Node-driver-registrar 注册是否成功。
-
通信方式 : Unix Domain Socket 通过 gRPC 协议。