このページでは、Anthos clusters on VMware(GKE On-Prem)に Container Storage Interface(CSI)ストレージ ドライバをインストールする方法について説明します。
概要
CSI は Kubernetes がコンテナ化されたワークロードに任意のストレージ システムを公開できるオープン標準 API です。CSI 互換のストレージ ドライバを Anthos clusters on VMware にデプロイすると、クラスタは vSphere ストレージを経由せずに、互換性のあるストレージ デバイスに直接接続できます。
Kubernetes の Volume は、ベンダー固有のストレージ ドライバによって管理され、これまでは Kubernetes バイナリにコンパイルされてきました。以前は、Kubernetes に含まれていないストレージ ドライバを使用できませんでした。CSI ドライバをインストールすると、Kubernetes でネイティブにサポートされないストレージ システムがサポートされるようになります。また、CSI を使用すると、スナップショットやサイズ変更などの最新のストレージ機能を使用できます。
CSI ドライバを使用するには、Kubernetes StorageClass を作成する必要があります。StorageClass のプロビジョナーとして CSI ドライバを設定します。次に、StorageClass をクラスタのデフォルトとして設定するか、StorageClass を使用するようにワークロードを構成します(StatefulSet の例)。
始める前に
Anthos clusters on VMware では、デフォルトで組み込みの vsphereVolume ドライバを介して vSphere データストアを使用します。また、NFS と iSCSI 用の組み込みドライバでは、既存のボリュームをワークロードに接続してマウントできます。
ベンダーの CSI ドライバをインストールする
ストレージ ベンダーは独自の CSI ドライバを開発し、インストール手順を示す義務を負っています。単純なケースでのインストールは、マニフェストをクラスタにデプロイするだけです。CSI ドキュメントの CSI ドライバの一覧をご覧ください。
ドライバのインストールを確認する
CSI ドライバをインストールしたら、クラスタの Anthos clusters on VMware のバージョンに応じて、次のいずれかのコマンドを実行し、インストールを確認します。
1.2.0-gke.5
kubectl get csinodes \ -o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
1.1.0-gke.6
kubectl get nodes \ -o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'
CSI ドライバを使用する
CSI ドライバを使用する手順は次のとおりです。
provisioner
フィールドでドライバを参照する Kubernetes StorageClass を作成します。次のいずれか方法でストレージをプロビジョニングできます。
- StatefulSet オブジェクトの
volumeClaimTemplates
仕様で StorageClass を参照します。 - クラスタのデフォルトの StorageClass として設定します。
- StatefulSet オブジェクトの
CSI ドライバによりサポートされる StorageClasses に関する考慮事項
StorageClass を作成するときは、次の点を考慮します。
- CSI ドライバのドキュメントには、StorageClass に指定するドライバ固有のパラメータ(プロビジョナー名など)を含めます。
- StorageClass は、関連する特定のドライバやアプライアンスの名前ではなく、プロパティに基づく名前を付ける必要があります。StorageClass のプロパティに基づく名前を付けると、複数のクラスタや環境で同じ名前の StorageClass を作成できます。これにより、アプリケーションは同じプロパティのストレージを複数のクラスタで取得できるようになります。
例: StatefulSet 内の StorageClass の参照
次の例では、StorageClass で CSI ドライバを定義してから、StatefulSet ワークロードで StorageClass を参照する方法をモデル化します。ドライバがすでにクラスタにインストールされていることを前提としています。
次の例では、premium-rwo
という単純な StorageClass で、架空の 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: k8s.gcr.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: fast # This field references the existing StorageClass