天天看點

使用阿裡雲CSI Plugin實作LVM資料卷動态擴容

概要

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.yaml
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技術交流釘釘群:

使用阿裡雲CSI Plugin實作LVM資料卷動态擴容