6.6. ボリュームポピュレーター
ボリュームポピュレーターを使用すると、空のボリュームをプロビジョニングする代わりに、動的プロビジョニング中にボリュームにデータを自動で事前にロードできます。
6.6.1. ボリュームポピュレーターの概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform バージョン 4.12 から 4.19 では、永続ボリューム要求 (PVC) 仕様の dataSource フィールドでボリュームポピュレーター機能を指定できます。ただし、ボリュームを作成するためのデータソースとして使用できるのは、PVC とスナップショットのみに制限されています。
OpenShift Container Platform バージョン 4.20 以降では、代わりに dataSourceRef フィールドを使用します。dataSourceRef フィールドを使用すると、適切なカスタムリソース (CR) をデータソースとして使用して、新しいボリュームにデータを事前投入できます。
dataSource フィールドを使用したボリュームポピュレーター機能は、今後のバージョンで非推奨化される可能性があります。このフィールドを使用して作成したボリュームポピュレーターがある場合は、今後の問題を回避するために、dataSourceRef フィールドを使用してボリュームポピュレーターを再作成することを検討してください。
ボリュームへのデータの事前投入はデフォルトで有効になっており、OpenShift Container Platform にはインストール済みの volume-data-source-validator コントローラーが含まれています。ただし、OpenShift Container Platform にはボリュームポピュレーターは同梱されていません。
6.6.2. ボリュームポピュレーターの作成 リンクのコピーリンクがクリップボードにコピーされました!
ボリュームポピュレーターを作成して使用するには、以下を実行します。
- ボリュームポピュレーター用のカスタムリソース定義 (CRD) を作成します。
- ボリュームポピュレーターを使用して、データが事前にロードされたボリュームを作成します。
6.6.2.1. ボリュームポピュレーターの CRD の作成 リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、ボリュームポピュレーターの "hello, world" カスタムリソース定義 (CRD) の例を作成する方法について説明します。
ユーザーは、この CRD のインスタンスを作成し、永続ボリューム要求 (PVC) に対してデータを事前に投入できます。
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
- クラスター管理者権限でクラスターにアクセスできる。
手順
次のサンプル YAML ファイルを使用して、ポピュレーターおよび関連リソースの論理グループと操作の namespace を作成します。
namespace YAML ファイルの例
apiVersion: v1 kind: Namespace metadata: name: hello次のサンプル YAML ファイルを使用して、データソースの CRD を作成します。
CRD YAML ファイルの例
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: hellos.hello.example.com spec: group: hello.example.com names: kind: Hello listKind: HelloList plural: hellos singular: hello scope: Namespaced versions: - name: v1alpha1 schema: openAPIV3Schema: description: Hello is a specification for a Hello resource properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string spec: description: HelloSpec is the spec for a Hello resource properties: fileContents: type: string fileName: type: string required: - fileContents - fileName type: object required: - spec type: object served: true storage: trueServiceAccount、ClusterRole、ClusterRoleBindering、およびDeploymentを作成してコントローラーをデプロイし、データの事前投入を実装するロジックを実行します。次のサンプル YAML ファイルを使用して、ポピュレーターのサービスアカウントを作成します。
サービスアカウント YAML ファイルの例
apiVersion: v1 kind: ServiceAccount metadata: name: hello-account namespace: hello1 - 1
- 先ほど作成した namespace を参照します。
次のサンプル YAML ファイルを使用して、ポピュレーターのクラスターロールを作成します。
クラスターロールの YAML ファイルの例
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: hello-role rules: - apiGroups: [hello.example.com] resources: [hellos] verbs: [get, list, watch]次のサンプル YAML ファイルを使用して、クラスターロールバインディングを作成します。
クラスターロールバインディングの YAML ファイルの例
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: hello-binding1 subjects: - kind: ServiceAccount name: hello-account2 namespace: hello3 roleRef: kind: ClusterRole name: hello-role4 apiGroup: rbac.authorization.k8s.io次のサンプル YAML ファイルを使用して、ポピュレーターのデプロイメントを作成します。
デプロイメント YAML ファイルの例
kind: Deployment apiVersion: apps/v1 metadata: name: hello-populator namespace: hello1 spec: selector: matchLabels: app: hello template: metadata: labels: app: hello spec: serviceAccount: hello-account2 containers: - name: hello image: registry.k8s.io/sig-storage/hello-populator:v1.0.1 imagePullPolicy: IfNotPresent args: - --mode=controller - --image-name=registry.k8s.io/sig-storage/hello-populator:v1.0.1 - --http-endpoint=:8080 ports: - containerPort: 8080 name: http-endpoint protocol: TCP
次のサンプル YAML ファイルを使用して、ボリュームポピュレーターを作成し、
kind:Helloリソースをボリュームの有効なデータソースとして登録します。ボリュームポピュレーターの YAML ファイルの例
kind: VolumePopulator apiVersion: populator.storage.k8s.io/v1beta1 metadata: name: hello-populator1 sourceKind: group: hello.example.com kind: Hello- 1
- ボリュームポピュレーターの名前。
未登録のポピュレーターを使用する PVC は、"The datasource for this PVC does not match any registered VolumePopulator" というイベントを作成します。これは、未知 (未登録) ポピュレーターを使用しているため、PVC がプロビジョニングされない可能性があることを示します。
次のステップ
- これで、この CRD の CR インスタンスを作成して PVC にデータを事前投入できるようになりました。
ボリュームポピュレーターを使用してボリュームにデータを事前投入する方法については、ボリュームポピュレーターを使用してデータが事前投入されたボリュームを作成する を参照してください。
6.6.2.2. ボリュームポピュレーターを使用してデータが事前投入されたボリュームを作成する リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、前に作成したサンプルの hellos.hello.example.com カスタムリソース定義 (CRD) を使用して、データが事前投入された永続ボリューム要求 (PVC) を作成する方法について説明します。
この例では、実際のデータソースを使用するのではなく、ボリュームのルートディレクトリーに文字列 "Hello, world!" が含まれる "example.txt" というファイルを作成します。実際の実装では、独自のボリュームポピュレーターを作成する必要があります。
前提条件
- 実行中の OpenShift Container Platform クラスターにログインしている。
- ボリュームポピュレーター用の既存のカスタムリソース定義 (CRD) がある。
- OpenShift Container Platform にボリュームポピュレーターは同梱されていません。必ず 独自のボリュームポピュレーターを作成してください。
手順
次のコマンドを実行して、
fileContentsパラメーターとして渡された "Hello, World!" というテキストが含まれるHelloCRD のカスタムリソース (CR) インスタンスを作成します。$ oc apply -f - <<EOF apiVersion: hello.example.com/v1alpha1 kind: Hello metadata: name: example-hello spec: fileName: example.txt fileContents: Hello, world! EOF次のサンプルファイルのような、Hello CR を参照する PVC を作成します。
PVC YAML ファイルの例
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Mi dataSourceRef:1 apiGroup: hello.example.com kind: Hello name: example-hello2 volumeMode: Filesystem
検証
数分経過したら、次のコマンドを実行して、PVC が作成され、ステータスが
Boundになっていることを確認します。$ oc get pvc example-pvc -n hello1 - 1
- この例では、PVC の名前は
example-pvcです。
出力例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE example-pvc Bound my-pv 10Mi ReadWriteOnce gp3-csi <unset> 14s次のサンプルファイルを使用して、PVC を読み取ってデータソース情報が適用されたことを検証するジョブを作成します。
ジョブ YAML ファイルの例
apiVersion: batch/v1 kind: Job metadata: name: example-job spec: template: spec: containers: - name: example-container image: busybox:latest command: - cat - /mnt/example.txt1 volumeMounts: - name: vol mountPath: /mnt restartPolicy: Never volumes: - name: vol persistentVolumeClaim: claimName: example-pvc2 次のコマンドを実行してジョブを開始します。
$ oc run example-job --image=busybox --command -- sleep 30 --restart=OnFailure出力例
pod/example-job created次のコマンドを実行して、ジョブとそのすべての依存関係が完了するまで待機します。
$ oc wait --for=condition=Complete pod/example-job次のコマンドを実行して、ジョブが収集したコンテンツを検証します。
$ oc logs job/example-job予想される出力
Hello, world!
6.6.2.3. ボリュームポピュレーターのアンインストール リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、ボリュームポピュレーターをアンインストールする方法について説明します。
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
- クラスター管理者権限でクラスターにアクセスできる。
手順
ボリュームポピュレーターをアンインストールするには、以下の手順でインストールしたすべてのオブジェクトを逆の順序で削除します。
- ボリュームポピュレーターを使用してデータが事前投入されたボリュームを作成する セクション。
ボリュームポピュレーターの CRD の作成 セクション。
必ず
VolumePopulatorインスタンスを削除してください。