第4章 Container Storage Interface (CSI) の使用
4.1. CSI ボリュームの設定
Container Storage Interface (CSI) により、OpenShift Container Platform は CSI インターフェイス を永続ストレージとして実装するストレージバックエンドからストレージを使用できます。
OpenShift Container Platform には CSI ドライバーが含まれていません。コミュニティーまたはストレージベンダー が提供する CSI ドライバーを使用することが推奨されます。
インストールの手順はドライバーによって異なりますが、各ドライバーのドキュメントに記載されています。CSI ドライバーの提供される手順に従います。
4.1.1. CSI アーキテクチャー
CSI ドライバーは通常、コンテナーイメージとして提供されます。これらのコンテナーは、実行先の OpenShift Container Platform を認識しません。OpenShift Container Platform でサポートされる CSI 互換のストレージバックエンドを使用するには、クラスター管理者は、OpenShift Container Platform とストレージドライバーの橋渡しとして機能するコンポーネントを複数デプロイする必要があります。
以下の図では、OpenShift Container Platform クラスターの Pod で実行されるコンポーネントの俯瞰図を示しています。
![Architecture of CSI components](https://access.redhat.com/webassets/avalon/d/OpenShift_Container_Platform-4.4-Storage-ja-JP/images/4140523ee4b0abd54d028a6eca02f0eb/csi-arch.png)
異なるストレージバックエンドに対して複数の CSI ドライバーを実行できます。各ドライバーには、独自の外部コントローラーのデプロイメントおよびドライバーと CSI レジストラーを含むデーモンセットが必要です。
4.1.1.1. 外部の CSI コントローラー
外部の CSI コントローラーは、3 つのコンテナーを含む 1 つまたは複数の Pod を配置するデプロイメントです。
-
OpenShift Container Platform からの
attach
およびdetach
の呼び出しを適切な CSI ドライバーへのControllerPublish
およびControllerUnpublish
呼び出しに変換する外部の CSI アタッチャーコンテナー。 -
OpenShift Container Platform からの
provision
およびdelete
呼び出しを適切な CSI ドライバーへのCreateVolume
およびDeleteVolume
呼び出しに変換する外部の CSI プロビジョナーコンテナー。 - CSI ドライバーコンテナー
CSI アタッチャーおよび CSI プロビジョナーコンテナーは、Unix Domain Socket を使用して、CSI ドライバーコンテナーと通信し、CSI の通信が Pod 外に出ないようにします。CSI ドライバーは Pod 外からはアクセスできません。
通常、attach
、detach
、provision
および delete
操作では、CSI ドライバーがストレージバックエンドに対する認証情報を使用する必要があります。CSI コントローラー Pod をインフラストラクチャーノードで実行し、コンピュートノードで致命的なセキュリティー違反が発生した場合でも認証情報がユーザープロセスに漏洩されないようにします。
外部のアタッチャーは、サードパーティーの attach
または detach
操作をサポートしない CSI ドライバーに対しても実行する必要があります。外部のアタッチャーは、CSI ドライバーに対して ControllerPublish
または ControllerUnpublish
操作を実行しません。ただし、必要な OpenShift Container Platform 割り当て API を実装できるように依然として実行する必要があります。
4.1.1.2. CSI ドライバーのデーモンセット
CSI ドライバーのデーモンセットは、OpenShift Container Platform が CSI ドライバーによって提供されるストレージをノードにマウントして、永続ボリューム (PV) としてユーザーワークロード (Pod) で使用できるように、全ノードで Pod を実行します。CSI ドライバーがインストールされた Pod には、以下のコンテナーが含まれます。
-
ノード上で実行中の
openshift-node
サービスに CSI ドライバーを登録する CSI ドライバーレジストラー。このノードで実行中のopenshift-node
プロセスは、ノードで利用可能な Unix Domain Socket を使用して CSI ドライバーに直接接続します。 - CSI ドライバー
ノードにデプロイされた CSI ドライバーには、ストレージバックエンドへの認証情報をできる限り少なく指定する必要があります。OpenShift Container Platform は、NodePublish
/NodeUnpublish
および NodeStage
/NodeUnstage
(実装されている場合) などの CSI 呼び出しのノードプラグインセットのみを使用します。
4.1.2. 動的プロビジョニング
永続ストレージの動的プロビジョニングは、CSI ドライバーおよび基礎となるストレージバックエンドの機能により異なります。CSI ドライバーのプロバイダーは、OpenShift Container Platform でのストレージクラスの作成方法および設定に利用でじるパラメーターについての文書を作成する必要があります。
作成されたストレージクラスは、動的プロビジョニングを有効にするために設定できます。
手順
デフォルトのストレージクラスを作成します。 これにより、特殊なストレージクラスを必要としないすべての PVC がインストールされた CSI ドライバーでプロビジョニングされます。
# oc create -f - << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class> 1 annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: <provisioner-name> 2 parameters: EOF
4.1.3. CSI ドライバーの使用例
以下の例では、テンプレートを変更せずにデフォルトの MySQL テンプレートをインストールします。
前提条件
- CSI ドライバーがデプロイされている。
- 動的プロビジョニング用にストレージクラスが作成されている。
手順
MySQL テンプレートを作成します。
# oc new-app mysql-persistent --> Deploying template "openshift/mysql-persistent" to project default ... # oc get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql Bound kubernetes-dynamic-pv-3271ffcb4e1811e8 1Gi RWO cinder 3s