雲盤擴容方案文章清單:
基于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(當時還不支援),可以考慮為符合這個場景;
此場景雲盤事情過程:
- 更新StroageClass,添加allowVolumeExpansion(true)配置,參考“場景一”第1步;
- 擴容雲盤動态資料卷;參考“場景一”第3步;
場景三:靜态資料卷擴容
當使用者先建立好了雲盤,通過靜态資料卷方式手動建立PV并挂載,這個場景的PV中一般沒有配置StorageClassName或者配置的StorageClassName隻為了辨別作用(例如配置為disk);這時即需要對靜态存儲卷進行擴容;
注:靜态存儲卷不支援動态擴容,是以需要暫停應用,重新建立PVC、PV;
這個場景的擴容原則是:将目前的靜态資料卷改造成動态資料卷;
步驟:
- 删除應用、PVC、PV,業務需要暫停,注意:給雲盤打快照,且不能删除雲盤;
- 建立新PVC、PV,模闆中添加stroageClassName(value值具體選擇哪個storageClass需要根據雲盤的類型,例如:SSD、ESSD),且确認配置的stroageClass具有allowVolumeExpansion(true)配置;
- 重新建立應用挂載資料卷;
靜态存儲卷的另一個擴容方式是:業務停止後
手動擴容雲盤,但pvc、pv不修改的話,以後需要擴容的時候還是要手動擴容,是以上述步驟有其意義所在。
總結:
雲盤資料卷擴容隻支援動态存儲卷,且StorageClass需要配置allowVolumeExpansion為True。不符合這個需求的場景進行資料卷擴容時,需要改造StorageClass、PVC、PV,使之符合動态擴容條件;
需要注意的是,“資料卷擴容說明”、“資料卷擴容配置”部分指出了動态資料卷擴容所需要的條件,必須滿足上述條件才能進行擴容操作。
附錄:
給雲盤擴容需要為叢集的”Worker RAM 角色“添加ResizeDisk權限:
在叢集 --> 管理 --> 叢集資源 點選”Worker RAM 角色“;編輯Ram權限,添加ResizeDisk如下圖:
