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
など)。デフォルトのストレージ クラスにバインドする場合は空白のままにします
YAML をクラスタに適用します。
kubectl apply -f efs-claim.yaml
この出力で PersistentVolumeClaim の作成を確認します。
persistentvolumeclaim/CLAIM_NAME created
動的
この手順では、クラスタ管理者が動的なプロビジョニング用に少なくとも 1 つの StorageClass をすでにプロビジョニングしていることを前提としています。この StorageClass で動的にプロビジョニングされた PersistentVolume を作成し、ワークロードで基盤となる EFS アクセス ポイントを使用するには、PersistentVolumeClaim を作成します。
PersistentVolumeClaim を作成する手順は次のとおりです。EFS CSI ドライバは、この PersistentVolumeClaim と指定された StorageClass を使用して、PersistentVolume を動的にプロビジョニングします。
- 次の 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 の名前。デフォルトのストレージ クラスにバインドするには、このフィールドを空白のままにします。
YAML をクラスタに適用します。
kubectl apply -f efs-claim.yaml
出力で PersistentVolumeClaim の作成を確認します。
persistentvolumeclaim/CLAIM_NAME created
StatefulSet を作成する
作成した PersistentVolumeClaim は、ワークロードで使用できます。このセクションでは、PersistentVolumeClaim を使用するサンプルの 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
など)に置き換えます。YAML をクラスタに適用します。
kubectl apply -f efs-statefulset.yaml
出力で StatefulSet の作成を確認します。
statefulset.apps/efs-shell created
StatefulSet がコンテナ イメージをダウンロードして起動するまで数分かかる場合があります。
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
Pod が Running 状態になったら、
kubectl exec
を使用して、StatefulSet をホストする Pod に接続します。kubectl exec -it efs-shell-0 -- bash
kubectl
コマンドにより、Pod でシェルが起動します。EFS リソースがマウントされていることを確認するには、
tail
コマンドを使用してout.txt
ファイルの内容を確認します。tail /efs-data/out.txt
出力には、UTC でのその時点の時刻が含まれます。
exit
コマンドを使用して、Pod から切断します。exit
シェルがローカルマシンに戻ります。
クリーンアップ
StatefulSet を削除するには、kubectl delete
を使用します。
kubectl delete -f efs-statefulset.yaml
次のステップ
- EFS リソースの構成方法を確認する。
- ワークロードで StorageClass を使用する方法を学習する