The Elastic File System (EFS) is the underlying AWS mechanism for providing storage (disk space) to your cluster. A PersistentVolume is a cluster resource that makes EFS storage available to your workloads and ensures that it persists even when no workloads are connected to it. This topic describes how a workload can access a PersistentVolume with a PersistentVolumeClaim.
This page is for Operators and Storage specialists who want to configure and manage storage. To learn more about common roles and example tasks that we reference in Google Cloud content, see Common GKE user roles and tasks.
GKE on AWS supports static provisioning of PersistentVolumes for all
supported Kubernetes versions. For clusters at Kubernetes version 1.24 or
later, GKE on AWS also supports dynamic provisioning. To use dynamic
provisioning, your cluster administrator must configure it. To learn how, see
configure a PersistentVolume.
Create a PersistentVolumeClaim
Choose the appropriate tab below depending on whether you want your workload to connect to a statically or dynamically-provisioned persistent volume.
Static
These instructions assume that your cluster administrator has already provisioned at least one PersistentVolume. To access this PersistentVolume and use its underlying EFS with your workloads, create a PersistentVolumeClaim.
To create a PersistentVolumeClaim for a statically-provisioned PersistentVolume,
copy the following YAML manifest into a file named 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
Replace:
- CLAIM_NAME: a name you choose for your PersistentVolumeClaim
to bind to - for example,
efs-claim1. Leave blank to bind to the default storage class
Apply the YAML to your cluster.
kubectl apply -f efs-claim.yamlThis output confirms the PersistentVolumeClaim's creation.
persistentvolumeclaim/CLAIM_NAME created
Dynamic
These instructions assume that your cluster administrator has already provisioned at least one StorageClass for dynamic provisioning. To create a dynamically-provisioned PersistentVolume with this StorageClass and use the underlying EFS access point with your workloads, create a PersistentVolumeClaim.
To create a PersistentVolumeClaim, follow these steps. The EFS CSI driver uses this PersistentVolumeClaim with the indicated StorageClass to dynamically provision a PersistentVolume.
- Copy the following YAML manifest into a file named
efs-claim.yaml.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: CLAIM_NAME
spec:
accessModes:
- ReadWriteMany
storageClassName: "EFS_STORAGE_CLASS_NAME"
resources:
requests:
storage: 5Gi
Replace:
- CLAIM_NAME: a name you choose for your PersistentVolumeClaim -
for example,
efs-claim1 - EFS_STORAGE_CLASS_NAME: the name of the StorageClass you want your PersistentVolumeClaim to bind to. Leave this field blank to bind to the default storage class
Apply the YAML to your cluster.
kubectl apply -f efs-claim.yamlThe output confirms the PersistentVolumeClaim's creation.
persistentvolumeclaim/CLAIM_NAME created
Create a StatefulSet
After you have created a PersistentVolumeClaim, you can use it in a workload.
This section creates a sample StatefulSet that uses a PersistentVolumeClaim.
You can also use a PersistentVolumeClaim with other workload types
such as Pods and Deployments by referencing the claim in spec.volumes.
To create a StatefulSet that mounts the EFS resource referenced in your PersistentVolumeClaim, perform the following steps.
Copy the following YAML manifest into a file named
efs-statefulset.yaml. This example manifest launches an Ubuntu Linux container that mounts your EFS resource at/efs-data. The container writes every five seconds to a file on your EFS resource namedout.txt.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_NAMEReplace CLAIM_NAME with the name of the PersistentVolumeClaim you specified previously - for example,
efs-claim1.Apply the YAML to your cluster.
kubectl apply -f efs-statefulset.yamlThe output confirms the StatefulSet's creation.
statefulset.apps/efs-shell createdThe StatefulSet might take several minutes to download and launch the container image.
Confirm the StatefulSet's Pod is in
Runningstatus withkubectl get pods.kubectl get pods -l app=test-efsThe output includes the name of the Pod and its status. In the following response, the Pod's name is
efs-shell-0.NAME READY STATUS RESTARTS AGE efs-shell-0 1/1 Running 0 1mAfter the Pod is in Running status, use
kubectl execto connect to the Pod hosting the StatefulSet.kubectl exec -it efs-shell-0 -- bashThe
kubectlcommand launches a shell on the Pod.To confirm that your EFS resource is mounted, check the contents of the
out.txtfile with thetailcommand.tail /efs-data/out.txtThe output contains recent times in UTC.
Disconnect from the Pod with the
exitcommand.exitYour shell returns to your local machine.
Clean up
To remove the StatefulSet, use kubectl delete.
kubectl delete -f efs-statefulset.yaml
What's next
- Learn how to configure an EFS resource
- Learn how to use StorageClasses with your workloads