EFS ファイル システムの使用

GKE on AWS バージョン 1.6 以降の Anthos クラスタは、EFS CSI ドライバにより AWS Elastic File System(EFS)をサポートしています。このトピックでは、既存の EFS ファイル システムをユーザー クラスタに PersistentVolume としてマウントする方法について説明します。

始める前に

このトピックの手順を行うには、以下のものが必要です。

  • GKE on AWS と同じ AWS VPC にある既存の EFS ファイル システム
  • GKE on AWS と同じ AWS VPC にある 1 つ以上の EFS マウント ターゲット。
  • すべての EFS マウント ターゲットは、以下に属している必要があります。
    • GKE on AWS 環境のプライベート サブネット。デフォルトでは、GKE on AWS は gke-CLUSTER_ID-private-AWS_ZONE という名前のサブネットを作成します。ここで、CLUSTER_ID はユーザー クラスタ ID、AWS_ZONE は AWS アベイラビリティ ゾーンです。
    • ノードプール セキュリティ グループ。デフォルトでは、GKE on AWS は gke-CLUSTER_ID-nodepool という名前のノードプールを作成します。ここで、CLUSTER_ID はユーザー クラスタ ID です。
  • anthos-aws ディレクトリから anthos-gke を使用して、コンテキストをユーザー クラスタに切り替えます。
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME は、ユーザー クラスタ名に置き換えます。

EFS PersistentVolume の使用

ユーザー クラスタとともに EFS ファイル システムを PersistentVolume として使用するには、PersistentVolume を作成してから、ワークロードで参照する PersistentVolumeClaim を作成します。

PersistentVolume の作成

EFS CSI ドライバで PersistentVolume を作成するには、次の手順を行います。

  1. anthos-aws ディレクトリから anthos-gke を使用して、コンテキストをユーザー クラスタに切り替えます。

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME は、ユーザー クラスタ名に置き換えます。

  2. 使用する PersistentVolume の構成は、Elastic File System に直接接続しているか、アクセス ポイント経由で接続するかによって異なります。Elastic File System に直接接続するか、アクセス ポイント経由で接続するかを選択します。

    直接接続

    次の YAML マニフェストを efs-volume.yaml という名前のファイルにコピーします。このマニフェストは、先ほど作成した EFS ストレージ クラスを参照します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_FILE_SYSTEM_ID
    

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

    • VOLUME_NAME は、永続ボリュームの名前に置き換えます。
    • CLAIM_NAME は、PersistentVolumeClaim に使用する名前に置き換えます。
    • EFS_FILE_SYSTEM_ID は、EFS ファイル システム ID に置き換えます。例: fs-12345678a

    アクセス ポイント

    次の YAML マニフェストを efs-volume.yaml という名前のファイルにコピーします。このマニフェストは、先ほど作成した EFS ストレージ クラスを参照します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_FILE_SYSTEM_ID::ACCESS_POINT_ID
    

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

    • VOLUME_NAME は、永続ボリュームの名前に置き換えます。
    • CLAIM_NAME は、PersistentVolumeClaim に使用する名前に置き換えます。
    • EFS_FILE_SYSTEM_ID は、EFS ファイル システム ID に置き換えます。例: fs-12345678a
    • ACCESS_POINT_ID は、アクセス ポイントの ID に置き換えます。例: fsap-1234567890abcde
  3. YAML をユーザー クラスタに適用します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

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

    persistentvolume/VOLUME_NAME created
    

PersistentVolumeClaim の作成

ワークロードで EFS ファイル システムを使用するには、PersistentVolumeClaim を作成します。

  1. PersistentVolumeClaim を作成するには、次の YAML マニフェストを efs-claim.yaml という名前のファイルにコピーします。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: CLAIM_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 5Gi
    

    CLAIM_NAME を PersistentVolumeClaim の名前に置き換えます。例: efs-claim1

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

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-claim.yaml
    

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

    persistentvolumeclaim/CLAIM_NAME created
    

StatefulSet を作成する

作成した PersistentVolumeClaim は、ワークロードで使用できます。このセクションの手順では、EFS ファイル システムがマウントされている 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 をユーザー クラスタに適用します。

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

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

    statefulset.apps/efs-shell created
    

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

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

    env HTTPS_PROXY=http://localhost:8118 \
      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 に接続します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl exec -it efs-shell-0 -- bash
    

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

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

    tail /efs-data/out.txt
    

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

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

    exit
    

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

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

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f efs-statefulset.yaml
    

クリーンアップ

前のセクションで作成したリソースを削除するには、次のコマンドを実行します。

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-volume.yaml

次のステップ