4.3. 永続ストレージ
4.3.1. 概要
ストレージの管理は、コンピュートリソースの管理とは異なります。OpenShift Online は Kubernetes 永続ボリューム (PV) フレームワークを使用してクラスター管理者がクラスターの永続ストレージのプロビジョニングを実行できるようにします。Persistent Volume Claim (永続ボリューム要求、PVC) を使用すると、開発者は基礎となるストレージインフラストラクチャーについての特定の知識がなくても PV リソースを要求することができます。
PVC はプロジェクトに固有のもので、開発者が PV を使用する手段として作成し、使用します。PV リソース自体のスコープはいずれの単一プロジェクトにも設定されず、それらは OpenShift Online クラスター全体で共有でき、すべてのプロジェクトから要求できます。PV が PVC に バインド された後は、その PV を追加の PVC にバインドすることはできません。これにはバインドされた PV を単一の namespace (バインディングプロジェクトの namespace) にスコープ設定する作用があります。
PV は、クラスター管理者によってプロビジョニングされるクラスターの既存のネットワーク設定されたストレージの一部を表す PersistentVolume
API オブジェクトで定義されます。これは、ノードがクラスターリソースであるのと同様にクラスター内のリソースです。PV は Volumes
などのボリュームプラグインですが、PV を使用する個々の Pod から独立したライフサイクルを持ちます。PV オブジェクトは、NFS、iSCSI、またはクラウドプロバイダー固有のストレージシステムのいずれの場合でも、ストレージの実装の詳細をキャプチャーします。
インフラストラクチャーにおけるストレージの高可用性は、基礎となるストレージのプロバイダーに委ねられています。
PVC は、開発者によるストレージの要求を表す PersistentVolumeClaim
API オブジェクトによって定義されます。これは Pod がノードリソースを消費する点で Pod に似ており、PVC は PV リソースを消費します。たとえば、Pod は特定のレベルのリソース (CPU およびメモリーなど) を要求し、PVC は特定のストレージ容量およびアクセスモードを要求できます (たとえば、それらは読み取り/書き込みで 1 回、読み取り専用で複数回マウントできます)。
4.3.2. ボリュームおよび要求のライフサイクル
PV はクラスターのリソースです。PVC はそれらのリソースの要求であり、リソースに対する要求チェックとして機能します。PV と PVC 間の相互作用には以下のライフサイクルが設定されます。
4.3.2.1. プロビジョニング
PVC で定義される開発者からの要求に対応し、クラスター管理者はストレージおよび一致する PV をプロビジョニングする 1 つ以上の動的プロビジョナーを設定します。
または、クラスター管理者は、使用可能な実際のストレージの詳細を保持する多数の PV を前もって作成できます。PV は API に存在し、利用可能な状態になります。
4.3.2.2. バインディング
PVC の作成時に、ストレージの特定容量の要求、必要なアクセスモードの指定のほか、ストレージクラスを作成してストレージの記述や分類を行います。マスターのコントロールループは新規 PVC の有無を監視し、新規 PVC を適切な PV にバインドします。適切な PV がない場合には、ストレージクラスのプロビジョナーが PV を作成します。
PV ボリュームは、要求したボリュームを上回る可能性がありますが、これは、手動でプロビジョニングされた PV の場合にとくにそう言えます。これは、手動でプロビジョニングされる PV にとくに当てはまります。超過を最小限にするために、OpenShift Online は他のすべての条件に一致する最小の PV にバインドします。
要求は、一致するボリュームが存在しないか、ストレージクラスを提供するいずれの利用可能なプロビジョナーで作成されない場合には無期限にバインドされないままになります。要求は、一致するボリュームが利用可能になるとバインドされます。たとえば、多数の手動でプロビジョニングされた 50Gi ボリュームを持つクラスターは 100Gi を要求する PVC に一致しません。PVC は 100Gi PV がクラスターに追加されるとバインドされます。
4.3.2.3. 使用
Pod は要求をボリュームとして使用します。クラスターは要求を検査して、バインドされたボリュームを検索し、Pod にそのボリュームをマウントします。複数のアクセスモードをサポートするボリュームの場合、要求を Pod のボリュームとして使用する際に適用するモードを指定する必要があります。
要求が存在し、その要求がバインドされている場合、バインドされた PV は必要な限り所属させることができます。Pod のスケジュールおよび要求された PV のアクセスは、persistentVolumeClaim
を Pod のボリュームブロックに組み込んで実行できます。構文の詳細については、こちらを参照してください。
4.3.2.4. リリース
ボリュームの処理が終了したら、API から PVC オブジェクトを削除できます。これにより、リソースを回収できるようになります。これにより、リソースをまた要求できるようになります。以前の要求側に関連するデータはボリューム上に残るので、ポリシーに基づいて処理される必要があります。
4.3.2.5. 回収
PersistentVolume
の回収ポリシーは、クラスターに対してリリース後のボリュームの処理方法について指示します。ボリュームの回収ポリシーは、Retain
、Recycle
、または Delete
のいずれかにすることができます。
Retain
回収ポリシーは、サポートするボリュームプラグインのリソースの手動による回収を許可します。Delete
回収ポリシーは、OpenShift Online の PersistentVolume
オブジェクトと、および AWS EBS、GCE PD、または Cinder ボリュームなどの外部インフラストラクチャーの関連ストレージアセットの両方を削除します。
動的にプロビジョニングされるボリュームには、デフォルトの ReclaimPolicy
値の Delete
が設定されます。手動でプロビジョニングされるボリュームには、デフォルトの ReclaimPolicy
値の Retain
が設定されます。
4.3.2.5.1. リサイクル
適切なボリュームプラグインでサポートされる場合、リサイクルはボリュームの基本的なスクラブを実行 (rm -rf /thevolume/*
) し、これを新規の要求で再度利用可能にします。
recycle
回収ポリシーは動的プロビジョニングが優先されるために非推奨となり、今後のリリースでは削除されます。
4.3.3. 永続ボリューム
各 PV には、ボリュームの仕様およびステータスである spec
および status
が含まれます。
永続ボリュームオブジェクトの定義
apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /tmp server: 172.17.0.2
4.3.3.1. 永続ボリュームのタイプ
OpenShift Online は以下の PersistentVolume
プラグインをサポートします。
- NFS
- HostPath
- GlusterFS
- Ceph RBD
- OpenStack Cinder
- AWS Elastic Block Store (EBS)
- GCE Persistent Disk
- iSCSI
- ファイバーチャネル
- Azure Disk
- Azure File
- VMWare vSphere
- ローカル
4.3.3.2. 容量
通常、PV には特定のストレージ容量があります。これは PV の capacity
属性を使用して設定されます。
現時点で、ストレージ容量は設定または要求できる唯一のリソースです。今後は属性として IOPS、スループットなどが含まれる可能性があります。
4.3.3.3. アクセスモード
PersistentVolume
はリソースプロバイダーでサポートされるすべての方法でホストにマウントできます。プロバイダーには各種の機能があり、それぞれの PV のアクセスモードは特定のボリュームでサポートされる特定のモードに設定されます。たとえば、NFS は複数の読み取り/書き込みクライアントをサポートしますが、特定の NFS PV は読み取り専用としてサーバー上でエクスポートされる可能性があります。それぞれの PV は、その特定の PV の機能について記述するアクセスモードの独自のセットを取得します。
要求は、同様のアクセスモードのボリュームに一致します。一致する条件はアクセスモードとサイズの 2 つの条件のみです。要求のアクセスモードは要求 (request) を表します。そのため、より多くのアクセスを付与することはできますが、アクセスを少なくすることはできません。たとえば、要求により RWO が要求されるものの、利用できる唯一のボリュームが NFS PV (RWO+ROX+RWX) の場合に、要求は RWO をサポートする NFS に一致します。
直接的なマッチングが常に最初に試行されます。ボリュームのモードは、要求モードと一致するか、要求した内容以上のものを含む必要があります。サイズは予想されるものより多いか、またはこれと同等である必要があります。2 つのタイプのボリューム (NFS および iSCSI など) に同じアクセスモードセットがある場合には、いずれかをこれらのモードを含む要求と一致させることができます。ボリュームのタイプ間で順序付けすることはできず、タイプを選択することはできません。
同じモードのボリュームはすべて分類され、サイズ別 (一番小さいものから一番大きいもの順) に分類されます。バインダーは一致するモードのグループを取得し、1 つのサイズが一致するまでそれぞれを (サイズの順序で) 繰り返し処理します。
アクセスモードは以下のようになります。
アクセスモード | CLI の省略形 | 説明 |
---|---|---|
ReadWriteOnce |
| ボリュームは単一ノードで読み取り/書き込みとしてマウントできます。 |
ReadOnlyMany |
| ボリュームは数多くのノードで読み取り専用としてマウントできます。 |
ReadWriteMany |
| ボリュームは数多くのノードで読み取り/書き込みとしてマウントできます。 |
ボリュームの AccessModes
は、ボリュームの機能の記述子です。それらは施行されている制約ではありません。ストレージプロバイダーはリソースの無効な使用から生じるランタイムエラーに対応します。
たとえば、Ceph は ReadWriteOnce アクセスモードを提供します。ボリュームの ROX 機能を使用する必要がある場合は、要求に read-only
のマークを付ける必要があります。プロバイダーのエラーは、マウントエラーとしてランタイム時に表示されます。
以下の表では、異なる永続ボリュームによってサポートされるアクセスモードを一覧表示しています。
ボリュームプラグイン | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWS EBS |
✅ |
- |
- |
Azure File |
✅ |
✅ |
✅ |
Azure Disk |
✅ |
- |
- |
Ceph RBD |
✅ |
✅ |
- |
ファイバーチャネル |
✅ |
✅ |
- |
GCE Persistent Disk |
✅ |
- |
- |
GlusterFS |
✅ |
✅ |
✅ |
HostPath |
✅ |
- |
- |
iSCSI |
✅ |
✅ |
- |
NFS |
✅ |
✅ |
✅ |
Openstack Cinder |
✅ |
- |
- |
VMWare vSphere |
✅ |
- |
- |
ローカル |
✅ |
- |
- |
- Pod が AWS EBS、GCE 永続ディスク、または Openstack Cinder PV に依存する場合、再作成デプロイメントストラテジーを使用します。
4.3.3.4. OpenShift Online の制限
OpenShift Online で永続ボリュームを使用する場合には以下の制限が適用されます。
- PV は EBS ボリューム (AWS) でプロビジョニングされます。
- EBS ボリュームおよび GCE 永続ディスクは複数のノードにマウントできないので、RWO アクセスモードのみを使用できます。
Docker ボリュームは無効にされます。
- マップされた外部ボリュームがない VOLUME ディレクティブはインスタンス化できません。
emptyDir はノード別のプロジェクト (グループ) ごとに 512 Mi に制限されます。
- 特定のノード上にプロジェクトの単一 Pod がある場合、Pod は最大 512 Mi の emptyDir ストレージを消費できます。
- 特定のノード上にプロジェクトに複数の Pod がある場合、それらの Pod は最大 512 Mi の emptyDir ストレージを共有します。
emptyDir には Pod と同じライフサイクルがあります。
- emptyDir ボリュームはコンテナーのクラッシュ/再起動後も永続します。
- emptyDir ボリュームは Pod の削除時に削除されます。
4.3.3.5. 回収ポリシー
現時点で、回収ポリシーは以下のようになります。
回収ポリシー | 説明 |
---|---|
Retain (保持) | 手動による回収 |
Recycle (リサイクル) |
基本的なスクラブ(例: |
現時点では、NFS および HostPath のみが「リサイクル」回収ポリシーをサポートしています。
recycle
回収ポリシーは動的プロビジョニングが優先されるために非推奨となり、今後のリリースでは削除されます。
4.3.3.6. フェーズ
ボリュームは以下のフェーズのいずれかにあります。
フェーズ | 説明 |
---|---|
Available | 要求にバインドされていない空きリソースです。 |
Bound | ボリュームが要求にバインドされています。 |
Released | 要求が検出されていますが、リソースがまだクラスターにより回収されていません。 |
Failed | ボリュームが自動回収に失敗しています。 |
CLI には PV にバインドされている PVC の名前が表示されます。
4.3.4. Persistent Volume Claim (永続ボリューム要求、PVC)
各 PVC には、要求の仕様およびステータスである spec
および status
が含まれます。
Persistent Volume Claim (永続ボリューム要求、PVC) オブジェクト定義
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: gold
4.3.4.1. ストレージクラス
要求は、ストレージクラスの名前を storageClassName
属性に指定して特定のストレージクラスをオプションでリクエストできます。リクエストされたクラスの PV、つまり PVC と同じ storageClassName
を持つ PV のみが PVC にバインドされます。クラスター管理者は 1 つ以上のストレージクラスを提供するように動的プロビジョナーを設定できます。クラスター管理者は、PVC の仕様に一致する PV をオンデマンドで作成できます。
クラスター管理者は、すべての PVC にデフォルトストレージクラスを設定することもできます。デフォルトのストレージクラスが設定されると、PVC は ""
に設定された StorageClass
または storageClassName
アノテーションがストレージクラスなしの PV にバインドされるように明示的に要求する必要があります。
4.3.4.2. アクセスモード
要求は、特定のアクセスモードのストレージを要求する際にボリュームと同じ規則を使用します。
4.3.4.3. リソース
要求は、Pod の場合のようにリソースの特定の数量を要求できます。今回の例では、これはストレージに対する要求です。同じリソースモデルがボリュームと要求の両方に適用されます。
4.3.4.4. ボリュームとしての要求
Pod は要求をボリュームとして使用することでストレージにアクセスします。この要求を使用して、Pod と同じ namespace 内に要求を共存させる必要があります。クラスターは Pod の namespace で要求を見つけ、これを使用して要求をサポートする PersistentVolume
を取得します。ボリュームはホストにマウントされ、Pod に組み込まれます。
kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: myfrontend image: dockerfile/nginx volumeMounts: - mountPath: "/var/www/html" name: mypd volumes: - name: mypd persistentVolumeClaim: claimName: myclaim