6.3. ボリュームの使用によるコンテナーデータの永続化
コンテナー内のファイルは一時的なものです。そのため、コンテナーがクラッシュしたり停止したりした場合は、データが失われます。ボリューム を使用すると、Pod 内のコンテナーが使用しているデータを永続化できます。ボリュームはディレクトリーであり、Pod 内のコンテナーからアクセスすることができます。 ここでは、データが Pod の有効期間中保存されます。
6.3.1. ボリュームについて
ボリュームとは Pod およびコンテナーで利用可能なマウントされたファイルシステムのことであり、これらは数多くのホストのローカルまたはネットワーク割り当てストレージのエンドポイントでサポートされる場合があります。コンテナーはデフォルトで永続性がある訳ではなく、それらのコンテンツは再起動時にクリアされます。
ボリュームのファイルシステムにエラーが含まれないようにし、かつエラーが存在する場合はそれを修復するために、OpenShift Container Platform は mount
ユーティリティーの前に fsck
ユーティリティーを起動します。これはボリュームを追加するか、または既存ボリュームを更新する際に実行されます。
最も単純なボリュームタイプは emptyDir
です。これは、単一マシンの一時的なディレクトリーです。 管理者はユーザーによる Pod に自動的に割り当てられる 永続ボリュームの要求を許可することもできます。
emptyDir
ボリュームストレージは、FSGroup パラメーターがクラスター管理者によって有効にされている場合は Pod の FSGroup に基づいてクォータで制限できます。
6.3.2. OpenShift Container Platform CLI によるボリュームの操作
CLI コマンド oc set volume
を使用して、レプリケーションコントローラーやデプロイメント設定などの Pod テンプレートを持つオブジェクトのボリュームおよびボリュームマウントを追加し、削除することができます。また、Pod または Pod テンプレートを持つオブジェクトのボリュームを一覧表示することもできます。
oc set volume
コマンドは以下の一般的な構文を使用します。
$ oc set volume <object_selection> <operation> <mandatory_parameters> <options>
- オブジェクトの選択
-
oc set volume
コマンドのobject_seletion
パラメーターに、以下のいずれかを指定します。
構文 | 説明 | 例 |
---|---|---|
|
タイプ |
|
|
タイプ |
|
|
所定のラベルセレクターに一致するタイプ |
|
|
タイプ |
|
| リソースを編集するために使用するファイル名、ディレクトリー、または URL です。 |
|
- 操作
-
oc set volume
コマンドのoperation
パラメーターに--add
または--remove
を指定します。 - 必須パラメーター
- いずれの必須パラメーターも選択された操作に固有のものであり、これらについては後のセクションで説明します。
- オプション
- いずれのオプションも選択された操作に固有のものであり、これらについては後のセクションで説明します。
6.3.3. Pod のボリュームとボリュームマウントの一覧表示
Pod または Pod テンプレートのボリュームおよびボリュームマウントを一覧表示することができます。
手順
ボリュームを一覧表示するには、以下の手順を実行します。
$ oc set volume <object_type>/<name> [options]
ボリュームのサポートされているオプションを一覧表示します。
オプション | 説明 | デフォルト |
---|---|---|
| ボリュームの名前。 | |
|
名前でコンテナーを選択します。すべての文字に一致するワイルドカード |
|
以下に例を示します。
Pod p1 のすべてのボリュームを一覧表示するには、以下を実行します。
$ oc set volume pod/p1
すべてのデプロイメント設定で定義されるボリューム v1 を一覧表示するには、以下の手順を実行します。
$ oc set volume dc --all --name=v1
6.3.4. Pod へのボリュームの追加
Pod にボリュームとボリュームマウントを追加することができます。
手順
ボリューム、ボリュームマウントまたはそれらの両方を Pod テンプレートに追加するには、以下を実行します。
$ oc set volume <object_type>/<name> --add [options]
オプション | 説明 | デフォルト |
---|---|---|
| ボリュームの名前。 | 指定がない場合は、自動的に生成されます。 |
|
ボリュームソースの名前。サポートされる値は |
|
|
名前でコンテナーを選択します。すべての文字に一致するワイルドカード |
|
|
選択されたコンテナー内のマウントパス。コンテナーのルート ( | |
|
ホストパス。 | |
|
シークレットの名前。 | |
|
configmap の名前。 | |
|
永続ボリューム要求 (PVC) の名前。 | |
|
JSON 文字列としてのボリュームソースの詳細。必要なボリュームソースが | |
|
サーバー上で更新せずに変更したオブジェクトを表示します。サポートされる値は | |
| 指定されたバージョンで変更されたオブジェクトを出力します。 |
|
以下に例を示します。
新規ボリュームソース emptyDir を registry
DeploymentConfig
オブジェクトに追加するには、以下を実行します。$ oc set volume dc/registry --add
ヒントあるいは、以下の YAML を適用してボリュームを追加できます。
例6.1 ボリュームを追加したデプロイメント設定の例
kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: registry namespace: registry spec: replicas: 3 selector: app: httpd template: metadata: labels: app: httpd spec: volumes: 1 - name: volume-pppsw emptyDir: {} containers: - name: httpd image: >- image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest ports: - containerPort: 8080 protocol: TCP
- 1
- ボリュームソース emptyDir を追加します。
レプリケーションコントローラー r1 のシークレット secret1 を使用してボリューム v1 を追加し、コンテナー内の /data でマウントするには、以下を実行します。
$ oc set volume rc/r1 --add --name=v1 --type=secret --secret-name='secret1' --mount-path=/data
ヒントあるいは、以下の YAML を適用してボリュームを追加できます。
例6.2 ボリュームおよびシークレットを追加したレプリケーションコントローラーの例
kind: ReplicationController apiVersion: v1 metadata: name: example-1 namespace: example spec: replicas: 0 selector: app: httpd deployment: example-1 deploymentconfig: example template: metadata: creationTimestamp: null labels: app: httpd deployment: example-1 deploymentconfig: example spec: volumes: 1 - name: v1 secret: secretName: secret1 defaultMode: 420 containers: - name: httpd image: >- image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest volumeMounts: 2 - name: v1 mountPath: /data
要求名 pvc1 を使って既存の永続ボリューム v1 をディスク上のデプロイメント設定 dc.json に追加し、ボリュームをコンテナー c1 の /data にマウントし、サーバー上で
DeploymentConfig
オブジェクトを更新します。$ oc set volume -f dc.json --add --name=v1 --type=persistentVolumeClaim \ --claim-name=pvc1 --mount-path=/data --containers=c1
ヒントあるいは、以下の YAML を適用してボリュームを追加できます。
例6.3 永続ボリュームが追加されたデプロイメント設定の例
kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: example namespace: example spec: replicas: 3 selector: app: httpd template: metadata: labels: app: httpd spec: volumes: - name: volume-pppsw emptyDir: {} - name: v1 1 persistentVolumeClaim: claimName: pvc1 containers: - name: httpd image: >- image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest ports: - containerPort: 8080 protocol: TCP volumeMounts: 2 - name: v1 mountPath: /data
すべてのレプリケーションコントローラー向けにリビジョン 5125c45f9f563 を使い、Git リポジトリー https://github.com/namespace1/project1 に基づいてボリューム v1 を追加するには、以下の手順を実行します。
$ oc set volume rc --all --add --name=v1 \ --source='{"gitRepo": { "repository": "https://github.com/namespace1/project1", "revision": "5125c45f9f563" }}'
6.3.5. Pod 内のボリュームとボリュームマウントの更新
Pod 内のボリュームとボリュームマウントを変更することができます。
手順
--overwrite
オプションを使用して、既存のボリュームを更新します。
$ oc set volume <object_type>/<name> --add --overwrite [options]
以下に例を示します。
レプリケーションコントローラー r1 の既存ボリューム v1 を既存の永続ボリューム要求 (PVC) pvc1 に置き換えるには、以下の手順を実行します。
$ oc set volume rc/r1 --add --overwrite --name=v1 --type=persistentVolumeClaim --claim-name=pvc1
ヒントまたは、以下の YAML を適用してボリュームを置き換えることもできます。
例6.4
pvc1
という名前の永続ボリューム要求を持つレプリケーションコントローラーの例kind: ReplicationController apiVersion: v1 metadata: name: example-1 namespace: example spec: replicas: 0 selector: app: httpd deployment: example-1 deploymentconfig: example template: metadata: labels: app: httpd deployment: example-1 deploymentconfig: example spec: volumes: - name: v1 1 persistentVolumeClaim: claimName: pvc1 containers: - name: httpd image: >- image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest ports: - containerPort: 8080 protocol: TCP volumeMounts: - name: v1 mountPath: /data
- 1
- 永続ボリューム要求を
pvc1
に設定します。
DeploymentConfig
オブジェクトの d1 のマウントポイントを、ボリューム v1の /opt に変更するには、以下を実行します。$ oc set volume dc/d1 --add --overwrite --name=v1 --mount-path=/opt
ヒントまたは、以下の YAML を適用してマウントポイントを変更できます。
例6.5 マウントポイントが
opt
に設定されたデプロイメント設定の例kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: example namespace: example spec: replicas: 3 selector: app: httpd template: metadata: labels: app: httpd spec: volumes: - name: volume-pppsw emptyDir: {} - name: v2 persistentVolumeClaim: claimName: pvc1 - name: v1 persistentVolumeClaim: claimName: pvc1 containers: - name: httpd image: >- image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest ports: - containerPort: 8080 protocol: TCP volumeMounts: 1 - name: v1 mountPath: /opt
- 1
- マウントポイントを
/opt
に設定します。
6.3.6. Pod からのボリュームおよびボリュームマウントの削除
Pod からボリュームまたはボリュームマウントを削除することができます。
手順
Pod テンプレートからボリュームを削除するには、以下を実行します。
$ oc set volume <object_type>/<name> --remove [options]
オプション | 説明 | デフォルト |
---|---|---|
| ボリュームの名前。 | |
|
名前でコンテナーを選択します。すべての文字に一致するワイルドカード |
|
| 複数のボリュームを 1 度に削除することを示します。 | |
|
サーバー上で更新せずに変更したオブジェクトを表示します。サポートされる値は | |
| 指定されたバージョンで変更されたオブジェクトを出力します。 |
|
以下に例を示します。
DeploymentConfig
オブジェクトの d1から ボリューム v1 を削除するには、以下を実行します。$ oc set volume dc/d1 --remove --name=v1
DeploymentConfig
オブジェクトの d1 の c1 のコンテナーからボリューム v1 をアンマウントし、d1 のコンテナーで参照されていない場合にボリューム v1 を削除するには、以下の手順を実行します。$ oc set volume dc/d1 --remove --name=v1 --containers=c1
レプリケーションコントローラー r1 のすべてのボリュームを削除するには、以下の手順を実行します。
$ oc set volume rc/r1 --remove --confirm
6.3.7. Pod 内での複数の用途のためのボリュームの設定
ボリュームを、単一 Pod で複数の使用目的のためにボリュームを共有するように設定できます。この場合、volumeMounts.subPath
プロパティーを使用し、ボリュームのルートの代わりにボリューム内に subPath
値を指定します。
手順
ボリューム内のファイルの一覧を表示して、
oc rsh
コマンドを実行します。$ oc rsh <pod>
出力例
sh-4.2$ ls /path/to/volume/subpath/mount example_file1 example_file2 example_file3
subPath
を指定します。subPath
パラメーターを含むPod
仕様の例apiVersion: v1 kind: Pod metadata: name: my-site spec: containers: - name: mysql image: mysql volumeMounts: - mountPath: /var/lib/mysql name: site-data subPath: mysql 1 - name: php image: php volumeMounts: - mountPath: /var/www/html name: site-data subPath: html 2 volumes: - name: site-data persistentVolumeClaim: claimName: my-site-data