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 です。
 
- GKE on AWS 環境のプライベート サブネット。デフォルトでは、GKE on AWS は 
- anthos-awsディレクトリから- anthos-gkeを使用して、コンテキストをユーザー クラスタに切り替えます。- cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME 
EFS PersistentVolume の使用
ユーザー クラスタとともに EFS ファイル システムを PersistentVolume として使用するには、PersistentVolume を作成してから、ワークロードで参照する PersistentVolumeClaim を作成します。
PersistentVolume の作成
EFS CSI ドライバで PersistentVolume を作成するには、次の手順を行います。
- anthos-awsディレクトリから- anthos-gkeを使用して、コンテキストをユーザー クラスタに切り替えます。- cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME 
- 使用する 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
 
- YAML をユーザー クラスタに適用します。 - env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f efs-volume.yaml- 出力で、PersistentVolume の作成を確認します。 - persistentvolume/VOLUME_NAME created
PersistentVolumeClaim の作成
ワークロードで EFS ファイル システムを使用するには、PersistentVolumeClaim を作成します。
- 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
- 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 を作成するには、次の手順を行います。
- 次の 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
 
- CLAIM_NAME は、前に指定した PersistentVolumeClaim の名前に置き換えます。例: 
- YAML をユーザー クラスタに適用します。 - env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f efs-statefulset.yaml- 出力で StatefulSet の作成を確認します。 - statefulset.apps/efs-shell created- StatefulSet がコンテナ イメージをダウンロードして起動するまでに数分かかる場合があります。 
- 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
- Pod が Running 状態になったら、 - kubectl execを使用して、StatefulSet をホストする Pod に接続します。- env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it efs-shell-0 -- bash- kubectlコマンドにより、Pod でシェルが起動します。
- EFS ファイル システムがマウントされていることを確認するには、 - out.txtファイルの内容を- tailコマンドで確認します。- tail /efs-data/out.txt- 出力には、UTC でのその時点の時刻が含まれます。 
- exitコマンドを使用して、Pod から切断します。- exit- シェルがローカルマシンに戻ります。 
- 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
次のステップ
- EFS ボリュームのその他の使用方法については、aws-efs-csi-driverの例をご覧ください。