前言
使用本地磁盘作为pv
kubernetes从1.10版本开始支持local volume(本地卷),workload(不仅是statefulsets类型)可以充分利用本地磁盘的优势,从而获取比remote volume(如nas, nfs, cephfs、RBD)更好的性能。
在local volume出现之前,statefulsets也可以利用本地磁盘,方法是配置hostPath,并通过nodeSelector或者nodeAffinity绑定到具体node上。但hostPath的问题是,管理员需要手动管理集群各个node的目录,不太方便。
以上无论是hostPath还是local volume都不支持动态扩容,并且程序移植改动比较大。
由于项目的需要,需要支持动态创建和扩容pv/pvc
本文参考了以下两个开源项目:
https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner
https://github.com/rancher/local-path-provisioner
经过测试:
- kubernetes-sigs版不支持动态扩容/动态供给dynamically provisioning,而且需要提前手动在node节点上创建并且mount对应的挂载点。
- Rancher版本的local-path-provisioner支持动态创建挂载点,动态创建pv
下面两种方法都介绍一下安全和使用方式,最后推荐使用第三章介绍的local-path-provisioner来进行动态创建pv
第一章 使用sig-storage-local-static-provisioner
1.1 拉取官方源码进行安装
1.2创建storageclass
1.3挂载磁盘
其Provisioner本身其并不提供local volume,但它在各个节点上的provisioner会去动态的“发现”挂载点(discovery directory),当某node的provisioner在/mnt/fast-disks目录下发现有挂载点时,会创建PV,该PV的local.path就是挂载点,并设置nodeAffinity为该node。
可以用以下脚本通过mount bind方式创建和挂载磁盘
下面是在各个node节点用以上脚本创建挂载点:
执行该脚本后,等待一会,执行查询pv命令,就可以发现自动创建了
1.4测试pod是否可以运行
可以看到, 三个pod都正常运行起来了:
第二章 使用local-path-provisioner
2.1下载yaml文件
2.2 修改
其中有几处需要做修改
2.2.1 删除调试模式
删除–debug
2.2.2修改reclaimPolicy
默认值是Delete,可以改成Retain,避免误删pv造成数据丢失
2.2.3修改StorageClass
增加annotations,使local-path storageclass成为默认storageclass
2.2.4修改最后面的configMap
修改paths目标路径为自己的本地磁盘存储目录
2.2.5下面是修改完的完整的local-path-storage.yaml:
注:镜像改更改为自己的镜像仓库地址
2.3安装
2.4使用
要使用这个动态pv时,storageClass设置为local-path就可以了,下面是测试: local-test-pod.yaml
查看,可以看到分别自动创建了三个pv和pvc:
看下pod信息:
可以看到,3个pod被分别调度到了172.20.32.69(两个)和172.20.32.171(一个)上
看一下node节点相应目录内容:
可以看到, 172.20.32.69上创建了两个目录
172.20.32.171上创建了一个目录:
2.5定制化配置
如果需要,也可以进一步进行定制化配置,比如可以定制每个节点的存储路径,示例如下:
DEFAULT_PATH_FOR_NON_LISTED_NODES表示默认存储位置,所有节点如果没有特别指定,都将使用这个路径。
172.20.32.69节点指定了两个目录,在分配pv时将随机指定一个目录创建pv。
172.20.32.171没有指定任何路径,那么该节点不会被分配pv
2.6 自动刷新配置
可以直接使用kubectl edit去修改上面的configmap,或者修改local-path-provisioner.yaml文件然后执行kubectl apply,local-path-provisioner会自动刷新配置
0 Comments