ワークロードの増大に伴い、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 のみ | StorageClass を使用して動的にプロビジョニングされた PV のみがオンラインで拡張できます。インラインボリュームおよび基本ディスクをバックエンドとするボリュームは、サービスを中断せずに拡張することはできません。 |
| 最大ディスクサイズ | 2,000 GiB 以下のディスクは、サービスを中断せずに拡張できます。 |
| Pod は Running 状態である必要があります | 拡張中、Pod は Running 状態を維持する必要があります。Running 状態でない場合は、代わりに再起動ベースのメソッドを使用してください。 |
StorageClass の要件
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 権限の付与
ディスクボリュームを拡張する前に、クラスターの Master RAM ロールに ResizeDisk 権限を付与します。この権限がない場合、拡張リクエストは権限付与エラーを返します。
ACK コンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター] をクリックします。
対象のクラスターを見つけ、[操作] 列の [詳細] をクリックします。
左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。
[クラスターリソース] タブをクリックし、Master RAM ロールの横にあるハイパーリンクをクリックします。
RAM コンソールで、ロールに ResizeDisk 権限を付与します。詳細については、「カスタムポリシーのドキュメントと説明を変更する」をご参照ください。

FlexVolume を使用する ACK 専用クラスターまたは ACK マネージドクラスターの場合は、上記の手順 1~4 に従い、Master RAM ロールの横にあるハイパーリンクをクリックします。
Pod を再起動せずにディスクボリュームを拡張
このメソッドは、Pod が Running 状態の場合に使用します。ディスクはオンラインでサイズ変更され、サービスの中断はありません。
現在の状態の確認
Pod が Running 状態であることを確認します。
kubectl get pod期待される出力:
web-0 1/1 Running 0 42sPod 内の現在のディスク使用量を確認します。
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 5m23sPVC に新しい容量が反映されていることを確認します。
kubectl get pvc kubectl get pv期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-ssd-web-0 Bound d-wz9hpoifm43yn9zie6gl 30Gi RWO alicloud-disk-available 5m10sPod 内で新しいディスクサイズが認識されていることを確認します。
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 42sPod 内の現在のディスク使用量を確認します。
kubectl exec web-0 -- df /data期待される出力:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb 20511312 45080 20449848 1% /dataPVC と 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-ePod がスケジュールされないように、ゾーンラベルを無効な値に変更します。
kubectl label pv d-wz9g2j5qbo37r2lamkg4 failure-domain.beta.kubernetes.io/zone=cn-shenzhen-e-nozone --overwrite期待される出力:
persistentvolume/d-wz9g2j5qbo37r2lamkg4 labeledPod を削除して再起動をトリガーします。ゾーンラベルがどのノードとも一致しなくなったため、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 3m23sPVC に新しい容量が反映されていることを確認します。
kubectl get pvc期待される出力:
disk-ssd-web-0 Bound d-wz9g2j5qbo37r2lamkg4 30Gi RWO alicloud-disk-available 17mPV に新しい容量が反映されていることを確認します。
kubectl get pv d-wz9g2j5qbo37r2lamkg4期待される出力:
d-wz9g2j5qbo37r2lamkg4 30Gi RWO Delete Bound default/disk-ssd-web-0 alicloud-disk-available 17mPod 内で新しいディスクサイズが認識されていることを確認します。
kubectl exec web-0 -- df /data期待される出力:
/dev/vdb 30832548 45036 30771128 1% /dataディスクボリュームは 20 GiB から 30 GiB に拡張されました。