/gke-local-ssd-array

Combine local SSDs into single volume

Primary LanguageShell

GKE Local SSD Array

Combine local SSDs into single volume

This little DaemonSet helps to combine multiple local SSDs into a single logical volume on Google Kubernetes Engine (GKE).

Deployment

# Create config map with actual startup script
$ kubectl create configmap ssd-startup-script --from-file ssd-startup-script.sh -n kube-system
# Deploy DaemonSet
$ kubectl apply -f ssd-startup-daemon.yaml

The DaemonSet will only run on nodes with local SSDs provisioned, this is achieved by using the cloud.google.com/gke-local-ssd: "true" nodeSelector.

Usage

The newly created volume will be available under the /mnt/disks/ssd-array path by default and can be consumed either using hostPath volumes [1], or local Persistent Volumes provisioned either manually or using the local volume static provisioner [2].

Deploy local volume static provisioner

You can follow GKE documentation to deploy local volume static provisioner [3]. Contrary to the documentation stating creating the local-scsi StorageClass is optional, this step seems to be necessary.

TL;DR:

# This is necessary to allow creation of ClusterRoles
$ kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole cluster-admin \
  --user ${YOUR_GCP_USER_ACCOUNT}
# Deploy the local volume provisioner
$ kubectl apply -f "https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/local-volume/provisioner/deployment/kubernetes/gce/provisioner_generated_gce_ssd_count.yaml" 
# Create StorageClass - seems to be necessary
$ kubectl apply -f storage-class.yaml

Consumption

The provisioned Persisten Volumes can be then consumed by creating PersistentVolumeClaim, with corresponding storageClassName, and pod with volumes referencing this PVC [4].