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)!

流程是:

  1. external-provisioner 启动时会连接 CSI 驱动的 Unix socket。
  2. 向驱动发送 GetPluginInfo 请求。
  3. 解析其中的 name 字段作为 provisioner name
  4. 它会监听所有 PVC,但只处理 StorageClass.provisioner == driver name 的 PVC。

http://example.com/2025/10/11/k8s/【k8s系列】external-provisioner源码解读/
作者
ningan123
发布于
2025年10月11日
许可协议