27.12.2. FlexVolume ドライバー
FlexVolume ドライバーは、クラスター内のすべてのマシン (マスターとノードの両方) の明確に定義されたディレクトリーに格納されている実行可能ファイルです。OpenShift Container Platform は、flexVolume
をソースとする PersistentVolume
によって表されるボリュームの割り当て、割り当て解除、マウント、またはアンマウントが必要になるたびに FlexVolume ドライバーを呼び出します。
ドライバーの最初のコマンドライン引数は常に操作名です。その他のパラメーターは操作ごとに異なります。ほとんどの操作は、JSON (JavaScript Object Notation) 文字列をパラメーターとして取ります。このパラメーターは完全な JSON 文字列であり、JSON データを含むファイルの名前ではありません。
FlexVolume ドライバーには以下が含まれます。
-
すべての
flexVolume.options
。 -
kubernetes.io/
という接頭辞が付いたflexVolume
のいくつかのオプション。たとえば、fsType
やreadwrite
などです。 -
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>", }
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 ドライバー呼び出しの構文およびすべてのパラメーターはどちらの場合も同じ内容です。