local-volume-provisioner

这是一个Local StorageClass自动管理工具,大致流程是这样子的:

  1. 部署一个local-volume-provisioner
  2. 设定好可发现目录(discovery directory)
  3. 管理员可发现目录(discovery directory)挂载了新目录
  4. provisioner将自动创建好 PV(自动选择合适的名字,路径,nodeAffinity, 容量)
  5. 这个PV将可以被合适的PVC所使用
  6. 一旦Pod删除了,PVC也删除也,PV将会被回收,数据将会删除,触发第4步的流程

官方博客有详细的介绍:https://kubernetes.io/blog/2018/04/13/local-persistent-volumes-beta/ 本文主要参考了Github:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/helm/README.md#custom-your-deployment-with-values-file

基础环境

$ kubectl version --short
Client Version: v1.15.3
Server Version: v1.15.3

开始部署

git clone --depth=1 https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git
cd sig-storage-local-static-provisioner
helm template ./helm/provisioner -f ./helm/provisioner/values.yaml > local-volume-provisioner.generated.yaml
kubectl create -f local-volume-provisioner.generated.yaml

默认情况下,local-volume-provisioner.generated.yaml这里配置的是ext4格式,而我的centos使用的是xfs文件格式,这时候需要简单修改一下。

创建一个fast-disks的StorageClass,local-fast-disks.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: fast-disks
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
kubectl apply -f local-fast-disks.yaml

此时,已经部署完毕,先验证一下部署情况

kubectl describe daemonsets local-volume-provisioner
kubectl describe pod local-volume-provisioner-xkvzv  | less # 找到运行节点,为 k8s-node1
kubectl logs -f local-volume-provisioner-xkvzv # 追踪日志,这后边有用

验证结果

我们刚刚日志查看的是k8s-node1上的local-volume-provisioner-xkvzv这个pod,现在前往 k8s=node1挂载一个目录测试一下。

默认的可发现目录(discovery directory)是/mnt/fast-disks,挂载到这里的目录必须是mount进来,手动创建目录是不会被自动转换为PV的。

此时,我们可以通过mount --bind来模拟挂载一个磁盘:

mkdir -p /mnt/fake-disks/sda
mkdir -p /mnt/fast-disks/sda
mount --bind /mnt/fake-disks/sda /mnt/fast-disks/sda

稍等一会,通过kubectl get pv就可以看到结果了:

$ kubectl get pv | grep local
local-pv-b5e2ac38   39Gi       RWO            Delete           Available                                       fast-disks                     21m

问题排查

错误提示:”fast-disks” not found

:E0918 11:44:39.805314       1 discovery.go:217] Failed to get ReclaimPolicy from storage class "fast-disks": storageclass.storage.k8s.io "fast-disks" not found

这是由于未创建 fast-disks 这个StorageClass导致的,按上方的local-fast-disks.yaml进行配置即可。

错误提示:not an actual mountpoint

E0918 11:44:49.815396       1 discovery.go:301] Path "/mnt/fast-disks/sda" is not an actual mountpoint

这是由于”/mnt/fast-disks/sda”目录未挂载磁盘导致的,通过mount挂载一个磁盘,或者–bind一个目录即可解决问题。