全部產品
Search
文件中心

:手動擴容雲端硬碟資料卷

更新時間:Jun 19, 2024

隨著業務發展和應用資料增長,當雲端硬碟使用空間不足時,您可以通過雲端硬碟擴容來解決磁碟容量不足的問題。但Container ServiceKubernetes 1.16之前的舊版本不支援雲端硬碟自動擴容,您需要手動擴容雲端硬碟。本文介紹如何通過手動擴容雲端硬碟增加雲端硬碟空間。

使用說明

  • 使用限制

    僅支援擴容32 TiB及以下容量的雲端硬碟。

  • 資料備份

    擴容資料卷前,先執行雲端硬碟快照備份資料,以防擴容過程異常導致資料丟失。

  • 適用範圍

    PV類型為靜態雲端硬碟資料卷。

雲端式盤的穩定性需求,提供以下兩種擴容方式:

查看雲端硬碟使用資訊

本文以Web有狀態應用為例,介紹兩種擴容方式。參考以下操作,查看雲端硬碟的使用資訊。

  1. 執行以下命令,查看Web應用的Pod。
    kubectl get pod | grep web

    預期輸出:

    NAME                               READY   STATUS    RESTARTS   AGE
    web-0                              1/1     Running   0          11h
    web-1                              1/1     Running   0          11h
  2. 執行以下命令,查看Web應用的PVC。
    kubectl get pvc | grep web

    預期輸出:

    NAME             STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS         AGE
    disk-ssd-web-0   Bound    d-0jlhaq***   20Gi       RWO            alicloud-disk-essd   11h
    disk-ssd-web-1   Bound    d-0jl0j5***   20Gi       RWO            alicloud-disk-essd   11h
  3. 執行以下命令查看Web應用的PV。
    kubectl get pv | grep web

    預期輸出:

    NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS        REASON    AGE
    d-0jl0j5***   20Gi       RWO            Delete           Bound    default/disk-ssd-web-1   alicloud-disk-essd            11h
    d-0jlhaq***   20Gi       RWO            Delete           Bound    default/disk-ssd-web-0   alicloud-disk-essd            11h

    從以上預期輸出可得:樣本應用Web使用了20 GiB的d-0jl0j5***d-0jlhaq***雲端硬碟,分別掛載在2個Pod上。

關於如何部署Web有狀態應用的具體操作,請參見建立有狀態工作負載StatefulSet

方式一:不暫停應用手動線上擴容

根據PV資訊找到對應的雲端硬碟,手動對雲端硬碟擴容,然後在雲端硬碟對應掛載節點手動執行檔案系統擴容。以下樣本介紹如何把2個雲端硬碟擴容到30 GiB。

步驟一:雲端硬碟資料卷擴容

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇儲存與快照 > 雲端硬碟

  3. 找到Web應用對應的雲端硬碟d-0jl0j5***d-0jlhaq***,查看雲端硬碟狀態,然後在各自操作列選擇更多 > 擴容
  4. 磁碟擴容頁面,選中線上擴容,並輸入擴容後容量,例如30 GiB。
    說明 設定的擴容後容量不允許小於當前容量。
  5. 仔細閱讀並選中《Elastic Compute Service服務條款》,確認費用後單擊確認擴容
    具體操作,請參見擴大雲端硬碟容量
  6. 閱讀磁碟擴容須知後,單擊已閱讀,繼續擴容,完成費用支付。
    雲端硬碟頁面查看雲端硬碟容量是否擴容成功。

步驟二:檔案系統擴容

擴容雲端硬碟後,需要完成對檔案系統的擴容,否則容器記憶體儲空間依然是擴容前的大小。

重要 此步驟僅針對未分區雲端硬碟,是K8s中雲端硬碟的標準使用方法,不建議在K8s系統中使用分區雲端硬碟。
  1. 查看當前雲端硬碟掛載節點。
    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇儲存與快照 > 雲端硬碟

    3. 找到Web應用對應的雲端硬碟d-0jl0j5***d-0jlhaq***,分別單擊雲端硬碟名稱。
    4. 雲端硬碟詳情頁面的掛載執行個體列表中單擊所掛載的執行個體,然後在執行個體詳情頁簽查看執行個體網路資訊
      說明 也可通過在K8s中查看該雲端硬碟對應Pod所在的節點。具體操作,請參見查看容器組(Pod)
  2. 串連到掛載雲端硬碟的ECS執行個體節點上,擷取雲端硬碟裝置符。
    關於如何串連到ECS執行個體節點,請參見串連方式概述

    可通過以下方法擷取雲端硬碟裝置符。

    • 擷取雲端硬碟裝置符
    • 執行以下命令擷取雲端硬碟d-0jlhaq***的裝置符。
      # 查詢 {pv-name}
      mount |grep d-0jlhaq*** 

      預期輸出:

      /dev/vdc on /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-0jlhaq***/globalmount type ext4 (rw,relatime)
      /dev/vdc on /var/lib/kubelet/pods/a26d174f-***/volumes/kubernetes.io~csi/d-0jlhaq***/mount type ext4 (rw,relatime)

      從以上預期輸出可得:所掛載的雲端硬碟d-0jlhaq***在當前節點的裝置符為/dev/vdc

  3. 執行以下命令,擴容檔案系統。
    resize2fs /dev/vdc
    說明 /dev/vdc步驟2擷取的雲端硬碟裝置符。

    預期輸出:

    resize2fs 1.43.5 (04-Aug-2017)
    Filesystem at /dev/vdc is mounted on /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-0jlhaq***/globalmount; on-line resizing required
    old_desc_blocks = 3, new_desc_blocks = 4
    The filesystem on /dev/vdc is now 7864320 (4k) blocks long.
  4. 執行以下命令,驗證檔案系統擴容結果。
    lsblk /dev/vdc

    預期輸出:

    NAME MAJ:MIN  RM SIZE RO TYPE MOUNTPOINT
    vdc  254:32   0  30G  0  disk /var/lib/kubelet/pods/a26d174f-***/volumes/kubernetes.io~csi/d-0jlhaq***/mount

    從以上預期輸出可得,vdc檔案系統儲存空間為30 GiB。

方式二:暫停應用手動擴容

通過刪除StatefulSet或者將Replica配置為0的方式暫停應用,手動對每個依賴資料盤擴容,然後再啟動應用。以下樣本如何把2個雲端硬碟擴容到30 GiB。

步驟一:刪除應用Pod

  1. 執行以下命令,將Pod縮容為0個副本。
    kubectl scale sts web --replicas=0

    預期輸出:

    statefulset.apps/web scaled
  2. 執行以下命令,查看Pod是否刪除。
    kubectl get pod | grep web

    無輸出,代表已刪除Web應用。

步驟二:雲端硬碟資料卷擴容

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇儲存與快照 > 雲端硬碟

  3. 找到Web應用對應的雲端硬碟d-0jl0j5***d-0jlhaq***,查看雲端硬碟狀態,然後在各自操作列選擇更多 > 擴容
  4. 磁碟擴容頁面配置擴容方式及擴容後容量。
    • 若雲端硬碟處於待掛載狀態,在磁碟擴容頁面無需選中線上擴容,輸入擴容後容量,例如30 GiB。
    • 若雲端硬碟處於使用中狀態,在磁碟擴容頁面選中線上擴容,並輸入擴容後容量
    說明 設定的擴容後容量不允許小於當前容量。
  5. 仔細閱讀並選中《Elastic Compute Service服務條款》,確認費用後單擊確認擴容
    具體操作,請參見步驟一:擴容雲端硬碟容量
  6. 閱讀磁碟擴容須知後,單擊已閱讀,繼續擴容,完成費用支付。

步驟三:檔案系統擴容

擴容雲端硬碟後,需要完成對檔案系統的擴容,否則容器記憶體儲空間依然是擴容前的大小。

重要 此步驟僅針對未分區雲端硬碟,是K8s中雲端硬碟的標準使用方法,不建議在K8s系統中使用分區雲端硬碟。
  1. 可選:將待掛載雲端硬碟掛載到某個ECS節點。
    說明 需要將雲端硬碟掛載到ECS節點上才可實現檔案系統擴容。
    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇儲存與快照 > 雲端硬碟

    3. 對於待掛載狀態的雲端硬碟,在操作列選擇更多 > 掛載
    4. 掛載雲端硬碟對話方塊,選擇目標執行個體並設定雲端硬碟相關釋允許存取為。
      配置項說明
      目標執行個體選擇需要掛載的ECS執行個體。
      雲端硬碟隨執行個體釋放選中此選項,釋放執行個體時會自動釋放此雲端硬碟。 如果未選中,當執行個體被釋放時該雲端硬碟會被保留下來。
      說明 如果您掛載的是從其他執行個體卸載的系統硬碟,雲端硬碟隨執行個體釋放中的執行個體指系統硬碟被卸載前的源ECS執行個體,並非當前操作的執行個體。
      自動快照隨雲端硬碟釋放選中此選項,當雲端硬碟釋放時該雲端硬碟建立的自動快照都會一起釋放。建議您不要選擇該選項,以便保留備份資料。
    5. 單擊執行掛載
    如果該雲端硬碟的狀態變為使用中,表示掛載成功。
  2. 串連到掛載雲端硬碟的ECS執行個體節點上,擷取雲端硬碟裝置符。
    關於如何串連到ECS執行個體節點,請參見串連方式概述
    • 執行以下命令擷取雲端硬碟裝置符。
      for device in `ls /sys/block | grep vd`; do 
        cat /sys/block/$device/serial | grep 0jlhaq*** && echo $device; 
      done
      說明 0jlhaq***為擴容雲端硬碟IDd-0jlhaq***d-後的字串。
    • 可選:若上述操作無法擷取到雲端硬碟裝置符,請按以下操作擷取。
      1. 將目標雲端硬碟卸載後執行ls /dev/vd*命令查看雲端硬碟列表。
      2. 將目標雲端硬碟掛載後執行ls /dev/vd*命令查看雲端硬碟列表。
      3. 比較上述擷取的雲端硬碟列表,多出來的雲端硬碟即為目標雲端硬碟。
  3. 執行以下命令,擴容檔案系統。
    resize2fs /dev/vdb
    說明 /dev/vdb步驟2擷取的雲端硬碟裝置符。

    預期輸出:

    resize2fs 1.43.5 (04-Aug-2017)
    Resizing the filesystem on /dev/vdb to 7864320 (4k) blocks.
    The filesystem on /dev/vdb is now 7864320 (4k) blocks long.
  4. 驗證檔案系統擴容結果。
    1. 執行以下命令,建立臨時檔案夾/mnt/disk/,並將雲端硬碟掛載到臨時檔案夾上。
      mkdir /mnt/disk
      mount /dev/vdb /mnt/disk/
    2. 執行以下命令,查看檔案系統大小。
      df /mnt/disk/

      預期輸出:

      Filesystem     1K-blocks  Used Available Use% Mounted on
      /dev/vdb        30832548 45036  30771128   1% /mnt/disk

      從以上預期輸出可得:臨時檔案夾/dev/vdb的記憶體為30 GiB,說明已經擴容成功。

    3. 執行以下命令,將雲端硬碟從臨時檔案夾卸載。
      umount /mnt/disk

步驟四:重啟應用

  1. 執行以下命令,將Pod擴容為2個副本。
    kubectl scale sts web --replicas=2

    預期輸出:

    statefulset.apps/web scaled
  2. 執行以下命令,查看Pod是否恢複。
    kubectl get pod | grep web

    預期輸出:

    NAME         READY   STATUS    RESTARTS   AGE
    web-0        1/1     Running   0          74s
    web-1        1/1     Running   0          42s
  3. 執行以下命令,查看檔案系統大小。
    kubectl exec web-0 -- df /data

    預期輸出:

    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/vdb        30832548 45036  30771128   1% /data

    從以上預期輸出可得,/dev/vdb檔案系統儲存空間為30 GiB。

在執行resize2fs命令後出現如下錯誤提示

resize of device /dev/xxx failed: exit status 1 resize2fs output: resize2fs xxx(version)
Please run `e2fsck -f /dev/xxx` first
問題原因

因為不滿足檔案系統的一致性導致IO崩潰。

解決方案

請按照提示執行e2fsck -f /dev/xxx後再嘗試擴容。