前言

使用本地磁盘作为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会自动刷新配置

Categories: KUBERNETES

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *