このページでは、Container Storage Interface(CSI)ストレージ ドライバをベアメタル版 GKE クラスタにインストールする方法について説明します。
概要
Container Storage Interface(CSI)は、Kubernetes がコンテナ化されたワークロードに任意のストレージ システムを公開でき、多くの大手ストレージ ベンダーがサポートするオープン スタンダード API です。
Kubernetes の Volume は、ベンダー固有のストレージ ドライバによって管理されており、これまでは Kubernetes バイナリにコンパイルされてきました。以前は、Kubernetes に含まれていないストレージ ドライバを使用できませんでした。CSI ドライバをインストールすると、Kubernetes でネイティブにサポートされないストレージ システムがサポートされるようになります。また、CSI を使用すると、スナップショットやサイズ変更などの最新のストレージ機能を使用できます。
CSI ドライバを使用するには、Kubernetes StorageClass を作成する必要があります。StorageClass のプロビジョナーとして CSI ドライバを設定します。次に、StorageClass をクラスタのデフォルトとして設定するか、StorageClass を使用するようにワークロードを構成します(StatefulSet の例)。
ベンダーの CSI ドライバをインストールする
ストレージ ベンダーは独自の CSI ドライバを開発し、インストール手順を示す義務を負っています。単純なケースでのインストールは、マニフェストをクラスタにデプロイするだけです。CSI ドキュメントの CSI ドライバの一覧をご覧ください。
本番環境のストレージについては、GDCV Ready ストレージ パートナーから CSI ドライバをインストールすることをおすすめします。
ドライバのインストールを確認する
CSI ドライバをインストールした後、次のコマンドを実行してインストールを確認できます。
kubectl get csinodes -o jsonpath='{range .items[*]} \
{.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
CSI ドライバを使用する
CSI ドライバを使用する手順は次のとおりです。
provisioner
フィールドでドライバを参照する Kubernetes StorageClass を作成します。次のいずれか方法でストレージをプロビジョニングできます。
- StatefulSet オブジェクトの
volumeClaimTemplates
仕様で StorageClass を参照します。 - クラスタのデフォルトの StorageClass として設定します。
- StatefulSet オブジェクトの
CSI ドライバによりサポートされる StorageClasses に関する考慮事項
StorageClass を作成するときは、次の点を考慮します。
- CSI ドライバのドキュメントには、StorageClass に指定するドライバ固有のパラメータ(プロビジョナー名など)を含めます。
- StorageClass は、関連する特定のドライバやアプライアンスの名前ではなく、プロパティに基づく名前を付ける必要があります。StorageClass にプロパティに基づく名前を付けると、複数のクラスタや環境で同じ名前の StorageClass を作成できます。これにより、アプリケーションは同じプロパティのストレージを複数のクラスタで取得できるようになります。
例: StatefulSet 内の StorageClass の参照
次の例では、StorageClass で CSI ドライバを定義してから、StatefulSet ワークロードで StorageClass を参照する方法をモデル化します。ドライバがすでにクラスタにインストールされていることを前提としています。
次の簡単な StorageClass premium-rwo
では、架空の CSI ドライバ csi.example.com
をプロビジョナーとして使用します。
fast-sc.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: premium-rwo provisioner: csi.example.com # CSI driver parameters: # You provide vendor-specific parameters to this specification type: example-parameter # Be sure to follow the vendor's instructions datastore: my-datastore reclaimPolicy: Retain allowVolumeExpansion: true
StatefulSet の volumeClaimTemplates
仕様で StorageClass を参照します。
StatefulSet の volumeClaimTemplates
仕様で StorageClass を参照すると、Kubernetes は PersistentVolume(PV)を使用して安定したストレージを提供します。Kubernetes は、StorageClass で定義されたプロビジョナーを呼び出して新しいストレージ Volume を作成します。この場合、Kubernetes は架空の csi.example.com
プロバイダを呼び出します。このプロバイダが、プロバイダの API を呼び出して Volume を作成します。Volume がプロビジョニングされると、Kubernetes は自動的に PV を作成してストレージを表します。
StorageClass を参照する単純な StatefulSet は次のとおりです。
statefulset.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: # This is the specification in which you reference the StorageClass - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi storageClassName: premium-rwo # This field references the existing StorageClass