ワークロードが増加すると、Pod にマウントされたディスクボリュームの容量が不足することがあります。Container Service for Kubernetes (ACK) は、Kubernetes 1.16 以降で FlexVolume を使用したディスクボリュームのオンライン拡張をサポートしており、ほとんどの場合、Pod の再起動は不要です。このトピックでは、Pod が Running 状態を維持したまま拡張するシナリオと、Pod を再起動した後に拡張するシナリオの両方について説明します。
前提条件
開始する前に、以下が準備できていることを確認してください。
-
クラスター用の kubeconfig ファイルと、クラスターへの接続用に設定された kubectl。「kubectl を使用した ACK クラスターへの接続」をご参照ください。
-
storageClassNameパラメーターを含む永続ボリューム要求 (PVC) を介してマウントされる、動的にプロビジョニングされた永続ボリューム (PV)。 -
バージョン v1.14.8.109-5f88ade-aliyun 以降の FlexVolume プラグイン。ACK コンソールのクラスターコンポーネントページでアップグレードの有無を確認してください。
制限事項
ディスクボリュームを拡張する前に、以下の制約を確認してください。
| 制約 | 詳細 |
|---|---|
| 動的にプロビジョニングされた PV のみ | ストレージクラスを使用して動的にプロビジョニングされた PV のみがオンラインで拡張できます。インラインボリュームやベーシックディスクをバックエンドとするボリュームは、サービス中断なしでは拡張できません。 |
| 最大ディスクサイズ | 2,000 GiB 以下のディスクは、サービス中断なしで拡張できます。 |
| Pod が Running 状態であること | 拡張中、Pod は Running 状態を維持する必要があります。Running 状態でない場合は、代わりに再起動を伴う方法を使用してください。 |
ストレージクラスの要件
StorageClass には allowVolumeExpansion: true を設定する必要があります。ACK で作成された StorageClass ではこの値が自動的に設定されます。手動で作成した StorageClass の場合は、明示的に設定してください。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-available
provisioner: alicloud/disk
allowVolumeExpansion: true
データのバックアップ
拡張を実行する前にディスクスナップショットを作成し、拡張プロセス中のエラーによるデータ損失に備えてください。
RAM ロールへの ResizeDisk 権限の付与
ディスクボリュームを拡張する前に、クラスターのマスター RAM ロールに ResizeDisk 権限を付与してください。この権限がない場合、拡張リクエストは承認エラーを返します。
-
ACK コンソールにログインします。
-
左側のナビゲーションペインで、[クラスター]をクリックします。
-
クラスターを見つけ、[アクション] 列の [詳細] をクリックします。
-
左側のナビゲーションペインで、[クラスター情報] をクリックします。
-
[クラスターリソース] タブをクリックし、次に マスター RAM ロール の横にあるハイパーリンクをクリックします。
-
RAM コンソールで、ロールに ResizeDisk 権限を付与してください。詳細については、「カスタムポリシーのドキュメントと説明の変更」をご参照ください。

FlexVolume を使用する ACK 専用クラスターまたは ACK マネージドクラスターの場合は、上記の手順 1〜4 に従い、 [マスター RAM ロール] の横にあるハイパーリンクをクリックしてください。
Pod を再起動せずにディスクボリュームを拡張
この方法は、Pod が Running 状態の場合に使用します。ディスクはサービス中断なしでオンラインでリサイズされます。
現在の状態の確認
-
Pod が Running 状態であることを確認してください。
kubectl get pod想定される出力:
web-0 1/1 Running 0 42s -
Pod 内の現在のディスク使用率を確認してください。
kubectl exec web-0 -- df /data想定される出力:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 20511312 45080 20449848 1% /data現在のサイズは 20 GiB です。
-
PVC がバインドされていることを確認し、現在の容量を確認してください。
kubectl get pvc想定される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-ssd-web-0 Bound d-wz9hpoifm43yn9zie6gl 20Gi RWO alicloud-disk-available 57s
ボリュームの拡張
-
PVC にパッチを適用して、新しいストレージサイズをリクエストしてください。
kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'拡張が完了するまで約1分間待ってください。
拡張の確認
-
PV が 30 GiB に更新されたことを確認してください。
kubectl get pv d-wz9hpoifm43yn9zie6gl想定される出力:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE d-wz9hpoifm43yn9zie6gl 30Gi RWO Delete Bound default/disk-ssd-web-0 alicloud-disk-available 5m23s -
PVC が新しい容量を反映していることを確認してください。
kubectl get pvc想定される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-ssd-web-0 Bound d-wz9hpoifm43yn9zie6gl 30Gi RWO alicloud-disk-available 5m10s -
Pod 内で新しいディスクサイズが認識されていることを確認してください。
kubectl exec web-0 -- df /data想定される出力:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 30832548 45036 30771128 1% /dataディスクボリュームは、ダウンタイムなしで 20 GiB から 30 GiB に拡張されました。
Pod を再起動してディスクボリュームを拡張
この方法は、Pod を再起動するまでファイルシステムが新しいサイズを反映しない場合や、Pod が Running 状態でない場合に使用します。
現在の状態の確認
-
Pod のステータスを確認し、現在のディスクサイズを記録してください。
kubectl get pod想定される出力:
web-0 1/1 Running 0 42s -
Pod 内の現在のディスク使用率を確認してください。
kubectl exec web-0 -- df /data想定される出力:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 20511312 45080 20449848 1% /data -
PVC と PV がバインドされていることを確認してください。
kubectl get pvc kubectl get pv
Pod の再スケジューリングの防止
-
PV のゾーンラベルを検索してください。
kubectl get pv d-wz9g2j5qbo37r2lamkg4 -oyaml | grep failure-domain.beta.kubernetes.io/zone想定される出力:
failure-domain.beta.kubernetes.io/zone: cn-shenzhen-e -
Pod がスケジュールされないように、ゾーンラベルを無効な値に変更してください。
kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e-nozone --overwrite想定される出力:
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeled -
Pod を削除して再起動をトリガーしてください。ゾーンラベルがどのノードとも一致しないため、Pod は Pending 状態になります。
kubectl delete pod web-0Pod が Pending 状態であることを確認してください。
kubectl get pod想定される出力:
web-0 0/1 Pending 0 27s
ボリュームの拡張
-
PVC にパッチを適用して、新しいストレージサイズをリクエストしてください。
kubectl patch pvc disk-ssd-web-0 -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
Pod の復元
-
Pod が再びスケジュールされるように、元のゾーンラベルを復元してください。
kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e --overwrite想定される出力:
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeledPodが再起動し、拡張が完了するまで約1分間待ってください。
拡張の確認
-
Pod が Running 状態であることを確認してください。
kubectl get pod想定される出力:
web-0 1/1 Running 0 3m23s -
PVC が新しい容量を反映していることを確認してください。
kubectl get pvc想定される出力:
disk-ssd-web-0 Bound d-wz9g2j5qbo37r2lamkg4 30Gi RWO alicloud-disk-available 17m -
PV が新しい容量を反映していることを確認してください。
kubectl get pv d-wz9g2j5qbo37r2lamkg4想定される出力:
d-wz9g2j5qbo37r2lamkg4 30Gi RWO Delete Bound default/disk-ssd-web-0 alicloud-disk-available 17m -
Pod 内で新しいディスクサイズが認識されていることを確認してください。
kubectl exec web-0 -- df /data想定される出力:
/dev/vdb 30832548 45036 30771128 1% /dataディスクボリュームは 20 GiB から 30 GiB に拡張されました。