すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ディスクボリュームを手動で拡張する

最終更新日:Dec 19, 2024

ビジネスの発展やアプリケーションデータの拡大に伴い、ディスク容量が不足する場合があります。 この問題を解決するには、ディスクボリュームを拡張します。 1.16より前のKubernetesを実行するContainer Service for Kubernetes (ACK) クラスターでは、ディスクボリュームを自動的に拡張するようにクラスターを設定することはできません。 ディスクボリュームを手動で拡張する必要があります。 このトピックでは、ディスクボリュームを手動で拡張する方法について説明します。

使用上の注意

  • 制限事項

    32 TiB以下のディスクのみを拡張できます。

  • データバックアップ

    ディスクボリュームを拡張する前に、ディスクのスナップショットを作成してディスクデータをバックアップする必要があります。 これにより、ディスクボリュームを拡張するときのデータ損失を防ぎます。

  • 適用範囲

    PVは、静的にプロビジョニングされたディスクボリュームです。

ディスクボリュームの安定性を確保するために、ACKでは次の方法でディスクボリュームを拡張できます。

  • 方法1: サービス中断なしでディスクボリュームを拡張する: ディスクのファイルシステムを拡張するときにディスクのI/Oスループットが高い場合、ファイルシステムでI/Oエラーが発生する可能性があります。 ただし、この方法を選択した場合は、アプリケーションを再起動する必要はありません。

  • 方法2: サービス中断でディスクボリュームを拡張: アプリケーションが停止した後、ディスクI/O操作が停止します。 これにより、ディスクのファイルシステムを拡張するときのデータセキュリティが確保されます。 この方法を選択すると、サービスは一時的に中断されます。

ディスク使用情報の表示

この例では、MySQLという名前のステートフルアプリケーションを使用して、上記の2つの方法を使用してディスクボリュームを拡張する方法を示します。 ディスク使用量情報を表示するには、次の手順を実行します。

  1. 次のコマンドを実行して、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
  2. 次のコマンドを実行して、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
  3. 次のコマンドを実行して、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: ディスクを展開する

  1. にログインします。ECSコンソール.

  2. 左側のナビゲーションウィンドウで、ストレージ&スナップショット > ブロックストレージ.

  3. d-0jl0j5 ***d-0jlhaq *** という名前のディスクを見つけて、ディスクのステータスを確認します。 次に、各ディスクの [操作] 列で [詳細] > [ディスクのサイズ変更] を選択します。

  4. [ディスクのサイズ変更] ページで、[オンラインサイズ変更] を選択し、[サイズ変更後のサイズ] セクションにディスクを拡張するサイズを入力します。 この例では、サイズを30 GiBに設定します。

    説明

    Size after Resizeの指定値は、現在のディスク容量より大きくなければなりません。

  5. 読み取り、ECS利用規約を選択して料金を確認し、[確認] をクリックします。

    詳細については、「ディスクの拡張」をご参照ください。

  6. メモを読んで、メモを読んだをクリックしてください。 サイズ変更してから、支払いを完了します。

    [ディスク] ページで、ディスクが展開されているかどうかを確認します。

ステップ2: ファイルシステムを拡張する

ディスクを拡張したら、ファイルシステムを拡張する必要があります。 それ以外の場合、アプリケーションが使用できるストレージはまだ20 GiBです。

重要

この手順は、Kubernetesで使用されるパーティション分割されていないディスクを対象としています。 Kubernetesでパーティションディスクを使用しないことを推奨します。

  1. ディスクがマウントされているECSインスタンスを表示します。

    1. にログインします。ECSコンソール.

    2. 左側のナビゲーションウィンドウで、ストレージ&スナップショット > ブロックストレージ.

    3. d-0jl0j5 ***d-0jlhaq *** という名前のディスクを見つけて、各ディスクの名前をクリックします。

    4. [基本情報] タブの [関連インスタンス] リストで、ディスクがマウントされているインスタンスをクリックします。 次に、[インスタンスの詳細] タブの [ネットワーク情報] セクションに情報を表示します。

      説明

      ACKコンソールでディスクがマウントされているECSインスタンスを表示することもできます。 詳細については、「ポッドの表示」をご参照ください。

  2. ディスクがマウントされているECSインスタンスに接続し、ディスクのドライバ文字を取得します。

    ECSインスタンスへの接続方法の詳細については、「ECSインスタンスへの接続方法」をご参照ください。

    次の方法を使用して、ディスクのドライバ文字を取得できます。

    • ディスクのドライバ文字を取得します

    • 次のコマンドを実行して、d-0jlhaq *** という名前のディスクのドライバ文字を照会します。

      # Query {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に拡張されたことを示します。

方法2: サービス中断でディスクボリュームを拡張する

StatefulSetを削除するか、レプリカの値を0に設定してアプリケーションを停止できます。 その後、手動でディスクを展開してアプリケーションを再起動できます。 次の例は、両方のディスクを30 GiBに拡張する方法を示しています。

手順1: アプリケーション用にプロビジョニングされているポッドを削除する

  1. 次のコマンドを実行して、ポッド数を0にスケーリングします。

    kubectl scale sts mysql --replicas=0

    期待される出力:

    statefulset.apps/mysql scaled
  2. 次のコマンドを実行して、ポッドが削除されているかどうかを確認します。

    kubectl get pod | grep mysql

    出力は返されません。 これは、MySQLアプリケーションが停止していることを示します。

ステップ2: ディスクを展開する

  1. にログインします。ECSコンソール.

  2. 左側のナビゲーションウィンドウで、ストレージ&スナップショット > ブロックストレージ.

  3. d-0jl0j5 ***d-0jlhaq *** という名前のディスクを見つけて、ディスクの状態を確認します。 次に、各ディスクの [操作] 列で [詳細] > [ディスクのサイズ変更] を選択します。

  4. [ディスクのサイズ変更] ページで、ディスクのサイズを変更する方法を選択し、ディスクを拡張するサイズを指定します。

    • ディスクの状態が [未接続] の場合は、[ディスクのサイズ変更] ページで [オンラインサイズ変更] を選択しないでください。 [サイズ変更後のサイズ] セクションで、ディスクを拡張するサイズを指定します。 この例では、値を30 GiBに設定します。

    • ディスクの状態が [使用中] の場合、[ディスクのサイズ変更] ページで [オンラインサイズ変更] を選択し、[サイズ変更後] セクションでディスクを拡張するサイズを指定します。

    説明

    Size after Resizeの指定値は、現在のディスク容量より大きくなければなりません。

  5. 読み取り、ECS利用規約を選択して料金を確認し、[確認] をクリックします。

    詳細については、「手順1: ディスクのサイズを変更して容量を拡張する」をご参照ください。

  6. メモを読んで、メモを読んだをクリックしてください。 サイズ変更してから、支払いを完了します。

ステップ3: ファイルシステムを拡張する

ディスクを拡張したら、ファイルシステムを拡張する必要があります。 それ以外の場合、アプリケーションが使用できるストレージはまだ20 GiBです。

重要

この手順は、Kubernetesで使用されるパーティション分割されていないディスクを対象としています。 Kubernetesでパーティションディスクを使用しないことを推奨します。

  1. オプション: ディスクをECSインスタンスにマウントします。

    説明

    ファイルシステムを拡張する前に、ディスクをECSインスタンスにマウントする必要があります。

    1. にログインします。ECSコンソール.

    2. 左側のナビゲーションウィンドウで、ストレージ&スナップショット > ブロックストレージ.

    3. [未接続] 状態のディスクの場合は、を選択できます

      ディスクをマウントするには、ディスクの [操作] 列の詳細 [アタッチ] をクリックします。

    4. [ディスクの接続] ダイアログボックスで、ドロップダウンリストからECSインスタンスを選択し、ディスクのリリースに対応する設定を行います。

      パラメーター

      説明

      宛先インスタンス

      ディスクをマウントするインスタンスを選択します。

      インスタンスによるディスクのリリース

      このオプションを選択すると、インスタンスのリリース時にディスクが自動的にリリースされます。 このオプションを選択しない場合、ディスクはインスタンスのリリース時に保持されます。

      説明

      マウントするディスクが別のインスタンスからマウント解除されたシステムディスクである場合、[インスタンスでディスクをリリース] で指定されたインスタンスは、現在のインスタンスではなく、ディスクがマウント解除されたインスタンスを指します。

      ディスクリリース中の自動スナップショットの削除

      このオプションを選択すると、ディスクのリリース時にディスクの自動スナップショットがリリースされます。 スナップショットを保持するには、このオプションを選択しないでください。

    5. [添付] をクリックします。

    ディスクがマウントされると、ディスクのステータスが [使用中] に変わります。

  2. ディスクがマウントされている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- に続く文字列です。

    • オプション: 上記のコマンドを実行してディスクのドライバ文字を取得できない場合は、次の操作を実行します。

      1. ディスクをアンマウントし、ls /dev/vd * コマンドを実行してディスクのリストを照会します。

      2. ディスクをマウントし、ls /dev/vd * コマンドを実行してディスクのリストを照会します。

      3. 返されたリストを比較します。 2番目のリストにのみ表示されるディスクは、マウントしたディスクです。

  3. 次のコマンドを実行して、ファイルシステムを拡張します。

    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.
  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

ステップ4: アプリケーションを再起動する

  1. 次のコマンドを実行して、ポッド数を2にスケーリングします。

    kubectl scale sts mysql --replicas=2

    期待される出力:

    statefulset.apps/mysql scaled
  2. 次のコマンドを実行して、ポッドが回復したかどうかを確認します。

    kubectl get pod | grep mysql

    期待される出力:

    NAME         READY   STATUS    RESTARTS   AGE
    mysql-0        1/1     Running   0          74s
    mysql-1        1/1     Running   0          42s
  3. 次のコマンドを実行して、指定したファイルシステムのサイズを照会します。

    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コマンドを実行し、ファイルシステムを展開します。