ビジネスの発展やアプリケーションデータの拡大に伴い、ディスク容量が不足する場合があります。 この問題を解決するには、ディスクボリュームを拡張します。 1.16より前のKubernetesを実行するContainer Service for Kubernetes (ACK) クラスターでは、ディスクボリュームを自動的に拡張するようにクラスターを設定することはできません。 ディスクボリュームを手動で拡張する必要があります。 このトピックでは、ディスクボリュームを手動で拡張する方法について説明します。
使用上の注意
ディスクボリュームを拡張するには、ECS (Elastic Compute Service) 側で対応するディスクを拡張する必要があります。 クラスター内のリソースには影響しません。 これは、永続ボリュームクレーム (PVC) と永続ボリューム (PV) に表示される容量が変化しないことを意味します。
制限事項
32 TiB以下のディスクのみを拡張できます。
PVおよびPVCに表示されるディスク容量の値が実際のディスク容量と同じになるように、クラスターがKubernetes 1.16以降を実行している場合は、「サービス中断なしでディスクボリュームを拡張する」トピックの手順を実行することを推奨します。
データバックアップ
ディスクボリュームを拡張する前に、ディスクのスナップショットを作成してディスクデータをバックアップする必要があります。 これにより、ディスクボリュームを拡張するときのデータ損失を防ぎます。
適用範囲
拡張されるPVは、静的にプロビジョニングされたディスクボリュームである。
ディスクボリュームの安定性を確保するために、ACKでは次の方法でディスクボリュームを拡張できます。
方法1: サービス中断なしでディスクボリュームを拡張する: ディスクのファイルシステムを拡張するときにディスクのI/Oスループットが高い場合、ファイルシステムでI/Oエラーが発生する可能性があります。 ただし、この方法を選択した場合は、アプリケーションを再起動する必要はありません。
方法2: サービス中断でディスクボリュームを拡張: アプリケーションが停止した後、ディスクI/O操作が停止します。 これにより、ディスクのファイルシステムを拡張するときのデータセキュリティが確保されます。 この方法を選択すると、サービスは一時的に中断されます。
ディスク使用情報の表示
この例では、MySQLという名前のステートフルアプリケーションを使用して、上記の2つの方法を使用してディスクボリュームを拡張する方法を示します。 ディスク使用量情報を表示するには、次の手順を実行します。
次のコマンドを実行して、MySQLアプリケーション用にプロビジョニングされているポッドを照会します。
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
出力は、
d-0jl0j5***
とd-0jlhaq***
という名前の2つのディスクがMySQLアプリケーションによって使用されていることを示します。 両方のディスクのサイズは20 GiBです。 ディスクは2つのポッドに別々に取り付けられています。
ステートフルアプリケーションを配置する方法の詳細については、「StatefulSetを使用してステートフルアプリケーションを作成する」をご参照ください。
方法1: サービスを中断せずにディスクボリュームを拡張する
PV情報に基づいて対応するディスクを見つけ、手動でディスクを展開してから、ディスクがマウントされているノードに接続し、ファイルシステムを展開します。 次の例は、両方のディスクを30 GiBに拡張する方法を示しています。
ステップ1: ディスクを展開する
ECSコンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
d-0jl0j5*** とd-0jlhaq*** という名前のディスクを見つけて、ディスクのステータスを確認します。 次に、 を選択します。
[ディスクのサイズ変更] ページで、[オンラインサイズ変更] を選択し、[サイズ変更後のサイズ] セクションにディスクを拡張するサイズを入力します。 この例では、サイズを30 GiBに設定します。
説明Size after Resizeの指定値は、現在のディスク容量より大きくなければなりません。
読んでECS利用規約を選択し、確認をクリックします。
詳細については、「ディスクの拡張」をご参照ください。
メモを読んで、メモを読んだをクリックしてください。 サイズ変更してから、支払いを完了します。
[ディスク] ページで、ディスクが展開されているかどうかを確認します。
ステップ2: ファイルシステムを拡張する
ディスクを拡張したら、ファイルシステムを拡張する必要があります。 それ以外の場合、アプリケーションが使用できるストレージはまだ20 GiBです。
この手順は、Kubernetesで使用されるパーティション分割されていないディスクを対象としています。 Kubernetesでパーティションディスクを使用しないことを推奨します。
パーティション分割されていないディスクがPVとしてマウントされている場合、そのディスクのパーティションを手動で作成することはできません。 そうしないと、ファイルシステムが破損し、データが失われる可能性があります。
パーティションディスクがPVとしてマウントされている場合は、パーティションディスクを拡張した後にファイルシステムを拡張する必要があります。 詳細については、「Linuxインスタンスのディスクのパーティションとファイルシステムの拡張」または「Windowsインスタンスのディスクのパーティションとファイルシステムの拡張」をご参照ください。
ディスクがマウントされているECSインスタンスを表示します。
ディスクがマウントされているECSインスタンスに接続し、ディスクのドライバ文字を取得します。
ECSインスタンスへの接続方法の詳細については、「ECSインスタンスへの接続方法」をご参照ください。
次の方法を使用して、ディスクのドライバ文字を取得できます。
次のコマンドを実行して、d-0jlhaq*** という名前のディスクのドライバ文字を照会します。
# Query {pv-name}. mount |grep d-0jlhaq***
期待される出力:
# Query {pv-name}. mount |grep d-0jlhaq***
出力は、
d-0jlhaq***
ディスクのドライバ文字が /dev/vdcであることを示します。
次のコマンドを実行して、ファイルシステムを拡張します。
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.
次のコマンドを実行して、ファイルシステムが拡張されているかどうかを確認します。
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に拡張されたことを示します。
方法2: サービス中断でディスクボリュームを拡張する
StatefulSetを削除するか、レプリカの値を0に設定してアプリケーションを停止できます。 その後、手動でディスクを展開してアプリケーションを再起動できます。 次の例は、両方のディスクを30 GiBに拡張する方法を示しています。
手順1: アプリケーション用にプロビジョニングされているポッドを削除する
次のコマンドを実行して、ポッド数を0にスケーリングします。
kubectl scale sts mysql --replicas=0
期待される出力:
statefulset.apps/mysql scaled
次のコマンドを実行して、ポッドが削除されているかどうかを確認します。
kubectl get pod | grep mysql
出力は返されません。 これは、MySQLアプリケーションが停止していることを示します。
ステップ2: ディスクを展開する
ECSコンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
d-0jl0j5*** とd-0jlhaq*** という名前のディスクを見つけて、ディスクの状態を確認します。 次に、 を選択します。
ディスクのサイズ変更ページで、ディスクのサイズを変更する方法を選択し、ディスクを拡張するサイズを指定します。
ディスクの状態が [未接続] の場合は、[ディスクのサイズ変更] ページで [オンラインサイズ変更] を選択しないでください。 [サイズ変更後のサイズ] セクションで、ディスクを拡張するサイズを指定します。 この例では、値を30 GiBに設定します。
ディスクの状態が [使用中] の場合、[ディスクのサイズ変更] ページで [オンラインサイズ変更] を選択し、[サイズ変更後] セクションでディスクを拡張するサイズを指定します。
説明Size after Resizeの指定値は、現在のディスク容量より大きくなければなりません。
読んでECS利用規約を選択し、確認をクリックします。
詳細については、「手順1: ディスクのサイズを変更してディスクの容量を拡張する」をご参照ください。
メモを読んで、メモを読んだをクリックしてください。 サイズ変更してから、支払いを完了します。
ステップ3: ファイルシステムを拡張する
ディスクを拡張したら、ファイルシステムを拡張する必要があります。 それ以外の場合、アプリケーションが使用できるストレージはまだ20 GiBです。
この手順は、Kubernetesで使用されるパーティション分割されていないディスクを対象としています。 Kubernetesでパーティションディスクを使用しないことを推奨します。
パーティション分割されていないディスクが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
説明拡張ディスクのIDは
d-0jlhaq ***
です。0jlhaq ***
はd-
に続く文字列です。オプション: 上記のコマンドを実行してディスクのドライバ文字を取得できない場合は、次の操作を実行します。
ディスクをアンマウントし、
ls /dev/vd *
コマンドを実行してディスクのリストを照会します。ディスクをマウントし、
ls /dev/vd *
コマンドを実行してディスクのリストを照会します。返されたリストを比較します。 2番目のリストにのみ表示されるディスクは、マウントしたディスクです。
次のコマンドを実行して、ファイルシステムを拡張します。
resize2fs /dev/vdb
説明/dev/vdcは、ステップ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
ステップ4: アプリケーションを再起動する
次のコマンドを実行して、ポッド数を2にスケーリングします。
kubectl scale sts mysql --replicas=2
期待される出力:
statefulset.apps/mysql scaled
次のコマンドを実行して、ポッドが回復したかどうかを確認します。
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
原因
ファイルシステムに一貫性がないため、I/Oエラーが発生します。
解決策
e2fsck -f /dev/xxx
コマンドを実行し、ファイルシステムを展開します。