CircleCI Server v3.x 内部データベースボリュームの拡張

概要

MongoDB および Postgres の永続ボリュームの拡張は、Server v3.2.0 以降で可能です。

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

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

永続ボリュームを拡張しても、Node に接続されているストレージのサイズには影響しません。 Node ストレージの拡張は、ご使用のクラウドプロバイダーの制限範囲内で可能です。 クラスタの Node に接続されたストレージを拡張する方法の詳細については、ご使用のクラウドプロバイダーのドキュメントを参照してください。

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

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

万一に備えて、まず クラスタのバックアップを作成することをお勧めします。

ステップ 0: 現在のボリュームサイズの確認

デフォルトでは、内部のデータベースが使用する永続ボリューム要求の容量は 8Gi です。 ただし、この初期値は最初のデプロイ時に KOTS 管理者コンソールから設定できます。 We can confirm the size of our persistent volume claim capacity using kubectl get pvc <pvc-name>.

Postgres の場合:

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

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

Postgres の場合、ディレクトリは `/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

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

ステップ 1: ボリュームの拡張が可能かどうかを確認する

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

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

ご覧の通り、デフォルトのストレージクラスではボリュームの拡張ができません。 しかし、 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

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

ステップ 2: データベースのステートフルセットを削除する

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

Postgres の場合:

circleci-user ~ $ kubectl delete sts postgresql --cascade=false

Mongodbの場合:

circleci-user ~ $ kubectl delete sts mongodb --cascade=false

ステップ 3: データベースの PVC サイズを更新する

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

Postgres の場合:

circleci-user ~ $ kubectl patch pvc data-postgresql-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'

Mongodbの場合:

circleci-user ~ $ kubectl patch pvc datadir-mongodb-0 -p '{"spec": {"resources": {"requests": {"storage": "10Gi"}}}}'

ステップ 4: KOTS 管理者を新しい PVC サイズに更新する

次に、KOTS 管理者コンソールにアクセスして変更内容を永続化する必要があります。 設定セクションでは、以下のように PVC サイズの値を 10Gi に更新します。

Postgres PVC size
Figure 1. Postgres の場合:
MongoDB PVC size
Figure 2. Mongodbの場合:

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

ステップ 5: 新しいボリュームサイズを検証する

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

Postgres の場合、ディレクトリは `/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

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

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

Postgres の場合:

circleci-user ~ $ kubectl rollout restart sts postgresql

Mongodbの場合:

circleci-user ~ $ kubectl rollout restart sts mongodb


ドキュメントの改善にご協力ください

このガイドは、CircleCI の他のドキュメントと同様にオープンソースで、GitHub で使用できます。 ご協力いただき、ありがとうございます。


クリエイティブ・コモンズ・ライセンス
CircleCICircleCI ドキュメントは、クリエイティブ・コモンズの表示--非営利-継承 4.0 国際ライセンス に基づいてライセンス供与されています。