天天看點

使用阿裡雲Flexvolume插件實作雲盤資料卷動态擴容

雲盤擴容方案文章清單:

基于Flexvolume插件的雲盤動态存儲卷擴容方案(本文);

基于CSI插件的雲盤動态存儲卷擴容方案:

參考

不适合動态擴容的場景,可以使用手動擴容雲盤存儲卷方案:

資料卷擴容說明:

符合以下要求的叢集環境可以進行動态擴容操作:

Kubernetes從1.13版本開始支援Flexvolume插件實作資料卷擴容; 實作

;阿裡雲ACK不支援1.13版本,是以需要您的Kubernetes叢集版本大于等于1.14;

Flexvolume要求版本不低于v1.14.6.15-8d3b7e7-aliyun;

普通雲盤類型不支援動态擴容,請參考

使用手動擴容雲盤方案

不支援InlineVolume類型(非PV、PVC方式)雲盤資料卷擴容;

切記:做資料卷擴容前,先對雲盤打快照備份,以防擴容過程異常導緻資料出現問題;

資料卷擴容配置需求:

對叢集的要求:

對雲盤擴容操作需要調用 雲盤擴容相應API ,是以需要叢集具有此API的調用權限,可以參考 叢集權限 文檔為叢集添加此權限;可參考附錄。

對PV的要求:

隻有動态存儲卷才可以進行資料卷動态擴容,即配置了StorageClassName的PV;

對StorageClass的要求:

PVC配置的StorageClass為阿裡雲雲盤類型,provisioner為alicloud/disk;

StorageClass需要配置:AllowVolumeExpansion: True,

具體含義參考 ,如果目前pv使用的storageClass沒有配置AllowVolumeExpansion為True,可以安裝下面步驟更新;

資料卷擴容步驟:

雲盤動态資料卷在滿足上述要求的情況下,可以實作動态擴容:

步驟1:擴容存儲卷,此步驟會調整PV的Size大小;

操作:# kubectl patch pvc pvc-disk -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
           

步驟2:擴容檔案系統,此步驟會調整雲盤、PVC、檔案系統大小;

操作:重新開機Pod;
           

場景示例:

下面給出三個常見的擴容場景,并給出相應擴容步驟:

場景一:可擴容的動态卷,建立動态資料卷時StorageClass配置了AllowVolumeExpansion(true);

場景二:不可擴容的動态卷,建立動态資料卷時StorageClass沒有配置AllowVolumeExpansion(true);

場景三:靜态資料卷,使用已有雲盤手動建立資料卷,并挂載使用;

場景一針對的是:在建立動态資料卷的時候就配置StorageClass的AllowVolumeExpansion為true,後續可以直接進行資料卷擴容。雲盤資料卷的“使用方式”推薦使用這個方式;

場景二針對的是:之前版本不支援動态卷擴容時建立的動态資料卷,當時沒有配置AllowVolumeExpansion為true。這個場景可以通過更新StorageClass配置來擷取和場景一一緻的效果。

場景三針對的是:一些使用者已經手動建立了雲盤,手動建立PV後挂載使用,這個場景也是通過改造PV、PVC來模拟場景一;

場景一:可擴容動态卷

此場景是說直接建立可擴容動态資料卷,并為資料卷擴容。這種使用方式為雲盤推薦的使用方式;

此場景的雲盤使用過程如下:

1. 確定StorageClass符合擴容條件

期望的StorageClass如下:

# kubectl describe sc alicloud-disk-ssd
Name:            alicloud-disk-ssd
IsDefaultClass:  No
Provisioner:           alicloud/disk
Parameters:            type=cloud_ssd
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>           

如果目前StorageClass中沒有定義AllowVolumeExpansion,或者值為False,通過下面指令進行更新:

# kubectl patch sc alicloud-disk-ssd -p '{"allowVolumeExpansion": true}'
           

2. 建立資料卷、應用

通過下面PVC模闆建立動态資料卷:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-disk
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: alicloud-disk-ssd
  resources:
    requests:
      storage: 20Gi           

建立應用挂載資料卷(模闆略);

檢視應用和資料卷資訊:

# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          12m

# kubectl get pvc
NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
pvc-disk   Bound    d-wz955czz7lmobytaa0f1   20Gi       RWO            alicloud-disk-ssd   13m

# kubectl get pv
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS        REASON   AGE
d-wz955czz7lmobytaa0f1   20Gi       RWO            Delete           Bound    default/pvc-disk   alicloud-disk-ssd            12m           
原始挂載雲盤大小為20G,建立測試檔案:
# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb         20G   45M   20G   1% /data

# ls /data
lost+found
# touch /data/aliyun

# ls /data
aliyun    lost+found           

3. 擴容動态資料卷:

步驟一:擴容PVC,檢視PVC、PV、檔案系統大小:

執行擴容指令:
# kubectl patch pvc pvc-disk -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
persistentvolumeclaim/pvc-disk patched

PV擴容完成,但PVC、雲盤、檔案系統大小尚未變化,即應用可用存儲空間并沒有變化;
# kubectl get pvc
NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
pvc-disk   Bound    d-wz955czz7lmobytaa0f1   20Gi       RWO            alicloud-disk-ssd   37m

# kubectl get pv
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS        REASON   AGE
d-wz955czz7lmobytaa0f1   30Gi       RWO            Delete           Bound    default/pvc-disk   alicloud-disk-ssd            36m

# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb         20G   45M   20G   1% /data           

步驟二:重新開機Pod,擴容檔案系統:

重新開機Pod:
# kubectl delete pod web-0
pod "web-0" deleted

雲盤、PVC、PV、檔案系統都擴容到了30G:
# kubectl get pvc
NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
pvc-disk   Bound    d-wz955czz7lmobytaa0f1   30Gi       RWO            alicloud-disk-ssd   40m

# kubectl get pv
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS        REASON   AGE
d-wz955czz7lmobytaa0f1   30Gi       RWO            Delete           Bound    default/pvc-disk   alicloud-disk-ssd            40m

測試檔案依然存儲,保證了資料的可用性:
# kubectl exec -ti web-0 sh
# df -h | grep data
/dev/vdb         30G   44M   30G   1% /data
# ls /data/
aliyun    lost+found           

通過上面兩步完成了動态資料卷的擴容操作(卷擴容 + 檔案系統擴容);

場景二:不可擴容動态卷

不可擴容動态卷,是指動态資料卷對應的StorageClass沒有配置allowVolumeExpansion為true;

這類資料卷的擴容主要思想是:改造對應的StorageClass,配置allowVolumeExpansion為true,然後使用與“場景一”相同的擴容步驟;

場景二與場景一的差別:

場景一是用配置了allowVolumeExpansion為True 的 StorageClass建立的PV;

場景二是用沒有配置allowVolumeExpansion為True的 StorageClass建立的PV;

對于現存的正在使用的雲盤動态資料卷,如果您建立動态卷的時候StorageClass沒有配置allowVolumeExpansion為True(當時還不支援),可以考慮為符合這個場景;

此場景雲盤事情過程:

  1. 更新StroageClass,添加allowVolumeExpansion(true)配置,參考“場景一”第1步;
  2. 擴容雲盤動态資料卷;參考“場景一”第3步;

場景三:靜态資料卷擴容

當使用者先建立好了雲盤,通過靜态資料卷方式手動建立PV并挂載,這個場景的PV中一般沒有配置StorageClassName或者配置的StorageClassName隻為了辨別作用(例如配置為disk);這時即需要對靜态存儲卷進行擴容;

注:靜态存儲卷不支援動态擴容,是以需要暫停應用,重新建立PVC、PV;
           

這個場景的擴容原則是:将目前的靜态資料卷改造成動态資料卷;

步驟:

  1. 删除應用、PVC、PV,業務需要暫停,注意:給雲盤打快照,且不能删除雲盤;
  2. 建立新PVC、PV,模闆中添加stroageClassName(value值具體選擇哪個storageClass需要根據雲盤的類型,例如:SSD、ESSD),且确認配置的stroageClass具有allowVolumeExpansion(true)配置;
  3. 重新建立應用挂載資料卷;

靜态存儲卷的另一個擴容方式是:業務停止後

手動擴容雲盤

,但pvc、pv不修改的話,以後需要擴容的時候還是要手動擴容,是以上述步驟有其意義所在。

總結:

雲盤資料卷擴容隻支援動态存儲卷,且StorageClass需要配置allowVolumeExpansion為True。不符合這個需求的場景進行資料卷擴容時,需要改造StorageClass、PVC、PV,使之符合動态擴容條件;

需要注意的是,“資料卷擴容說明”、“資料卷擴容配置”部分指出了動态資料卷擴容所需要的條件,必須滿足上述條件才能進行擴容操作。

附錄:

給雲盤擴容需要為叢集的”Worker RAM 角色“添加ResizeDisk權限:

在叢集 --> 管理 --> 叢集資源 點選”Worker RAM 角色“;編輯Ram權限,添加ResizeDisk如下圖:

使用阿裡雲Flexvolume插件實作雲盤資料卷動态擴容