概要
LVM存储类型为本地存储,并非可随着Pod迁移的可插拔的分布式存储方案,如果Pod期望在多个节点上使用相同的lvm卷,则需要在每个节点上都创建相同名字的lvm卷,这样Pod调度的时候可以继续使用相同的lvm卷名进行挂载。然而这样势必会造成有些节点上的lvm卷空间浪费,解决浪费的问题,可以通过将pod固定在某个节点运行,减少调度,这样只会在这个节点上创建需要的lvm卷。
阿里云容器服务CSI插件支持LVM数据卷的挂载、管理功能,可以动态创建LVM卷并挂载使用。且在最新的版本中可以通过修改pvc的大小,动态扩容lvm卷的大小,在重启应用Pod时进行文件系统扩容。
LVM实现原则:
Provision Lvm数据卷的过程中,只会创建lvm类型pv对象,不会真正在节点上创建lvm volume;
创建lvm卷需要在已有的vg基础上进行,即需要手动在集群中创建vg;
Pod启动的时候,检查本地是否有相应的LVM卷,如果没有这个卷,则会创建lvm卷并挂载;
如果Pod启动时,lvm卷已经存在,则检查卷大小和需求是否一致,实际卷小于pv需求时,进行lvm扩容;
目前没有实现删除lvm卷的功能,需要手动到节点删除;
部署CSI LVM插件
1. 创建K8S集群
在阿里云ACK控制台创建1.14版本k8s集群,创建集群时选择使用csi类型插件;
2. 调整集群参数,使支持CSI扩容
更新kube-controller参数,在/etc/kubernetes/manifests/kube-controller-manager.yaml中添加:
- --feature-gates=ExpandCSIVolumes=true
在所有负载节点更新kubelet参数,在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 添加:
--feature-gates=ExpandCSIVolumes=true
重启kubelet:
systemctl daemon-reload
service kubelet restart
3. 部署CSI LVM插件
下载LVM Plugin、Provisioner模板:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/lvm-plugin.yaml
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/lvm-provisioner.yaml
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/deploy/lvm/resizer/csi-resizer.yaml
创建CSI组件:
# kubectl create -f lvm-plugin.yaml
# kubectl create -f lvm-provisioner.yaml
# kubectl create -f csi-resizer.yaml
检查插件部署完成:
# kubectl get pod -nkube-system | grep lvm
csi-lvm-plugin-6kx6z 2/2 Running 0 16h
csi-lvm-plugin-cgd7j 2/2 Running 0 16h
csi-lvm-plugin-kg5pn 2/2 Running 0 16h
csi-lvm-plugin-ld7rz 2/2 Running 0 16h
csi-lvm-plugin-xjmmr 2/2 Running 0 16h
csi-lvm-provisioner-0 1/1 Running 1 16h
csi-lvm-resizer-0 1/1 Running 0 16h
# kubectl get csidriver | grep lvm
lvmplugin.csi.alibabacloud.com 2019-10-09T07:51:14Z
部署应用使用LVM卷
1. 创建StorageClass:
下载StorageClass模板:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-lvm
provisioner: lvmplugin.csi.alibabacloud.com
parameters:
vgName: vgtest
reclaimPolicy: Delete
allowVolumeExpansion: true
provisioner: 配置为lvmplugin.csi.alibabacloud.com 驱动;
parameters:定义生成lvm卷参数;vgName定义lvm数据卷依赖的vg名字,vg需要预先在集群中创建;
allowVolumeExpansion:配置为true时,允许数据卷实现扩容功能;
# kubectl get sc | grep lvm
csi-lvm lvmplugin.csi.alibabacloud.com 19h
2. 创建PVC
下载PVC模板:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/pvc.yaml
# kubectl create -f pvc.yaml
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
lvm-pvc Bound lvm-7726e77b-eb2b-11e9-a442-00163e07fb69 2Gi RWO csi-lvm 3s
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
lvm-7726e77b-eb2b-11e9-a442-00163e07fb69 2Gi RWO Delete Bound default/lvm-pvc csi-lvm 14s
3. 创建应用
下载应用模板:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/deploy.yaml
可以在模板中添加nodeSelector(nodeName)来限制pod启动的节点;
# kubectl create -f deploy.yaml
# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployment-lvm-cddcd84fb-5rkrj 1/1 Running 0 12s
// Pod内部挂载的lvm卷大小为2G;
# kubectl exec deployment-lvm-cddcd84fb-5rkrj df | grep data
/dev/mapper/vgtest-lvm--7726e77b--eb2b--11e9--a442--00163e07fb69 1998672 6144 1871288 1% /data
到pod所在节点检查lvm卷信息,大小为2G:
# lvdisplay /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
--- Logical volume ---
LV Path /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
LV Name lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
VG Name vgtest
LV UUID hKsRqO-oG1w-0uE1-6Unz-hpP9-le4N-pGVzDS
LV Write Access read/write
LV Creation host, time iZ8vb1wy4teeoa0ql4bjq3Z, 2019-10-10 14:59:23 +0800
LV Status available
# open 1
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:3
原理:Pod启动时在其运行的节点上,自动创建lvm数据卷(vg下面)并挂载使用;
4. lvm卷扩容
扩容PVC,从2G变成3G,扩容后PV已经变成了3G,但pvc需要pod重启后(文件系统扩容)才可以变成3G;
// expand pvc from 2G to 3G
# kubectl patch pvc lvm-pvc -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'
persistentvolumeclaim/lvm-pvc patched
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
lvm-pvc Bound lvm-7726e77b-eb2b-11e9-a442-00163e07fb69 2Gi RWO csi-lvm 9m33s
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
lvm-7726e77b-eb2b-11e9-a442-00163e07fb69 3Gi RWO Delete Bound default/lvm-pvc csi-lvm 9m34s
原理:此时lvm数据卷并没有变化,只是pv对象的size变化;lvm卷大小和文件系统大小都是在pod启动挂载卷的时候执行扩容的。
重启Pod,实现lvm卷扩容:
# kubectl delete pod deployment-lvm-cddcd84fb-5rkrj
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
lvm-pvc Bound lvm-7726e77b-eb2b-11e9-a442-00163e07fb69 3Gi RWO csi-lvm 5m24s
// Pod内部挂载的lvm卷也已经扩容到3G;
# kubectl exec deployment-lvm-cddcd84fb-dsmxx df | grep data
/dev/mapper/vgtest-lvm--7726e77b--eb2b--11e9--a442--00163e07fb69 3030800 6144 2861476 1% /data
登陆pod所在节点,查看lvm卷信息:
# lvdisplay /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
--- Logical volume ---
LV Path /dev/vgtest/lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
LV Name lvm-7726e77b-eb2b-11e9-a442-00163e07fb69
VG Name vgtest
LV UUID hKsRqO-oG1w-0uE1-6Unz-hpP9-le4N-pGVzDS
LV Write Access read/write
LV Creation host, time iZ8vb1wy4teeoa0ql4bjq3Z, 2019-10-10 14:59:23 +0800
LV Status available
# open 1
LV Size 3.00 GiB
Current LE 768
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:3
更多使用细节请参考:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/docs/lvm-resizer.md
欢迎加入CSI技术交流钉钉群: