之前在rancher上实战了一下local path的持久卷provisioner, 也读一读它的源码加深下映像.
配置文件
还是先贴一下配置文件:
1 | apiVersion: storage.k8s.io/v1 |
源代码关键的就是两个go文件,一个main.go, 一个provisioner.go, 接下来分别分析
main.go
main.go中大多数都是在进行一些逻辑的判断, 比如解析启动参数,解析configmap配置等.
比较重要的关键代码:
1 | func startDaemon(c *cli.Context) error { |
这里引用了pvController.NewProvisionController
,这个函数是控制循环,比较复杂,本人太菜,有些看不透,可能还是对k8s的控制循环的理解不到位, 感兴趣的可以自行分析,源代码controller.go
简单理解就是这里启动了Provisioner的控制循环,这个控制循环主要检测的是provisioner对象, 这里又涉及到2个关键的接口
1 | type Provisioner interface { |
还有
1 | type ProvisionOptions struct { |
这两个对象主要在provisioner.go中引用
provisioner.go
LocalPathProvisioner
实现了Provisioner
接口
主要的就是Provision
方法,关键代码:
1 | func (p *LocalPathProvisioner) Provision(opts pvController.ProvisionOptions) (*v1.PersistentVolume, error) { |
追一下createhelperPod
1 | func (p *LocalPathProvisioner) createHelperPod(action ActionType, cmdsForPath []string, name, path, node string) (err error) { |
这个方法中还有判断容器运行是否成功的语句, 通过这种方式,pv目录就创建成功了。
流程
所以整个流程变成: 集群管理员只需要将local-path-dymanic发布到集群中, 如果需要使用持久化存储,只需要声明pvc, 指定local-path-dymanic的storageClass,local-path-dymanic则会自动在调度的Node上新建出pv目录,pv pvc bound,整个流程完成.
具体的使用可参考
参考文章:
- https://izsk.me/2020/07/24/Kubernetes-Rancher-local-path-provisioner/
- https://github.com/rancher/local-path-provisioner
- https://github.com/rancher/local-path-provisioner/blob/master/vendor/sigs.k8s.io/sig-storage-lib-external-provisioner/controller/controller.go
- https://github.com/rancher/local-path-provisioner/blob/master/vendor/sigs.k8s.io/sig-storage-lib-external-provisioner/controller/volume.go