GKE on AWS automatically deploys the Container Storage Interface (CSI) Amazon Elastic Block Store (EBS) and Amazon Elastic File Store (EFS).
The EBS CSI Driver and EFS CSI Driver versions are tied to an GKE on AWS Kubernetes version. The driver version is typically the latest available when a GKE version is released. When the cluster is upgraded, the drivers update automatically.
Use the default StorageClass
Creating a PersistentVolumeClaim without the field spec.storageClassName provisions a General Purpose SSD volumes (gp2) volume using the default GKE on AWS EBS CSI Driver StorageClass.
The following YAML creates a PersistentVolumeClaim (PVC) named mypvc with a size of 30 gibibytes.
apiVersion: v1 kind: PersistentVolumeClaim metadata:  name: mypvc spec:  accessModes:  - ReadWriteOnce  resources:  requests:  storage: 30Gi Use a different preinstalled StorageClass
The GKE on AWS EBS CSI Driver also includes the premium-rwo StorageClass, which provisions higher-throughput Provisioned IOPS SSD volumes (io1) volumes.
You can use it by specifying it in the spec.storageClassName of the PVC.
apiVersion: v1 kind: PersistentVolumeClaim metadata:  name: mypvc spec:  accessModes:  - ReadWriteOnce  resources:  requests:  storage: 30Gi  storageClassName: premium-rwo Use a custom StorageClass
If neither the default nor the premium-rwo StorageClass meets your needs, you can create additional StorageClasses for EBS volumes or use Container Storage Interface (CSI) Drivers.
- Choose if you are using an EBS volume or another CSI driver. - EBS Volume- This tab describes how to create your own custom StorageClass that specifies an EBS volume type, file system type, and other parameters. You can find additional StorageClass parameters on the GKE on AWS EBS CSI Driver GitHub page. - To configure a custom StorageClass, copy the following YAML manifest into a file named - my-custom-class.yaml.- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer- Replace - CLASS_NAMEwith the name of your new StorageClass.- For example, the following YAML creates a new StorageClass that provisions Throughput Optimized HDD EBS volumes formatted with the XFS file system. - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-class provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: csi.storage.k8s.io/fsType: xfs type: st1- Custom EFS StorageClass- This tab describes how to create a custom StorageClass for the EFS CSI Driver provisioner. See Use an EFS resource for a list of the prerequisites for this StorageClass. The EFS CSI Driver page lists additional StorageClass parameters beyond those in following manifest. - Copy the following YAML manifest into a file named - my-custom-class.yaml.- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <var>EFS_STORAGE_CLASS_NAME</var> provisioner: efs.csi.aws.com mountOptions: - tls parameters: provisioningMode: efs-ap fileSystemId: EFS_ID directoryPerms: "700"- Replace: - EFS_STORAGE_CLASS_NAME with the name of the StorageClass.
- EFS_ID with your EFS file system ID - for example, fs-12345678a.
 - CSI Driver- You can specify a different CSI driver in the - provisionerfield.- To create a StorageClass with another CSI driver, you can use the example YAML below. - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: CSI_DRIVER_NAME allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: ...- Replace the following: - CSI_DRIVER_NAMEwith the name of the CSI driver—for example,- csi.example.com
- CLASS_NAMEwith the name of the StorageClass—for example,- my-custom-class
 - Configure the sub-fields under - parametersaccording to your CSI driver.
- EFS_STORAGE_CLASS_NAME with the name of the 
- Apply the YAML to your cluster. - kubectl apply -f my-custom-class.yaml
Create a PersistentVolumeClaim with a custom StorageClass
- Once a custom StorageClass is created, you can specify it in a PVC. The example below creates a PVC named - my-pvcthat references the StorageClass- my-custom-class.- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi storageClassName: my-custom-class
Set the default StorageClass
GKE on AWS uses a default StorageClass called standard-rwo that provisions gp2 EBS volumes. You can change the default to another StorageClass.
To change the default StorageClass:
- Update the - is-default-classannotation for the- standard-rwoStorageClass with- kubectl patch.- kubectl patch storageclass standard-rwo -p \ '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
- Create a new StorageClass that has the annotation - storageclass.kubernetes.io/is-default-class: true.- The following example StorageClass uses the - ebs.csi.aws.comdriver. To install another storage driver, see Install additional CSI drivers.- Copy the following YAML into a file named - my-custom-class.yaml.- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME annotations: storageclass.kubernetes.io/is-default-class: true provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: type: EBS_VOLUME_TYPE- Replace the following: - EBS_VOLUME_TYPE: the AWS EBS volume type that the StorageClass creates.
- CLASS_NAMEwith the name of your new StorageClass
 - For example, the following YAML creates a new default StorageClass that provisions General Purpose SSD volumes (gp3). - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-default-class annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: type: gp3
- Apply the new custom class to your cluster. - kubectl apply -f my-custom-class.yaml
After applying this manifest, GKE on AWS uses the my-custom-default-class StorageClass for new storage requests.
Reference the StorageClass in a StatefulSet
To use your new StorageClass, you must reference it in a StatefulSet's volumeClaimTemplates.
When you reference a StorageClass in a StatefulSet's volumeClaimTemplates specification, Kubernetes provides stable storage using PersistentVolumes (PVs). Kubernetes calls the provisioner defined in the StorageClass to create a new storage volume. After the volume is provisioned, Kubernetes automatically creates a PV.
The following StatefulSet references the my-custom-class StorageClass and provisions a 1 gibibyte volume:
apiVersion: apps/v1 kind: StatefulSet metadata:  name: web spec:  selector:  matchLabels:  app: nginx  template:  metadata:  labels:  app: nginx  spec:  containers:  - name: nginx  image: registry.k8s.io/nginx-slim:0.8  volumeMounts:  - name: www  mountPath: /usr/share/nginx/html  volumeClaimTemplates: # This is the specification in which you reference the StorageClass  - metadata:  name: www  spec:  accessModes: [ "ReadWriteOnce" ]  resources:  requests:  storage: 1Gi  storageClassName: my-custom-class # This field references the existing StorageClass What's next
- Learn about Persistent volumes and dynamic provisioning in GKE. 
- Install additional CSI drivers on your GKE on AWS. 
- Deploy your first workload with the Quickstart.