ワークロードで StorageClass を使用する

GKE on AWS は、Container Storage Interface(CSI)の Amazon Elastic Block Store(EBS)Amazon Elastic File Store(EFS)を自動的にデプロイします。

EBS CSI ドライバと EFS CSI ドライバのバージョンは、GKE on AWS Kubernetes バージョンに関連付けられています。ドライバは通常、GKE がリリースされた時点で入手可能な最新バージョンになります。クラスタがアップグレードされると、ドライバも自動的に更新されます。

デフォルトの StorageClass を使用する

PersistentVolumeClaim を、spec.storageClassName フィールドなしで作成すると、デフォルトの GKE on AWS EBS CSI ドライバの StorageClass を使用して、汎用 SSD ボリューム(gp2)のボリュームがプロビジョニングされます。

次の YAML は、mypvc という PersistentVolumeClaim(PVC)を 30 GiB のサイズで作成します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

プリインストールされている別の StorageClass を使用する

GKE on AWS EBS CSI ドライバには、高スループットのプロビジョニング済み IOPS SSD ボリューム(io1)のボリュームをプロビジョニングする premium-rwo StorageClass も含まれています。

PVC の spec.storageClassName で指定すると使用できます。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

カスタム StorageClass を使用する

デフォルトと premium-rwo StorageClass のどちらもニーズを満たしていない場合は、EBS ボリューム用の追加の StorageClass を作成するか、Container Storage Interface(CSI)ドライバを使用できます。

  1. EBS ボリュームまたは別の CSI ドライバを使用するかどうかを選択します。

    EBS ボリューム

    このタブでは、EBS ボリューム タイプ、ファイル システム タイプ、その他のパラメータを指定する独自のカスタム StorageClass を作成する方法について説明します。GKE on AWS EBS CSI ドライバの GitHub ページで、追加の StorageClass パラメータを確認できます。

    カスタム StorageClass を構成するには、次の YAML マニフェストを my-custom-class.yaml という名前のファイルにコピーします。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    CLASS_NAME を新しい StorageClass の名前に置き換えます。

    たとえば、次の YAML では、XFS ファイル システムでフォーマットされたスループット最適化 HDD EBS ボリュームをプロビジョニングする、新しい StorageClass が作成されます。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    カスタム EFS StorageClass

    このタブでは、EFS CSI ドライバ プロビジョナー用のカスタム StorageClass を作成する方法について説明します。この StorageClass の前提条件のリストについては、EFS リソースを使用するをご覧ください。EFS CSI ドライバのページには、次のマニフェストに含まれていない StorageClass パラメータが記載されています。

    次の YAML マニフェストを my-custom-class.yaml という名前のファイルにコピーします。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

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

    • EFS_STORAGE_CLASS_NAME は、StorageClass の名前に置き換えます。
    • EFS_ID は、EFS ファイル システム ID に置き換えます(例: fs-12345678a)。

    CSI ドライバ

    provisioner フィールドに別の CSI ドライバを指定できます。

    別の CSI ドライバを使用して StorageClass を作成するには、以下の YAML の例を使用します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

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

    • CSI_DRIVER_NAME は、CSI ドライバの名前に置き換えます(例: csi.example.com)。
    • CLASS_NAME は、StorageClass の名前に置き換えます(例: my-custom-class)。

    CSI ドライバに応じて parameters でサブフィールドを構成します。

  2. YAML をクラスタに適用します。

    kubectl apply -f my-custom-class.yaml
    

カスタム StorageClass を使用して PersistentVolumeClaim を作成する

  1. カスタム StorageClass を作成したら、それを PVC で指定できます。次の例では、StorageClass my-custom-class を参照する my-pvc という名前の PVC を作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageClassName: my-custom-class
    

デフォルトの StorageClass を設定する

GKE on AWS は、gp2 EBS ボリュームをプロビジョニングする standard-rwo というデフォルトの StorageClass を使用します。デフォルトを別の StorageClass に変更できます。

デフォルトの StorageClass を変更するには:

  1. standard-rwo StorageClass の is-default-class アノテーションを kubectl patch で更新します。

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. アノテーション storageclass.kubernetes.io/is-default-class: true を持つ新しい StorageClass を作成します。

    次の例の StorageClass は、ebs.csi.aws.com ドライバを使用しています。別のストレージ ドライバをインストールするには、追加の CSI ドライバをインストールするをご覧ください。

    次の YAML を my-custom-class.yaml というファイルにコピーします。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

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

    • EBS_VOLUME_TYPE: StorageClass が作成する AWS EBS ボリューム タイプ
    • CLASS_NAME は、新しい StorageClass の名前に置き換えます。

    たとえば、次の YAML では、汎用 SSD ボリューム(gp3)をプロビジョニングする新しいデフォルトの StorageClass が作成されます。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: gp3
    
  3. 新しいカスタムクラスをクラスタに適用します。

    kubectl apply -f my-custom-class.yaml
    

このマニフェストを適用すると、GKE on AWS は新しいストレージ リクエストに my-custom-default-class StorageClass を使用します。

StatefulSet で StorageClass を参照する

新しい StorageClass を使用するには、StatefulSet の volumeClaimTemplates で参照する必要があります。

StatefulSet の volumeClaimTemplates 仕様で StorageClass を参照すると、Kubernetes は PersistentVolume(PV)を使用して安定したストレージを提供します。Kubernetes は、StorageClass で定義されたプロビジョナーを呼び出して新しいストレージ Volume を作成します。Volume がプロビジョニングされると、Kubernetes が自動的に PV を作成します。

次の StatefulSet は、my-custom-class StorageClass を参照し、1 GiB のボリュームをプロビジョニングします。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  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: my-custom-class # This field references the existing StorageClass

次のステップ