永続ディスクを使用した永続ボリューム

このページでは、Kubernetes の PersistentVolume と PersistentVolumeClaim の概要と、Google Kubernetes Engine での使用方法について説明します。このページでは、Compute Engine の永続ディスクを使用したストレージについて重点的に説明します。

概要

PersistentVolume リソースは、クラスタ内の永続ストレージの管理に使用されます。通常、GKE では、PersistentVolume は Compute Engine の永続ディスクを使用します。PersistentVolume は、NFS などの他の種類のストレージでも使用できます。PersistentVolume についての網羅的な概要については、Kubernetes のドキュメントを参照してください。

ボリュームとは異なり、PersistentVolume のライフサイクルは Kubernetes によって管理されます。PersistentVolume は動的にプロビジョニングすることが可能であるため、バックアップ ストレージの作成や削除を手動で行う必要はありません。

PersistentVolume は、ポッドとは独立して存在するクラスタ リソースです。このため、PersistentVolume で表されるディスクとデータは、クラスタを変更したりポッドを削除してから再作成したりしても、引き続き存在します。PersistentVolume リソースは、PersistentVolumeClaim で動的にプロビジョニングすることも、クラスタ管理者が明示的に作成することもできます。

PersistentVolumeClaim は、PersistentVolume リソースに対するリクエスト(要求)です。PersistentVolumeClaim オブジェクトは、PersistentVolume の具体的なサイズ、アクセスモード、StorageClass をリクエストします。リクエストを満たす PersistentVolume が存在する場合やプロビジョニング可能な場合、PersistentVolumeClaim はその PersistentVolume にバインドされます。

ポッドは要求をボリュームとして使用します。クラスタは要求を検査してバインドされたボリュームを検出し、そのボリュームをポッドにマウントします。

PersistentVolume と PersistentVolumeClaim を使用する場合、ポータビリティというメリットも得られます。PersistentVolume は実際のバックアップ ストレージのインターフェースであるため、さまざまなクラスタや環境で同じポッド仕様を簡単に使用できます。

StorageClass

gcePersistentDisk などのボリューム実装は、StorageClass リソースで構成されます。GKE は、標準的な種類の永続ディスクを使用するデフォルトの StorageClass を作成します。PersistentVolumeClaim で StorageClassName が指定されていない場合、デフォルトの StorageClass が使用されます。デフォルトで指定されている StorageClass は、独自のものに置き換えることができます。

独自の StorageClass リソースを作成すると、さまざまなクラスのストレージを記述できます。たとえば、クラスをサービス品質レベルやバックアップ ポリシーにマッピングできます。この概念は、他のストレージ システムでは「プロファイル」と呼ばれることもあります。

PersistentVolume の動的プロビジョニング

ほとんどの場合、PersistentVolume オブジェクトを直接構成したり Compute Engine 永続ディスクを作成したりする必要はありません。PersistentVolumeClaim を作成すると、Kubernetes が自動的に永続ディスクをプロビジョニングします。

次のマニフェストでは 30 GiB のディスクをリクエストし、ポッドを一度に 1 つずつ読み取り / 書き込みモードでマウントするようにアクセスモードを指定しています。

pvc-demo.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: helloweb-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
    

この PersistentVolumeClaim を kubectl apply -f pvc-demo.yaml で作成すると、対応する PersistentVolume オブジェクトが Kubernetes により動的に作成されます。デフォルトのストレージ クラスがそのまま GKE で使用される場合、この PersistentVolume は新しい空の Compute Engine 永続ディスクでバックアップされます。要求をボリュームとして使用する場合、このディスクがポッドで使用されます。

この要求を削除すると、対応する PersistentVolume オブジェクトとプロビジョニングされた Compute Engine の永続ディスクも削除されます。

動的にプロビジョニングされた永続ディスクが削除されないようにするには、PersistentVolume リソースまたはその StorageClass リソースの再利用ポリシーRetain に設定します。この場合、PersistentVolumeClaim を使用していなくても、永続ディスクが存在する限り永続ディスクの料金が発生します。

アクセスモード

PersistentVolume では次のアクセスモードがサポートされています。

  • ReadWriteOnce: ボリュームを単一のノードで読み書き可能としてマウントできます。
  • ReadOnlyMany: ボリュームを多数のノードで読み取り専用としてマウントできます。
  • ReadWriteMany: ボリュームを多数のノードで読み書き可能としてマウントできます。Compute Engine の永続ディスクを使用する PersistentVolume では、このアクセスモードは使用できません。

Compute Engine の永続ディスクを ReadOnlyMany として使用する

永続ディスクは通常は ReadWriteOnce として使用され、ほとんどのアプリケーションでデフォルトのアクセスモードとなっています。Compute Engine の永続ディスクでは ReadOnlyMany モードもサポートされているため、同じアプリケーションで多数のアプリケーションや多数のレプリカが同じディスクを同時に使用できます。その例として、複数のレプリカ間で静的コンテンツを提供できます。

詳細については、複数のリーダーで使用する永続ディスクの作成方法の記事をご覧ください。

既存の永続ディスクを PersistentVolume として使用する

動的にプロビジョニングされた PersistentVolume は、作成時は空の状態です。既存の Compute Engine 永続ディスクにデータが格納されている場合は、対応する PersistentVolume リソースを手動で作成してクラスタに導入できます。永続ディスクはクラスタノードと同じゾーンに存在する必要があります。

詳細については、既存の永続ディスクを使用する永続ボリュームの作成方法をご覧ください。

Deployment と StatefulSet の比較

永続ボリューム要求またはボリューム要求のテンプレートは、DeploymentStatefulSet などの上位レベルのコントローラで使用できます。

Deploymentステートレス アプリケーション用に設計されているため、同じ永続ボリューム要求が Deployment のすべてのレプリカで共有されます。作成されたレプリカポッドはそれぞれ同一なので、この設定では ReadOnlyMany モードと ReadWriteMany モードのボリュームだけが動作します。

ReadWriteOnce ボリュームを使用するレプリカ 1 つしか存在しない Deployment は推奨されません。これは、デフォルトの Deployment 戦略では、再作成時に最初のポッドを停止する前に 2 番目のポッドを作成するためです。ReadWriteOnce ボリュームがすでに使用中であると 2 番目のポッドを起動できず、2 番目のポッドが起動しないと最初のポッドが削除されないため、Deployment はデッドロックで失敗する可能性があります。この場合は ReadWriteOnce ボリュームで StatefulSet を使用します。

レプリカごとに一意のボリュームが必要なステートフル アプリケーションを展開する場合は、StatefulSet を使用することを推奨します。Persistent Volume Claim Template で StatefulSet を使用すると、各レプリカポッドに関連付けられた一意の永続ボリューム要求を使用して自動的にスケールアップすることが可能なアプリケーションを作成できます。

リージョン永続ディスク

リージョン永続ディスクでは同じリージョン内の 2 つのゾーン間でデータが複製され、通常の永続ディスクと同様に使用できます。ゾーン全体が停止した場合でも、Kubernetes がこのボリュームを使用して他のゾーンにワークロードをフェイルオーバーできます。リージョン永続ディスクを使用すると、GKE 上のステートフル ワークロード用の高可用性ソリューションを構築できます。このとき、余裕を持ってワークロードを実行できるリソース容量がプライマリ ゾーンとフェイルオーバー ゾーンの両方で確保されていることを確認する必要があります。

リージョン SSD 永続ディスクは、高可用性とハイ パフォーマンスの両方が必要とされるデータベースなどのアプリケーションに適しています。詳細については、ブロック ストレージのパフォーマンスの比較をご覧ください。

リージョン永続ディスクは、通常の永続ディスクと同様に、必要に応じて動的にプロビジョニングしたり、クラスタ管理者が事前に手動でプロビジョニングしたりできます。

リージョン永続ディスクを追加する方法については、リージョン永続ディスクのプロビジョニング手順をご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント