4.6. FlexVolume を使用した永続ストレージ

OpenShift Container Platform は、ドライバーとのインターフェイスに実行可能なモデルを使用する out-of-tree 形式のプラグイン、FlexVolume をサポートします。

組み込みプラグインがないバックエンドのストレージを使用する場合は、FlexVolume ドライバーを使用して OpenShift Container Platform を拡張し、アプリケーションに永続ストレージを提供できます。

Pod は、flexvolume の in-tree 形式のプラグインを使用して FlexVolume ドライバーと対話します。

4.6.1. FlexVolume ドライバーについて

FlexVolume ドライバーは、クラスター内のすべてのノードの明確に定義されたディレクトリーに格納されている実行可能ファイルです。OpenShift Container Platform は、flexVolume をソースとする PersistentVolume オブジェクトによって表されるボリュームのマウントまたはアンマウントが必要になるたびに、FlexVolume ドライバーを呼び出します。

重要

OpenShift Container Platform では、FlexVolume について割り当ておよび割り当て解除の操作はサポートされません。

4.6.2. FlexVolume ドライバーの例

FlexVolume ドライバーの最初のコマンドライン引数は常に操作名です。その他のパラメーターは操作ごとに異なります。ほとんどの操作は、JSON (JavaScript Object Notation) 文字列をパラメーターとして取ります。このパラメーターは完全な JSON 文字列であり、JSON データを含むファイルの名前ではありません。

FlexVolume ドライバーには以下が含まれます。

  • すべての flexVolume.options
  • kubernetes.io/ という接頭辞が付いた flexVolume のいくつかのオプション。たとえば、fsTypereadwrite などです。
  • kubernetes.io/secret/ という接頭辞が付いた参照先シークレット (指定されている場合) の内容。

FlexVolume ドライバーの JSON 入力例

{
	"fooServer": "192.168.0.1:1234", 1
        "fooVolumeName": "bar",
	"kubernetes.io/fsType": "ext4", 2
	"kubernetes.io/readwrite": "ro", 3
	"kubernetes.io/secret/<key name>": "<key value>", 4
	"kubernetes.io/secret/<another key name>": "<another key value>",
}

1
flexVolume.options のすべてのオプション。
2
flexVolume.fsType の値。
3
flexVolume.readOnly に基づく ro/rw
4
flexVolume.secretRef によって参照されるシークレットのすべてのキーと値。

OpenShift Container Platform は、ドライバーの標準出力に JSON データが含まれていると想定します。指定されていない場合、出力には操作の結果が示されます。

FlexVolume ドライバーのデフォルトの出力例

{
	"status": "<Success/Failure/Not supported>",
	"message": "<Reason for success/failure>"
}

ドライバーの終了コードは、成功の場合は 0、エラーの場合は 1 です。

操作はべき等です。 すでに割り当てられているボリュームのマウント操作は成功します。

4.6.3. FlexVolume ドライバーのインストール

OpenShift Container Platform を拡張するために使用される FlexVolume ドライバーはノードでのみ実行されます。FlexVolume を実装するには、呼び出す操作の一覧とインストールパスのみが必要になります。

前提条件

  • FlexVolume ドライバーは、以下の操作を実装する必要があります。

    init

    ドライバーを初期化します。すべてのノードの初期化中に呼び出されます。

    • 引数: なし
    • 実行場所: ノード
    • 予期される出力: デフォルトの JSON
    mount

    ボリュームをディレクトリーにマウントします。これには、デバイスの検出、その後のデバイスのマウントを含む、ボリュームのマウントに必要なあらゆる操作が含まれます。

    • 引数: <mount-dir> <json>
    • 実行場所: ノード
    • 予期される出力: デフォルトの JSON
    unmount

    ボリュームをディレクトリーからアンマウントします。これには、アンマウント後にボリュームをクリーンアップするために必要なあらゆる操作が含まれます。

    • 引数: <mount-dir>
    • 実行場所: ノード
    • 予期される出力: デフォルトの JSON
    mountdevice
    ボリュームのデバイスを、個々の Pod がマウントをバインドするディレクトリーにマウントします。

この呼び出しでは FlexVolume 仕様に指定されるシークレットを渡しません。ドライバーでシークレットが必要な場合には、この呼び出しを実装しないでください。

  • 引数: <mount-dir> <json>
  • 実行場所: ノード
  • 予期される出力: デフォルトの JSON

    unmountdevice
    ボリュームのデバイスをディレクトリーからアンマウントします。
  • 引数: <mount-dir>
  • 実行場所: ノード
  • 予期される出力: デフォルトの JSON

    • その他のすべての操作は、{"status": "Not supported"} と終了コード 1 を出して JSON を返します。

手順

FlexVolume ドライバーをインストールします。

  1. この実行可能ファイルがクラスター内のすべてのノードに存在することを確認します。
  2. この実行可能ファイルをボリュームプラグインのパス (/etc/kubernetes/kubelet-plugins/volume/exec/<vendor>~<driver>/<driver>) に配置します。

たとえば、ストレージ foo の FlexVolume ドライバーをインストールするには、実行可能ファイルを /etc/kubernetes/kubelet-plugins/volume/exec/openshift.com~foo/foo に配置します。

4.6.4. FlexVolume ドライバーを使用したストレージの使用

OpenShift Container Platform の各 PersistentVolume オブジェクトは、ストレージバックエンドの 1 つのストレージアセット (ボリュームなど) を表します。

手順

  • インストールされているストレージを参照するには、PersistentVolume オブジェクトを使用します。

FlexVolume ドライバーを使用した永続ボリュームのオブジェクト定義例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001 1
spec:
  capacity:
    storage: 1Gi 2
  accessModes:
    - ReadWriteOnce
  flexVolume:
    driver: openshift.com/foo 3
    fsType: "ext4" 4
    secretRef: foo-secret 5
    readOnly: true 6
    options: 7
      fooServer: 192.168.0.1:1234
      fooVolumeName: bar

1
ボリュームの名前。これは永続ボリューム要求 (PVC) を使用するか、または Pod からボリュームを識別するために使用されます。この名前は、バックエンドストレージのボリューム名とは異なるものにすることができます。
2
このボリュームに割り当てられるストレージの量。
3
ドライバーの名前。このフィールドは必須です。
4
ボリュームに存在するオプションのファイルシステム。このフィールドはオプションです。
5
シークレットへの参照。このシークレットのキーと値は、起動時に FlexVolume ドライバーに渡されます。このフィールドはオプションです。
6
読み取り専用のフラグ。このフィールドはオプションです。
7
FlexVolume ドライバーの追加オプション。options フィールドでユーザーが指定するフラグに加え、以下のフラグも実行可能ファイルに渡されます。
"fsType":"<FS type>",
"readwrite":"<rw>",
"secret/key1":"<secret1>"
...
"secret/keyN":"<secretN>"
注記

シークレットは、呼び出しのマウント/マウント解除を目的とする場合にのみ渡されます。