このページでは、Google Kubernetes Engine(GKE)Standard クラスタに Container Storage Interface(CSI)ストレージ ドライバをインストールする方法について説明します。このページは、Compute Engine 永続ディスクの CSI ドライバを自動で使用する GKE Autopilot クラスタには対応していません。
Standard クラスタで Compute Engine 永続ディスクの CSI ドライバを使用している場合は、ドライバを自動でデプロイして管理上のオーバーヘッドを減らすことをおすすめします。
概要
CSI は Kubernetes がコンテナ化されたワークロードに任意のストレージ システムを公開できるオープン標準 API です。Kubernetes の Volume は、ベンダー固有のストレージ ドライバによって管理されており、これまでは Kubernetes バイナリにコンパイルされてきました。以前は、Kubernetes に含まれていないストレージ ドライバを使用できませんでした。CSI ドライバをインストールすると、Kubernetes でネイティブにサポートされないストレージ システムがサポートされるようになります。また、CSI を使用すると、スナップショットやサイズ変更などの最新のストレージ機能を使用できます。
ベンダーの CSI ドライバをインストールする
他のストレージ ベンダーは独自の CSI ドライバを開発し、インストール手順を提供する義務を負っています。単純なケースでのインストールは、マニフェストをクラスタにデプロイするだけです。CSI ドキュメントの CSI ドライバの一覧をご覧ください。
ドライバのインストールを確認する
CSI ドライバのインストールが済むと、クラスタの GKE バージョンに応じて、次のいずれかのコマンドを実行してインストールを確認できます。
1.14+
kubectl get csinodes \ -o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
1.13.x
kubectl get nodes \ -o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'
CSI ドライバを使用する
CSI ドライバを使用する手順は次のとおりです。
ドライバのインストールの一部として StorageClass が作成されていない場合は、
provisioner
フィールドでドライバを参照する Kubernetes StorageClass を作成します。一部の CSI ドライバでは、インストール時に 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 を使用して安定したストレージを提供します。Kubernetes は、StorageClass で定義されたプロビジョナーを呼び出して新しいストレージ Volume を作成します。この場合、Kubernetes は架空の csi.example.com
プロバイダを呼び出します。このプロバイダが、プロバイダの API を呼び出して Volume を作成します。Volume がプロビジョニングされると、Kubernetes は自動的に PersistentVolume を作成してストレージを表します。
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
次のステップ
- GKE のストレージのコンセプトについて学習する。