概要
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模闆:
https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/v1.14/examples/lvm/resizer/storageclass.yamlapiVersion: 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技術交流釘釘群:
