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
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
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
の例をご覧ください。