内部データベースのボリューム拡張
概要
CircleCI データベース(MongoDB または PostgreSQL)を外部からプロビジョニングするのではなく、クラスタ内にデプロイすることを選択した場合、あらかじめ用意したデータベース用ストレージ容量では足りなくなる場合があります。 Kubernetes クラスタの内部データベースでは、永続的なストレージとして 永続ボリュームを使用しています。 ボリュームのサイズは、PVC (永続ボリューム要求) によって決定されます。 この PVC は、クラスタ内の Node に使用できる容量に基づいてストレージスペースを要求します。
ここでは、内部でデプロイしたデータベース用のスペースを増やすために PVC を増やす手順を説明します。 この操作には、データベースポッドを再起動する必要がない限り、ダウンタイムは生じません。
永続ボリュームを拡張しても、Node に接続されているストレージのサイズには影響しません。 Node ストレージの拡張は、ご使用のクラウドプロバイダーの制限範囲内で可能です。 クラスタの Node に接続されたストレージを拡張する方法の詳細については、ご使用のクラウドプロバイダーのドキュメントを参照してください。 |
永続ボリューム要求のサイズ変更
ここでは 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
ドキュメントの改善にご協力ください
このガイドは、CircleCI の他のドキュメントと同様にオープンソースであり、 GitHub でご利用いただけます。 ご協力いただき、ありがとうございます。
- このページの編集をご提案ください (最初に「コントリビューションガイド」をご覧ください)。
- ドキュメントの問題点を報告する、またはフィードバックやコメントを送信するには、GitHub で issue を作成してください。
- CircleCI は、ユーザーの皆様の弊社プラットフォームにおけるエクスペリエンスを向上させる方法を常に模索しています。 フィードバックをお寄せいただける場合は、リサーチコミュニティにご参加ください。
サポートが必要ですか
CircleCI のサポートエンジニアによる、サービスに関する問題、請求およびアカウントについての質問への対応、設定の構築に関する問題解決のサポートを行っています。 サポートチケットを送信して、CircleCI のサポートエンジニアにお問い合わせください。日本語でお問い合わせいただけます。
または、 サポートサイト から、サポート記事やコミュニティフォーラム、トレーニングリソースをご覧いただけます。
CircleCI Documentation by CircleCI is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.