KUBERNETES
kubernetes使用本地磁盘进行动态管理pv
前言 使用本地磁盘作为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 3 4 5 |
git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git cd sig-storage-local-static-provisioner/ git checkout tags/v2.6.0 -b v2.6.0 helm template ./helm/provisioner -f ./helm/provisioner/values.yaml > local-volume-provisioner.generated.yaml kubectl create -f local-volume-provisioner.generated.yaml |
1.2创建storageclass
1 2 3 4 5 6 |
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fast-disks provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer |
1.3挂载磁盘 其Provisioner本身其并不提供local volume,但它在各个节点上的provisioner会去动态的“发现”挂载点(discovery directory),当某node的provisioner在/mnt/fast-disks目录下发现有挂载点时,会创建PV,该PV的local.path就是挂载点,并设置nodeAffinity为该node。 可以用以下脚本通过mount bind方式创建和挂载磁盘
1 2 3 4 5 6 |
#!/bin/bash for i in $(seq 1 5); do mkdir -p /mnt/fast-disks-bind/vol${i} mkdir -p /mnt/fast-disks/vol${i} mount --bind /mnt/fast-disks-bind/vol${i} /mnt/fast-disks/vol${i} done |
下面是在各个node节点用以上脚本创建挂载点: 执行该脚本后,等待一会,执行查询pv命令,就可以发现自动创建了 1.4测试pod是否可以运行
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 35 |
apiVersion: apps/v1 kind: StatefulSet metadata: name: local-test spec: serviceName: "local-service" replicas: 3 selector: matchLabels: app: local-test template: metadata: labels: app: local-test spec: containers: - name: test-container image: busybox command: - "/bin/sh" args: - "-c" - "sleep 100000" volumeMounts: - name: local-vol mountPath: /tmp volumeClaimTemplates: - metadata: name: local-vol spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "fast-disks" resources: requests: storage: 2Gi |
可以看到, 三个pod都正常运行起来了: 第二章 使用local-path-provisioner 2.1下载yaml文件
1 |
wget https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.25/deploy/local-path-storage.yaml |
2.2 修改 其中有几处需要做修改 2.2.1 删除调试模式 删除–debug 2.2.2修改reclaimPolicy Read more…