Compute Engine 永続ディスクの CSI ドライバを使用する

Google Kubernetes Engine(GKE)を使用すると、Compute Engine 永続ディスク Container Storage Interface(CSI)ドライバをクラスタに簡単かつ自動的にデプロイして、管理できます。Compute Engine 永続ディスクの CSI ドライバは、Autopilot クラスタで常に有効になっており、無効にすることも編集することもできません。Standard クラスタでは、Compute Engine 永続ディスクの CSI ドライバを有効にする必要があります。

Compute Engine 永続ディスクの CSI ドライバのバージョンは GKE のバージョン番号に関連付けられています。通常、Compute Engine 永続ディスクの CSI ドライバのバージョンは、GKE バージョンがリリースされた時点で入手可能な最新バージョンになります。クラスタが最新の GKE パッチにアップグレードされると、ドライバは自動的に更新されます。

利点

Compute Engine 永続ディスクの CSI ドライバの使用には、次の利点があります。

  • 手動による設定を必要とせずに、永続ディスク ドライバの自動デプロイ、管理ができるようになります。
  • 顧客管理の暗号鍵(CMEK)を使用できます。これらの鍵は、データを暗号化するデータ暗号鍵を暗号化する際に使用されます。GKE での CMEK についての詳細は、CMEK の使用をご覧ください。
  • Compute Engine 永続ディスクの CSI ドライバでは、ボリューム スナップショットを使用できます。ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用すると、ボリュームを以前の状態に戻すことや、新しいボリュームをプロビジョニングすることが可能です。
  • GKE バージョン 1.22 以降を実行しているクラスタでは、Compute Engine 永続ディスクの CSI ドライバでボリュームのクローン作成を使用できます。ボリュームのクローン作成を使用すると、特定の時点でボリュームを複製でき、ソース ボリュームのすべてのデータがプロビジョニングされます。ボリュームのクローン作成を使用すると、特定の時点でボリュームを複製でき、ソース ボリュームのすべてのデータがプロビジョニングされます。
  • バグの修正と機能の更新は、Kubernetes のマイナー リリースとは別にリリースされます。このリリース スケジュールにより、一般的にはリリース サイクルが早くなります。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

Compute Engine 永続ディスクの CSI ドライバを有効にする

既存の Standard クラスタで Compute Engine 永続ディスクの CSI ドライバを有効にするには、Google Cloud CLI または Cloud de Confiance コンソールを使用します。

既存のクラスタでドライバを有効にするには、次の手順を行います。

gcloud

gcloud container clusters update CLUSTER-NAME \
   --update-addons=GcePersistentDiskCsiDriver=ENABLED

CLUSTER-NAME を、既存のクラスタの名前に置き換えます。

コンソール

  1. Cloud de Confiance コンソールで [Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [機能] の [Compute Engine 永続ディスクの CSI ドライバ] フィールドの横にある [Compute Engine CSI ドライバの編集] をクリックします。

  4. [Compute Engine 永続ディスクの CSI ドライバの有効化] のチェックボックスをオンにします。

  5. [変更を保存] をクリックします。

Compute Engine 永続ディスクの CSI ドライバを有効にすると、ドライバとプロビジョナーの名前(pd.csi.storage.gke.io)を使用して Kubernetes Volume でドライバを使用できます。

Compute Engine 永続ディスクの CSI ドライバを無効にする

Standard クラスタの Compute Engine 永続ディスクの CSI ドライバは、Google Cloud CLI または Cloud de Confiance コンソールを使用して無効にできます。

ドライバを無効にすると、現在ドライバが所有する PersistentVolume を使用する Pod は、すべて終了しなくなります。これらの PersistentVolume を使用する新しい Pod でも起動エラーが発生します。

既存の Standard クラスタでドライバを無効にするには、次の手順を行います。

gcloud

gcloud container clusters update CLUSTER-NAME \
    --update-addons=GcePersistentDiskCsiDriver=DISABLED

CLUSTER-NAME を、既存のクラスタの名前に置き換えます。

コンソール

  1. Cloud de Confiance コンソールで [Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [機能] の [Compute Engine 永続ディスクの CSI ドライバ] フィールドの横にある [Compute Engine CSI ドライバの編集] をクリックします。

  4. [Compute Engine 永続ディスクの CSI ドライバの有効化] のチェックボックスをオフにします。

  5. [変更を保存] をクリックします。

Linux クラスタに Compute Engine 永続ディスクの CSI ドライバを使用する

次のセクションでは、GKE で CSI ドライバによって管理される Kubernetes Volume を使用する際の一般的なプロセスについて説明します。これらのセクションは、Linux を使用するクラスタを対象としています。

StorageClass の作成

Compute Engine 永続ディスクの CSI ドライバを有効にすると、GKE は次の StorageClasses を自動的にインストールします。

  • バランス永続ディスクを使用する standard-rwo
  • SSD 永続ディスクを使用する premium-rwo

Autopilot クラスタの場合、デフォルトの StorageClass は standard-rwo で、Compute Engine 永続ディスクの CSI ドライバを使用します。標準クラスタの場合、デフォルトの StorageClass は、Kubernetes in-tree gcePersistentDisk Volume プラグインを使用します。

インストールされている StorageClass の名前は、次のコマンドを実行することで確認できます。

kubectl get sc

また、プロビジョナー フィールドに pd.csi.storage.gke.io を追加して、Compute Engine 永続ディスクの CSI ドライバを使用する別の StorageClass をインストールすることも可能です。

たとえば、次の pd-example-class.yaml という名前のファイルを使用して StorageClass を作成できます。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-example
provisioner: pd.csi.storage.gke.io
# Recommended setting. Delays the binding and provisioning of a PersistentVolume until a Pod that uses the
# PersistentVolumeClaim is created and scheduled on a node.
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-balanced

type パラメータで次の Persistent Disk タイプを指定できます。

  • pd-balanced
  • pd-ssd
  • pd-standard
  • pd-extreme(GKE バージョン 1.26 以降でサポート)

pd-standard または pd-extreme を使用する場合は、サポートされていないマシンタイプの追加の使用制限をご覧ください。

pd-extreme オプションを使用する場合は、マニフェストに provisioned-iops-on-create フィールドも追加する必要があります。このフィールドには、永続ディスクの作成時に指定したプロビジョニングされた IOPS 値と同じ値を設定する必要があります。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-extreme-example
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-extreme
  provisioned-iops-on-create:'10000'

pd-example-class.yaml ファイルを作成したら、次のコマンドを実行します。

kubectl create -f pd-example-class.yaml

PersistentVolumeClaim を作成する

Compute Engine 永続ディスクの CSI ドライバの StorageClass を参照する PersistentVolumeClaim を作成できます。

次の pvc-example.yaml という名前のファイルは、プリインストールされたストレージ クラス standard-rwo を使用しています。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: podpvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: standard-rwo
  resources:
    requests:
      storage: 6Gi

PersistentVolumeClaim マニフェストを作成したら、次のコマンドを実行します。

kubectl create -f pvc-example.yaml

プリインストールされた StorageClass(standard-rwo)では、volumeBindingModeWaitForFirstConsumer に設定されています。volumeBindingModeWaitForFirstConsumer に設定されている場合、PersistentVolumeClaim を参照する Pod がスケジュールされるまで、PersistentVolume はプロビジョニングされません。StorageClass 内の volumeBindingModeImmediate に設定されると(または除外されると)、PersistentVolumeClaim が作成された後に、永続ディスクにサポートされる PersistentVolume がプロビジョニングされます。

ボリュームを消費する Pod を作成する

PersistentVolume で Pod を使用する場合は、ワークロード コントローラ(Deployment、StatefulSet など)を使用することをおすすめします。通常は、スタンドアロン Pod は使用しませんが、次の例では、わかりやすいようにこれを使用しています。

次の例では、前のセクションで作成したボリュームを使用します。

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       # The path in the container where the volume will be mounted.
       - mountPath: /var/lib/www/html
         # The name of the volume that is being defined in the "volumes" section.
         name: mypvc
  volumes:
   - name: mypvc
     persistentVolumeClaim:
       # References the PersistentVolumeClaim created earlier.
       claimName: podpvc
       readOnly: false

Windows クラスタに Compute Engine 永続ディスクの CSI ドライバを使用する

次のセクションでは、GKE で CSI ドライバによって管理される Kubernetes Volume を使用する際の一般的なプロセスについて説明します。これらのセクションは、Windows を使用するクラスタを対象としています。

次のことをご確認ください。

  • クラスタ バージョンは 1.19.7-gke.2000、1.20.2-gke.2000 以降である。
  • ノードのバージョンが 1.18.12-gke.1203、1.19.6-gke.800 以降である。

StorageClass の作成

Windows 用の StorageClass は、Linux と非常によく似ています。ファイル システム タイプは異なるため、デフォルトでインストールされた StorageClass は Windows で機能しないことに注意する必要があります。Windows 用の Compute Engine 永続ディスクの CSI ドライバは、ファイル システム タイプとして NTFS を必要とします。

たとえば、次の pd- windows-class.yaml という名前のファイルを使用して StorageClass を作成できます。必ず、パラメータ リストに csi.storage.k8s.io/fstype: NTFS を追加してください。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-sc-windows
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-balanced
  csi.storage.k8s.io/fstype: NTFS

PersistentVolumeClaim を作成する

Windows 用の StorageClass を作成すると、その StorageClass を参照する PersistentVolumeClaim を作成できるようになります。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: podpvc-windows
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: pd-sc-windows
  resources:
    requests:
      storage: 6Gi

ボリュームを消費する Pod を作成する

次の例では、前のタスクで作成したボリュームを使用します。

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  # Node selector to ensure the Pod runs on a Windows node.
  nodeSelector:
    kubernetes.io/os: windows
  containers:
    - name: iis-server
      # The container image to use.
      image: mcr.microsoft.com/windows/servercore/iis
      ports:
      - containerPort: 80
      volumeMounts:
      # The path in the container where the volume will be mounted.
      - mountPath: /var/lib/www/html
        name: mypvc
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        # References the PersistentVolumeClaim created earlier.
        claimName: podpvc-windows
        readOnly: false

VolumeAttributeClass を使用して Hyperdisk の IOPS とスループットを動的に変更する

Compute Engine 永続ディスクの CSI ドライバで VolumeAttributesClass を使用すると、IOPS やスループットなどの永続ディスク属性を動的に変更できます。GKE クラスタのバージョンが 1.34 以降であることを確認してください。

このセクションでは、VolumeAttributesClass を使用してボリュームのパフォーマンスを動的に変更する方法について説明します。2 つの VolumeAttributesClass リソース(silvergold)を作成して、IOPS とスループットの階層を定義します。次に、StorageClasssilver 階層を参照する PersistentVolumeClaim、ボリュームを使用する Pod を作成します。最後に、PersistentVolumeClaim を更新して gold 階層を参照します。これにより、ボリュームのパフォーマンス設定が動的に更新されます。

VolumeAttributesClass を作成してパフォーマンス階層を定義する

このセクションでは、silvergold という名前の階層の例を使用して VolumeAttributesClass リソースを定義します。

  1. 次のマニフェストを vac-classes.yaml として保存します。

    apiVersion: storage.k8s.io/v1
    kind: VolumeAttributesClass
    metadata:
      name: silver
    driverName: pd.csi.storage.gke.io
    parameters:
      iops: "3000"
      throughput: "188Mi"
    ---
    apiVersion: storage.k8s.io/v1
    kind: VolumeAttributesClass
    metadata:
      name: gold
    driverName: pd.csi.storage.gke.io
    parameters:
      iops: "6000"
      throughput: "345Mi"
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f vac-classes.yaml
    

Hyperdisk の StorageClass を作成する

このセクションでは、Hyperdisk ボリュームをプロビジョニングするための StorageClass リソースを定義します。

  1. 次のマニフェストを hyperdisk-sc.yaml として保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hyperdisk-example
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f hyperdisk-sc.yaml
    

初期パフォーマンス階層で PVC を作成する

このセクションでは、PVC を作成し、silver という名前の初期階層を使用します。

  1. 次のマニフェストを vac-silver-pvc.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pv-claim
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: hyperdisk-example
      volumeAttributesClassName: silver
      resources:
        requests:
          storage: 200Gi
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f vac-silver-pvc.yaml
    
  3. 永続ボリュームをプロビジョニングするには、PVC を使用する Pod を作成します。前のセクションで作成した StorageClassvolumeBindingMode: WaitForFirstConsumer を設定します。これにより、Pod が PVC を使用するまでボリュームのプロビジョニングが遅延します。次のマニフェストを test-pod.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pvc-pod
    spec:
      containers:
        - name: nginx-container
          image: nginx:latest
          ports:
            - containerPort: 80
          volumeMounts:
            - name: pvc-storage
              mountPath: /usr/share/nginx/html
      volumes:
        - name: pvc-storage
          persistentVolumeClaim:
            claimName: test-pv-claim
    
  4. 次のようにマニフェストを適用します。

    kubectl apply -f test-pod.yaml
    
  5. ディスクのパフォーマンス設定を確認するには、コンソールでディスクのパフォーマンス設定を確認する Cloud de Confiance をご覧ください。プロビジョニングされる IOPS3000プロビジョニングされるスループット188 になります。

別のパフォーマンス階層を使用するように PVC を更新する

このセクションでは、silver 階層の代わりに gold 階層を使用するように PVC を更新します。

  1. 次のマニフェストを vac-gold-pvc.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pv-claim
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: hyperdisk-example
      volumeAttributesClassName: gold
      resources:
        requests:
          storage: 200Gi
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f vac-gold-pvc.yaml
    
  3. ディスクのパフォーマンス設定が更新されたことを確認するには、コンソールでディスクのパフォーマンス設定を確認する Cloud de Confiance をご覧ください。プロビジョニングされる IOPS6000プロビジョニングされるスループット345 になります。

コンソールでディスクのパフォーマンス設定を確認する Cloud de Confiance

コンソールでディスクの詳細を確認すると、IOPS とスループットの設定が永続ディスクに適用されていることを確認できます。 Cloud de Confiance

  1. ディスク名を取得します。

    PV_NAME=$(kubectl get pvc test-pv-claim -o=jsonpath='{.spec.volumeName}')
    DISK_NAME=$(kubectl get pv $PV_NAME -o=jsonpath='{.spec.csi.volumeHandle}' | sed 's|.*/||')
    echo "Persistent disk name: $DISK_NAME"
    
  2. コンソールで、[**ディスク**] ページに移動します。 Cloud de Confiance

    [ディスク] に移動

  3. 前のステップの出力のディスク名と一致する永続ディスクの名前をクリックします。

  4. [ディスクの詳細] ページの [パフォーマンス] セクションで、[プロビジョニングされる IOPS] と [プロビジョニングされるスループット] を確認します。

詳細については、Hyperdisk にプロビジョニングされたパフォーマンス設定を表示するをご覧ください。

動的変更に関する考慮事項

  • 以前の構成を再適用する: リソースが利用できないなどのエラーにより、PVC をボリューム属性クラスにバインドできない場合は、以前の PVC を安全に再適用できます。
  • 割り当てのサポート: Kubernetes コントロール プレーンは、ResourceQuotascopeSelector を使用して、特定の VolumeAttributesClass を参照する PVC に割り当てを適用できます。

Compute Engine 永続ディスクの CSI ドライバをデフォルト以外のファイルシステム タイプで使用する

GKE の Compute Engine 永続ディスクのデフォルトのファイル システム タイプは ext4 です。ノードのイメージでサポートされていれば、xfs ストレージ タイプを使用することもできます。ノードイメージごとのサポートされているドライバの一覧については、ストレージ ドライバのサポートをご覧ください。

次の例は、Compute Engine 永続ディスクの CSI ドライバで ext4 の代わりに xfs をデフォルトのファイル システムとして使用する方法を示しています。

StorageClass の作成

  1. 次のマニフェストを pd-xfs-class.yaml という名前の YAML ファイルとして保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: xfs-class
    provisioner: pd.csi.storage.gke.io
    parameters:
      # The type of Compute Engine persistent disk to provision.
      type: pd-balanced
      # Specify "xfs" as the filesystem type.
      csi.storage.k8s.io/fstype: xfs
    volumeBindingMode: WaitForFirstConsumer
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f pd-xfs-class.yaml
    

PersistentVolumeClaim を作成する

  1. 次のマニフェストを pd-xfs-pvc.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: xfs-pvc
    spec:
      # References the StorageClass created earlier.
      storageClassName: xfs-class
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          # The amount of storage requested.
          storage: 10Gi
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f pd-xfs-pvc.yaml
    

ボリュームを消費する Pod を作成する

  1. 次のマニフェストを pd-xfs-pod.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pd-xfs-pod
    spec:
      containers:
      - name: cloud-sdk
        image: google/cloud-sdk:slim
        # Keep the container running for 1 hour.
        args: ["sleep","3600"]
        volumeMounts:
        # The path in the container where the volume will be mounted.
        - mountPath: /xfs
          name: xfs-volume
      # Define the volumes available to the containers in the Pod.
      volumes:
      - name: xfs-volume
        persistentVolumeClaim:
          # References the PersistentVolumeClaim created earlier.
          claimName: xfs-pvc
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f pd-xfs-pod.yaml
    

ボリュームが正しくマウントされたことを確認する

  1. Pod でシェル セッションを開きます。

    kubectl exec -it pd-xfs-pod -- /bin/bash
    
  2. xfs パーティションを探します。

    df -aTh --type=xfs
    

    出力例を以下に示します。

    Filesystem     Type  Size  Used Avail Use% Mounted on
    /dev/sdb       xfs    30G   63M   30G   1% /xfs
    

Compute Engine 永続ディスクの CSI ドライバのログを表示する

Cloud Logging を使用して、Compute Engine 永続ディスクの CSI ドライバに関連するイベントを表示できます。ログは問題のトラブルシューティングに役立ちます。

Cloud Logging の詳細については、GKE ログの表示をご覧ください。

Compute Engine 永続ディスクの CSI ドライバのログを表示するには、次の操作を行います。

  1. Cloud de Confiance コンソールの Cloud Logging ページに移動します。

    Cloud Logging に移動

  2. ログエントリをフィルタして、名前空間で実行されている CSI ドライバに関連するエントリのみを表示するには、次の Cloud Logging クエリを実行します。

     resource.type="k8s_container"
     resource.labels.project_id="PROJECT_ID"
     resource.labels.location="LOCATION"
     resource.labels.cluster_name="CLUSTER_NAME"
     resource.labels.namespace_name="kube-system"
     resource.labels.container_name="gce-pd-driver"
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクトの名前。
    • LOCATION: クラスタの Compute Engine のリージョンまたはゾーン。
    • CLUSTER_NAME: クラスタの名前。

既知の問題

サポートされていないマシンタイプ

C3 シリーズのマシン ファミリーを使用している場合、pd-standard 永続ディスクタイプはサポートされません。

マシン上で Pod を実行しようとしたときに、Pod がサポートされていない永続ディスクタイプを使用すると、次のような警告メッセージが Pod に表示されます。

AttachVolume.Attach failed for volume "pvc-d7397693-5097-4a70-9df0-b10204611053" : rpc error: code = Internal desc = unknown Attach error: failed when waiting for zonal op: operation operation-1681408439910-5f93b68c8803d-6606e4ed-b96be2e7 failed (UNSUPPORTED_OPERATION): [pd-standard] features are not compatible for creating instance.

クラスタに、マシン ファミリーが異なる複数のノードプールがある場合は、Node Taintsノード アフィニティを使用して、ワークロードをスケジュールできる場所を制限できます。たとえば、この方法を使用すると、pd-standard を使用するサポートされていないマシン ファミリーでワークロードが実行されないように制限できます。

pd-extreme 永続ディスクタイプを使用する場合は、ディスクが適切なマシンの形の VM インスタンスにアタッチされていることを確認する必要があります。詳細については、マシンの形のサポートをご覧ください。

次のステップ