Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

27.12.2. FlexVolume ドライバー

FlexVolume ドライバーは、クラスター内のすべてのマシン (マスターとノードの両方) の明確に定義されたディレクトリーに格納されている実行可能ファイルです。OpenShift Container Platform は、flexVolume をソースとする PersistentVolume によって表されるボリュームの割り当て、割り当て解除、マウント、またはアンマウントが必要になるたびに 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 です。

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

FlexVolume ドライバーは以下の 2 つのモードで動作します。

attach/detach 操作は、OpenShift Container Platform マスターにより、ノードにボリュームを割り当てるため、およびノードからボリュームの割り当てを解除するために使用されます。これは何らかの理由でノードが応答不能になった場合に役立ちます。その後、マスターはノード上のすべての Pod を強制終了し、ノードからすべてのボリュームの割り当てを解除して、ボリュームを他のノードに割り当てることで、元のノードがまだ到達不能な状態であってもアプリケーションを再開できます。

重要

マスター実行の、別のマシンからのボリュームの割り当て解除は、すべてのストレージバックエンドでサポートされる訳ではありません。

27.12.2.1. マスター実行の割り当て/割り当て解除がある FlexVolume ドライバー

マスター制御の割り当て/割り当て解除をサポートする FlexVolume ドライバーは、以下の操作を実装する必要があります。

init

ドライバーを初期化します。マスターとノードの初期化中に呼び出されます。

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

ボリュームの一意の名前を返します。この名前は、後続の detach 呼び出しで <volume-name> として使用されるため、すべてのマスターとノード間で一致している必要があります。<volume-name>/ 文字は自動的に ~ に置き換えられます。

  • 引数: <json>
  • 実行場所: マスター、ノード
  • 予期される出力: デフォルトの JSON + volumeName:

    {
    	"status": "Success",
    	"message": "",
    	"volumeName": "foo-volume-bar" 1
    }
    1
    ストレージバックエンド foo のボリュームの一意の名前。
attach

指定されたノードに、JSON で表現したボリュームを割り当てます。この操作は、ノード上のデバイスが既知の場合 (つまり、そのデバイスが実行前にストレージバックエンドによって割り当て済みの場合)、そのデバイスの名前を返します。デバイスが既知でない場合は、後続の waitforattach 操作によってノード上のデバイスが検出される必要があります。

  • 引数: <json> <node-name>
  • 実行場所: マスター
  • 予期される出力: デフォルトの JSON + device (既知の場合)。

    {
    	"status": "Success",
    	"message": "",
    	"device": "/dev/xvda" 1
    }
    1
    ノード上のデバイスの名前 (既知の場合)。
waitforattach

ボリュームがノードに完全に割り当てられ、デバイスが出現するまで待機します。前の attach 操作から <device-name> が返された場合は、それが入力パラメーターとして渡されます。そうでない場合、<device-name> は空であり、この操作によってノード上のデバイスを検出する必要があります。

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

    {
    	"status": "Success",
    	"message": "",
    	"device": "/dev/xvda" 1
    }
    1
    ノード上のデバイスの名前。
detach

ノードから、指定されたボリュームの割り当てを解除します。<volume-name> は、getvolumename 操作によって返されるデバイスの名前です。<volume-name>/ 文字は自動的に ~ に置き換えられます。

  • 引数: <volume-name> <node-name>
  • 実行場所: マスター
  • 予期される出力: デフォルトの JSON
isattached

ボリュームがノードに割り当てられていることを確認します。

  • 引数: <json> <node-name>
  • 実行場所: マスター
  • 予期される出力: デフォルトの JSON + attached

    {
    	"status": "Success",
    	"message": "",
    	"attached": true 1
    }
    1
    ノードへのボリュームの割り当てのステータス。
mountdevice

ボリュームのデバイスをディレクトリーにマウントします。<device-name> は、前の waitforattach 操作で返されるデバイスの名前です。

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

ボリュームのデバイスをディレクトリーからアンマウントします。

  • 引数: <mount-dir>
  • 実行場所: ノード

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

注記

マスターで実行される割り当て/割り当て解除操作はデフォルトで有効にされています。有効にされていない場合、割り当て/割り当て解除操作は、ボリュームの割り当て/割り当て解除が必要なノードで実行されます。FlexVolume ドライバー呼び出しの構文およびすべてのパラメーターはどちらの場合も同じ内容です。