EFS リソースを使用する

Elastic File System(EFS)は、クラスタにストレージ(ディスク容量)を提供する基盤の AWS メカニズムです。PersistentVolume は、ワークロードが EFS ストレージを使用できるようにするクラスタ リソースです。これにより、ワークロードが接続されていない場合でもストレージを維持できます。このトピックでは、ワークロードが PersistentVolumeClaim を使用して PersistentVolume にアクセスする仕組みについて説明します。

GKE on AWS は、サポートされているすべての Kubernetes バージョンで PersistentVolume の静的プロビジョニングをサポートしています。Kubernetes バージョン 1.24 以降のクラスタの場合、GKE on AWS は動的プロビジョニングもサポートします。動的プロビジョニングを使用するには、クラスタ管理者がそれを構成する必要があります。方法については、PersistentVolume を構成するをご覧ください。

PersistentVolumeClaim を作成する

ワークロードを静的にプロビジョニングされた永続ボリュームに接続するか、動的にプロビジョニングされた永続ボリュームに接続するか応じて適切なタブを選択してください。

静的

以下の手順は、クラスタ管理者が少なくとも 1 つの PersistentVolume をすでにプロビジョニングしていることを前提としています。この PersistentVolume にアクセスし、基盤となる EFS をワークロードで使用するには、PersistentVolumeClaim を作成します。

静的にプロビジョニングされた PersistentVolume 用の PersistentVolumeClaim を作成するには、次の YAML マニフェストを efs-claim.yaml という名前のファイルにコピーします。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "" # Leave as empty string for static provisioning
  resources:
    requests:
      storage: 5Gi

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

  • CLAIM_NAME: バインドする PersistentVolumeClaim に付ける名前(efs-claim1 など)。デフォルトのストレージ クラスにバインドする場合は空白のままにします
  1. YAML をクラスタに適用します。

      kubectl apply -f efs-claim.yaml
    

    この出力で PersistentVolumeClaim の作成を確認します。

    persistentvolumeclaim/CLAIM_NAME created
    

動的

この手順では、クラスタ管理者が動的なプロビジョニング用に少なくとも 1 つの StorageClass をすでにプロビジョニングしていることを前提としています。この StorageClass で動的にプロビジョニングされた PersistentVolume を作成し、ワークロードで基盤となる EFS アクセス ポイントを使用するには、PersistentVolumeClaim を作成します。

PersistentVolumeClaim を作成する手順は次のとおりです。EFS CSI ドライバは、この PersistentVolumeClaim と指定された StorageClass を使用して、PersistentVolume を動的にプロビジョニングします。

  1. 次の YAML マニフェストを efs-claim.yaml という名前のファイルにコピーします。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "EFS_STORAGE_CLASS_NAME"
  resources:
    requests:
      storage: 5Gi

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

  • CLAIM_NAME: PersistentVolumeClaim に付ける名前(efs-claim1 など)。
  • EFS_STORAGE_CLASS_NAME: PersistentVolumeClaim をバインドする StorageClass の名前。デフォルトのストレージ クラスにバインドするには、このフィールドを空白のままにします。
  1. YAML をクラスタに適用します。

      kubectl apply -f efs-claim.yaml
    

    出力で PersistentVolumeClaim の作成を確認します。

    persistentvolumeclaim/CLAIM_NAME created
    

StatefulSet を作成する

作成した PersistentVolumeClaim は、ワークロードで使用できます。このセクションでは、PersistentVolumeClaim を使用するサンプルの StatefulSet を作成します。また、spec.volumes でクレームを参照して、Pod や Deployment などの他のワークロード タイプで PersistentVolumeClaim を使用することもできます。

PersistentVolumeClaim で参照されている EFS リソースをマウントする StatefulSet を作成するには、次の操作を行います。

  1. 次の YAML マニフェストを efs-statefulset.yaml という名前のファイルにコピーします。この例のマニフェストでは、EFS リソースを /efs-data にマウントする Ubuntu Linux コンテナを起動します。コンテナは 5 秒ごとに、out.txt という EFS リソース上のファイルに書き込みを行います。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: efs-shell
    spec:
      selector:
        matchLabels:
          app: test-efs
      serviceName: efs-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-efs
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: linux
            image: ubuntu:bionic
            command: ["/bin/sh"]
            args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"]
            volumeMounts:
            - name: efs-volume
              mountPath: /efs-data
          volumes:
          - name: efs-volume
            persistentVolumeClaim:
              claimName: CLAIM_NAME
    

    CLAIM_NAME は、先ほど指定した PersistentVolumeClaim の名前(efs-claim1 など)に置き換えます。

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

     kubectl apply -f efs-statefulset.yaml
    

    出力で StatefulSet の作成を確認します。

    statefulset.apps/efs-shell created
    

    StatefulSet がコンテナ イメージをダウンロードして起動するまで数分かかる場合があります。

  3. kubectl get pods で、StatefulSet の Pod のステータスが Running であることを確認します。

      kubectl get pods -l app=test-efs
    

    出力には、Pod の名前とそのステータスが含まれます。次のレスポンスで、Pod の名前は efs-shell-0 です。

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Pod が Running 状態になったら、kubectl exec を使用して、StatefulSet をホストする Pod に接続します。

      kubectl exec -it efs-shell-0 -- bash
    

    kubectl コマンドにより、Pod でシェルが起動します。

  5. EFS リソースがマウントされていることを確認するには、tail コマンドを使用して out.txt ファイルの内容を確認します。

    tail /efs-data/out.txt
    

    出力には、UTC でのその時点の時刻が含まれます。

  6. exit コマンドを使用して、Pod から切断します。

      exit
    

    シェルがローカルマシンに戻ります。

クリーンアップ

StatefulSet を削除するには、kubectl delete を使用します。

  kubectl delete -f efs-statefulset.yaml

次のステップ