隨著業務發展和應用數據增長,當云盤使用空間不足時,您可以通過云盤擴容來解決磁盤容量不足的問題。1.16之前的Kubernetes版本不支持云盤自動擴容,您需要手動擴容云盤。本文介紹如何通過手動擴容云盤增加云盤空間。
使用說明
手動擴容云盤存儲卷需要您在ECS側完成云盤擴容,集群內資源不受影響,即PVC和PV的容量顯示不變。
使用限制
僅支持擴容32 TiB及以下容量的云盤。
為盡量保證集群內PV與PVC的容量顯示與實際一致,對于Kubernetes 1.16及更高的版本,推薦選擇動態在線擴容云盤存儲卷。
數據備份
擴容存儲卷前,先執行云盤快照備份數據,以防擴容過程異常導致數據丟失。
適用范圍
PV類型為靜態云盤存儲卷。
基于云盤的穩定性需求,提供以下兩種擴容方式:
方式一:不暫停應用手動在線擴容:文件系統在線擴容時,如果IO流量高,文件系統存在出現IO報錯的風險,但應用可以不重啟。
方式二:暫停應用手動擴容:應用停止后,磁盤IO會暫停,文件系統擴容數據更安全,但應用會暫停一段時間。
查看云盤使用信息
本文以MySQL有狀態應用為例,介紹兩種擴容方式。參考以下操作,查看云盤的使用信息。
執行以下命令,查看MySQL應用的Pod。
kubectl get pod | grep mysql
預期輸出:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 11h mysql-1 1/1 Running 0 11h
執行以下命令,查看MySQL應用的PVC。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-pvc-1 Bound d-0jlhaq*** 20Gi RWO alicloud-disk-topology-alltype 11h disk-pvc-2 Bound d-0jl0j5*** 20Gi RWO alicloud-disk-topology-alltype 11h
執行以下命令查看MySQL應用的PV。
kubectl get pv
預期輸出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE d-0jl0j5*** 20Gi RWO Delete Bound default/disk-pvc-1 alicloud-disk-topology-alltype 11h d-0jlhaq*** 20Gi RWO Delete Bound default/disk-pvc-1 alicloud-disk-topology-alltype 11h
從以上預期輸出可得:示例應用MySQL使用了20 GiB的
d-0jl0j5***
和d-0jlhaq***
云盤,分別掛載在2個Pod上。
關于如何部署MySQL有狀態應用的具體操作,請參見創建有狀態工作負載StatefulSet。
方式一:不暫停應用手動在線擴容
根據PV信息找到對應的云盤,手動對云盤擴容,然后在云盤對應掛載節點手動執行文件系統擴容。以下示例介紹如何把2個云盤擴容到30 GiB。
步驟一:云盤存儲卷擴容
登錄ECS管理控制臺。
在左側導航欄,選擇 。
找到MySQL應用對應的云盤d-0jl0j5***及d-0jlhaq***,查看云盤狀態,然后在各自操作列選擇 。
在磁盤擴容頁面,選中在線擴容,并輸入擴容后容量,例如30 GiB。
說明設置的擴容后容量不允許小于當前容量。
仔細閱讀并選中《云服務器ECS服務條款》,確認費用后單擊確認擴容。
具體操作,請參見擴大云盤容量。
閱讀磁盤擴容須知后,單擊已閱讀,繼續擴容,完成費用支付。
在云盤頁面查看云盤容量是否擴容成功。
步驟二:文件系統擴容
擴容云盤后,需要完成對文件系統的擴容,否則容器內存儲空間依然是擴容前的大小。
此步驟僅針對未分區云盤,是K8s中云盤的標準使用方法,不建議在K8s系統中使用分區云盤。
若PV使用未分區云盤,則不能手動執行分區操作,否則將會對當前文件系統產生破壞,造成數據丟失。
若PV使用分區云盤,則需要擴容分區設備后擴容文件系統。具體操作,請參見擴容分區和文件系統(Linux)或擴容分區和文件系統(Windows)。
查看當前云盤掛載節點。
登錄ECS管理控制臺。
在左側導航欄,選擇 。
找到MySQL應用對應的云盤d-0jl0j5***及d-0jlhaq***,分別單擊云盤名稱。
在云盤詳情頁面的掛載實例列表中單擊所掛載的實例,然后在實例詳情頁簽查看實例網絡信息。
說明您也可以在K8s中查看該云盤對應Pod所在的節點。具體操作,請參見查看容器組(Pod)。
連接到掛載云盤的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。
執行以下命令,擴容文件系統。
resize2fs /dev/vdc
預期輸出:
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.
執行以下命令,驗證文件系統擴容結果。
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
執行以下命令,將Pod縮容為0個副本。
kubectl scale sts mysql --replicas=0
預期輸出:
statefulset.apps/mysql scaled
執行以下命令,查看Pod是否刪除。
kubectl get pod | grep mysql
無輸出,代表已刪除MySQL應用。
步驟二:云盤存儲卷擴容
登錄ECS管理控制臺。
在左側導航欄,選擇 。
找到MySQL應用對應的云盤d-0jl0j5***及d-0jlhaq***,查看云盤狀態,然后在各自操作列選擇 。
在磁盤擴容頁面配置擴容方式及擴容后容量。
若云盤處于待掛載狀態,在磁盤擴容頁面無需選中在線擴容,輸入擴容后容量,例如30 GiB。
若云盤處于使用中狀態,在磁盤擴容頁面選中在線擴容,并輸入擴容后容量。
說明設置的擴容后容量不允許小于當前容量。
仔細閱讀并選中《云服務器ECS服務條款》,確認費用后單擊確認擴容。
具體操作,請參見步驟一:擴容云盤容量。
閱讀磁盤擴容須知后,單擊已閱讀,繼續擴容,完成費用支付。
步驟三:文件系統擴容
擴容云盤后,需要完成對文件系統的擴容,否則容器內存儲空間依然是擴容前的大小。
此步驟僅針對未分區云盤,是K8s中云盤的標準使用方法,不建議在K8s系統中使用分區云盤。
若PV使用未分區云盤,則不能手動執行分區操作,否則將會對當前文件系統產生破壞,造成數據丟失。
若PV使用分區云盤,則需要擴容分區設備后擴容文件系統。具體操作,請參見擴容分區和文件系統(Linux)或擴容分區和文件系統(Windows)。
可選:將待掛載云盤掛載到某個ECS節點。
說明需要將云盤掛載到ECS節點上才可實現文件系統擴容。
登錄ECS管理控制臺。
在左側導航欄,選擇 。
對于待掛載狀態的云盤,在操作列選擇 。
在掛載云盤對話框,選擇目標實例并設置云盤相關釋放行為。
配置項
說明
目標實例
選擇需要掛載的ECS實例。
云盤隨實例釋放
選中此選項,釋放實例時會自動釋放此云盤。 如果未選中,當實例被釋放時該云盤會被保留下來。
說明如果您掛載的是從其他實例卸載的系統盤,云盤隨實例釋放中的實例指系統盤被卸載前的源ECS實例,并非當前操作的實例。
自動快照隨云盤釋放
選中此選項,當云盤釋放時該云盤創建的自動快照都會一起釋放。建議您不要選擇該選項,以便保留備份數據。
單擊執行掛載。
如果該云盤的狀態變為使用中,表示掛載成功。
連接到掛載云盤的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-
后的字符串。可選:若上述操作無法獲取到云盤設備符,請按以下操作獲取。
將目標云盤卸載后執行
ls /dev/vd*
命令查看云盤列表。將目標云盤掛載后執行
ls /dev/vd*
命令查看云盤列表。比較上述獲取的云盤列表,多出來的云盤即為目標云盤。
執行以下命令,擴容文件系統。
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.
驗證文件系統擴容結果。
執行以下命令,創建臨時文件夾/mnt/disk/,并將云盤掛載到臨時文件夾上。
mkdir /mnt/disk mount /dev/vdb /mnt/disk/
執行以下命令,查看文件系統大小。
df /mnt/disk/
預期輸出:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 30832548 45036 30771128 1% /mnt/disk
從以上預期輸出可得:臨時文件夾/dev/vdb的容量為30 GiB,說明已經擴容成功。
執行以下命令,將云盤從臨時文件夾卸載。
umount /mnt/disk
步驟四:重啟應用
執行以下命令,將Pod擴容為2個副本。
kubectl scale sts mysql --replicas=2
預期輸出:
statefulset.apps/mysql scaled
執行以下命令,查看Pod是否恢復。
kubectl get pod | grep mysql
預期輸出:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 74s mysql-1 1/1 Running 0 42s
執行以下命令,查看文件系統大小。
kubectl exec mysql-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
后再嘗試擴容。