在线扩容云硬盘

最近更新时间: 2025-02-18 16:02:00

操作场景

TKE 支持在线扩容 PV、对应的云硬盘及文件系统,即不需要重启 Pod 即可完成扩容。为确保文件系统的稳定性,建议在云硬盘文件系统处于未挂载状态时进行操作。

前提条件

  • 已将 CBS 更新为最新版本。
  • (可选)为避免扩容失败导致数据丢失,可以在扩容前使用快照备份数据。

操作步骤

创建允许扩容的 StorageClass

使用以下 YAML 创建允许扩容的 StorageClass,在 Storageclass 中设置 allowVolumeExpansiontrue。示例如下:

  • 复制
    复制成功
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cbs-csi-expand
parameters:
  diskType: CLOUD_PREMIUM
provisioner: com.abcd.cloud.csi.cbs
reclaimPolicy: Delete
volumeBindingMode: Immediate

在线扩容

提供以下扩容方式:

扩容方式说明
重启 Pod 的情况下在线扩容待扩容的云硬盘文件系统未被挂载,能够避免扩容出错以及方式2存在的问题。推荐使用该方式进行扩容

重启Pod情况下在线扩容

  1. 执行以下命令,确认扩容前 PV 和文件系统状态。示例如下,PV 和文件系统大小均为30G:

    • 复制
      复制成功
    $ kubectl exec ivantestweb-0 df /usr/share/nginx/html
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdd        30832548 44992  30771172   1% /usr/share/nginx/html
    $ kubectl get pv pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c 
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS   REASON   AGE
    pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c   30Gi       RWO            Delete           Bound    default/www1-ivantestweb-0   cbs-csi                 20h
  2. 执行以下命令,为 PV 对象打上一个非法 zone 标签,旨在下一步重启 Pod 后,使 Pod 无法调度到某个节点上。示例如下:

    • 复制
      复制成功
    $ kubectl label pv pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c failure-domain.beta.kubernetes.io/zone=nozone
    
  3. 执行以下命令重启 Pod,重启后由于 Pod 对应的 PV 的标签表明的是非法 zone,Pod 将处于 Pending 状态。示例如下:

    • 复制
      复制成功
    $ kubectl delete pod ivantestweb-0
    $ kubectl get pod ivantestweb-0
    NAME            READY   STATUS    RESTARTS   AGE
    ivantestweb-0   0/1     Pending   0          25s
    $ kubectl describe pod ivantestweb-0
    Events:
    Type     Reason            Age                 From               Message
    ----     ------            ----                ----               -------
    Warning  FailedScheduling  40s (x3 over 2m3s)  default-scheduler  0/1 nodes are available: 1 node(s) had no available volume zone.
  4. 执行以下命令,修改 PVC 对象中的容量,将容量扩容至40G。示例如下:

    • 复制
      复制成功
    kubectl patch pvc www1-ivantestweb-0 -p '{"spec":{"resources":{"requests":{"storage":"40Gi"}}}}'

    注意

    扩容后的PVC对象容量的大小必须为10的倍数。

  5. 执行以下命令,去除 PV 对象之前打上的标签, 标签去除之后 Pod 即可调度成功。示例如下:

    • 复制
      复制成功
    $ kubectl label pv pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c failure-domain.beta.kubernetes.io/zone-
    persistentvolume/pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c labeled
  6. 执行以下命令,可以查看到 Pod 状态为 Running、对应的 PV 和文件系统扩容成功,从30G扩容到40G。示例如下:

    • 复制
      复制成功
    $ kubectl get pod ivantestweb-0
    NAME            READY   STATUS    RESTARTS   AGE
    ivantestweb-0   1/1     Running   0          17m
    $ kubectl get pv pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS   REASON   AGE
    pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c   40Gi       RWO            Delete           Bound    default/www1-ivantestweb-0   cbs-csi                 20h
    $ kubectl get pvc www1-ivantestweb-0
    NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    www1-ivantestweb-0   Bound    pvc-e193201e-6f6d-48cf-b96d-ccc09225cf9c   40Gi       RWO            cbs-csi        20h
    $ kubectl exec ivantestweb-0 df /usr/share/nginx/html
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdd        41153760 49032  41088344   1% /usr/share/nginx/html