v3.5.0源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| 1 main() main函数位置:cmd/csi-provisioner 1.1 初始化了一堆参数 1.2 grpcClient, err := ctrl.Connect(*csiEndpoint, metricsManager) Connect函数位置:pkg/controller/controller.go 功能:连接一个 gRPC 服务端地址,并指定连接丢失时的处理方式以及指标监控支持。 csiEndpoint变量:代码启动时传入的参数 csiEndpoint = flag.String("csi-address", "/run/csi/socket", "The gRPC endpoint for Target CSI Volume.")
1.3 err = ctrl.Probe(grpcClient, *operationTimeout) ctrl ("github.com/kubernetes-csi/external-provisioner/pkg/controller") Probe函数位置:pkg/controller/controller.go 功能:不断地(无限重试)探测一个 CSI gRPC 服务端是否处于就绪状态。 1.3.1 rpc.ProbeForever(conn, singleCallTimeout) rpc ("github.com/kubernetes-csi/csi-lib-utils/rpc") `ProbeForever` 是 CSI 社区维护的一个通用函数,功能是:持续调用 CSI 的 `Probe()` 接口,直到探测成功或者 context 被取消。
1.4 provisionerName, err := ctrl.GetDriverName(grpcClient, *operationTimeout) 功能:通过已建立的 gRPC 连接,从 CSI 插件中获取它的驱动名(Driver Name)。
1.4.1 rpc.GetDriverName(ctx, conn) 内部会通过 gRPC 调用 CSI 插件提供的接口GetPluginInfo 1.4.1.1 client.GetPluginInfo(ctx, &req)
1.5 设置了指标的一些变量 1.6 pluginCapabilities, controllerCapabilities, err := ctrl.GetDriverCapabilities(grpcClient, *operationTimeout) 功能:从 CSI 插件中获取它声明支持的功能(capabilities),包括 Plugin 能力和 Controller 能力。 1.6.1
|
问题
假设集群里面部署了很多个external-provisioner,每个external-provisioner怎么知道自己该处理哪些pvc
【以下解释来自ChatGPT】
external-provisioner自动从 CSI 驱动报告的 GetPluginInfo
中获取 provisioner name
(即 driver name)!
流程是:
external-provisioner
启动时会连接 CSI 驱动的 Unix socket。
- 向驱动发送
GetPluginInfo
请求。
- 解析其中的
name
字段作为 provisioner name。
- 它会监听所有 PVC,但只处理
StorageClass.provisioner == driver name
的 PVC。