無料でビルドを開始
CircleCI.comアカデミーブログコミュニティサポート

内部データベースのボリューム拡張

11 months ago1 min read
Server v4.x
サーバー管理者
このページの内容

概要

CircleCI データベース(MongoDB または PostgreSQL)を外部からプロビジョニングするのではなく、クラスタ内にデプロイすることを選択した場合、あらかじめ用意したデータベース用ストレージ容量では足りなくなる場合があります。 Kubernetes クラスタの内部データベースでは、永続的なストレージとして 永続ボリュームを使用しています。 ボリュームのサイズは、PVC (永続ボリューム要求) によって決定されます。 この PVC は、クラスタ内の Node に使用できる容量に基づいてストレージスペースを要求します。

ここでは、内部でデプロイしたデータベース用のスペースを増やすために PVC を増やす手順を説明します。 この操作には、データベースポッドを再起動する必要がない限り、ダウンタイムは生じません。

永続ボリューム要求のサイズ変更

ここでは PostgreSQL と MongoDB の永続ボリューム要求のサイズを変更する方法を説明します。 この操作の前後で、要求のサイズやデータベースに利用できるディスク容量を確認します。

1. 現在のボリュームサイズの確認

デフォルトでは、内部のデータベースが使用する永続ボリューム要求の容量は 8Gi です。 ただし、この初期値は最初のデプロイ時に helm-value ファイルから設定できます。 kubectl get pvc <pvc-name> コマンドにより、永続ボリューム要求のサイズを確認することができます。

  • PostgreSQL

    circleci-user ~ $ kubectl get pvc data-postgresql-0
    
    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    data-postgresql-0   Bound    pvc-c2a2d97b-2b7d-47d3-ac77-d07c76c995a3   8Gi        RWO            gp2            1d
  • MongoDB

    circleci-user ~ $ kubectl get pvc datadir-mongodb-0
    
    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    datadir-mongodb-0   Bound    pvc-58a2274c-31c0-487a-b329-0062426b5535   8Gi        RWO            gp2            1d
  • Redis

    circleci-user ~ $ kubectl get pvc redis-data-redis-master-0
    
    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    redis-data-redis-master-0   Bound    pvc-522b3e1c-172d-482c-8648-c24896d18a72   8Gi       RWO            gp2            64m
    
    circleci-user ~ $ kubectl get pvc redis-data-redis-slave-0
    
    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    redis-data-redis-slave-0   Bound    pvc-bfdf976d-6f8b-4136-aaa0-b5fc3fce826b   8Gi       RWO            gp2            64m

データベースのデータディレクトリのサイズを確認することで、この容量が確保されているかも確認できます。

  • PostgreSQL の場合、ディレクトリは /bitnami/postgresql です。 以下のコマンドでサイズの確認ができます。

    circleci-user ~ $ kubectl exec postgresql-0 -- df -h /bitnami/postgresql
    
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme4n1    7.8G  404M  7.4G   3% /bitnami/postgresql
  • MongoDB の場合、ディレクトリは /bitnami/mongodb です。

    circleci-user ~ $ kubectl exec mongodb-0 -- df -h /bitnami/mongodb
    
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme1n1    7.8G  441M  7.4G   3% /bitnami/mongodb
  • Redis の場合、ディレクトリは /data です。

    circleci-user ~ $ kubectl exec redis-master-0 -- df -h /data
    
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     8G  156K   8G   1% /data
    
    circleci-user ~ $ kubectl exec redis-slave-0 -- df -h /data
    
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     8G  156K   8G   1% /data

上記の例では、容量は 8Gi のままです。 次のステップで、これを 10 Gi に増やす方法を紹介します。

2. ボリュームの拡張が可能かどうかを確認する

クラスタでボリューム拡張が許可されていることを確認します。

circleci-user ~ $ kubectl get sc

NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  1d

デフォルトのストレージクラスで "ALLOWVOLUMEEXPANSION" が上記の例のように false に設定されている場合は、以下の kubectl patch コマンドで変更できます。

circleci-user ~ $ kubectl patch sc gp2 -p '{"allowVolumeExpansion": true}'

storageclass.storage.k8s.io/gp2 patched
circleci-user ~ $ kubectl get sc
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                  1d

ここからは、ボリュームを増やしていきましょう。

3. データベースのステートフルセットを削除する

このステップでは、データベースポッドを制御するステートフルセットを削除します。 以下のコマンドは、ポッドを削除することなく、参照されるデータベースのステートフルセットを削除します。 ポッド自体を削除してしまうとダウンタイムが発生してしまうので、お勧めしません。 次のステップでは、ステートフルセットを再びデプロイします。 ボリュームを拡張するデータベースによって、どちらか一方または両方のステートフルセットを削除します。 ここでは、 --cascade=orphan フラグが最も重要です。

  • PostgreSQL

    kubectl delete sts postgresql --cascade=orphan
  • MongoDB

    kubectl delete sts mongodb --cascade=orphan
  • Redis

    kubectl delete sts redis-master redis-slave --cascade=orphan

4. データベースの PVC サイズを更新する

ステートフルセットが削除されたので、永続ボリューム要求のサイズを 10Gi に増やすことができます。

  • PostgreSQL

    kubectl patch pvc data-postgresql-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'
  • MongoDB

    kubectl patch pvc datadir-mongodb-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'
  • Redis

    kubectl patch pvc redis-data-redis-master-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'
    kubectl patch pvc redis-data-redis-slave-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'

5. helm-value ファイルを新しい PVC サイズに更新する

helm-value ファイルの PVC サイズを変更してインストールしたサーバーを更新し、変更内容を永続化する必要があります。 helm-value ファイルでは、以下のように PVC サイズの値を 10Gi に更新します。

  • PostgreSQL

    postgresql:
      primary:
        persistence:
          size: 10Gi
  • MongoDB

    mongodb:
      persistence:
        size: 10Gi
  • Redis

    redis:
      master:
        persistence:
          size: 10Gi
      slave:
        persistence:
          size: 10Gi

変更内容を保存し、デプロイします。 これにより、先ほど削除したステートフルセットが再び作成されますが、次のリリースまで継続される新しい PVC サイズに変わっています。

helm upgrade <release-name> -n <namespace> -f < helm-value-file> <chart-dictectory>

6. 新しいボリュームサイズを検証する

デプロイ後にデータベースに割り当てられたデータディレクトリのサイズを検証することができます。

  • PostgreSQL の場合、ディレクトリは /bitnami/postgresql です。

    circleci-user ~ $ kubectl exec postgresql-0 -- df -h /bitnami/postgresql
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme4n1    9.8G  404M  9.4G   5% /bitnami/postgresql
  • MongoDB の場合、ディレクトリは /bitnami/mongodb です。

    circleci-user ~ $ kubectl exec mongodb-0 -- df -h /bitnami/mongodb
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme1n1    9.8G  441M  9.3G   5% /bitnami/mongodb
  • Redis の場合、ディレクトリは /data です。

    circleci-user ~ $ kubectl exec redis-master-0 -- df -h /data
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     10G  156K   10G   1% /data
    
    circleci-user ~ $ kubectl exec redis-slave-0 -- df -h /data
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     10G  156K   10G   1% /data

ご覧のように、ディレクトリのサイズが拡張されています。

これらの手順を完了する際、新しいポッドでサイズ変更されたボリュームが期待通りに表示された場合は、下記の kubectl describe コマンドで確認することをお勧めします。 サイズ変更に失敗する場合がありますが、kubectl describe からの出力でイベントを表示する方法しか確認できる方法はありません。

  • PostgreSQL

    kubectl describe pvc data-postgresql-0
  • MongoDB

    kubectl describe pvc datadir-mongodb-0
  • Redis

    kubectl describe pvc redis-data-redis-master-0
    kubectl describe pvc redis-data-redis-slave-0

成功すると、以下の例のように出力されます。

Events:
Type    Reason                      Age   From     Message

Normal  FileSystemResizeSuccessful  19m   kubelet  MountVolume.NodeExpandVolume succeeded for volume "pvc-b3382dd7-3ecc-45b0-aeff-45edc31f48aa"

失敗すると、以下の例のように出力されます。

Warning  VolumeResizeFailed  58m   volume_expand  error expanding volume "circleci-server/datadir-mongodb-0" of plugin "kubernetes.io/aws-ebs": AWS modifyVolume failed for vol-08d0861715c313887 with VolumeModificationRateExceeded: You've reached the maximum modification rate per volume limit. Wait at least 6 hours between modifications per EBS volume.
status code: 400, request id: 3bd43d1e-0420-4807-9c33-df26a4ca3f23
Normal   FileSystemResizeSuccessful  55m (x2 over 81m)  kubelet        MountVolume.NodeExpandVolume succeeded for volume "pvc-29456ce2-c7ff-492b-add4-fcf11872589f"

トラブルシューティング

これらのステップを実行しても、データディレクトリに割り当てられたディスクサイズが拡張しない場合は、データベースポッドを再起動する必要があります。 この場合、データベースの再起動に伴い 1~5分程度のダウンタイムが発生します。 以下のコマンドでデータベースを再起動できます。

  • PostgreSQL

    kubectl rollout restart sts postgresql
  • MongoDB

    kubectl rollout restart sts mongodb
  • Redis

    kubectl rollout restart sts redis-master redis-slave

Suggest an edit to this page

Make a contribution
Learn how to contribute