Contents

Kubernetes Persistent Volumes

Persistent Volume

pv-definition.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-vol1
spec:
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: 1Gi
  awsElasticBlockStrage:
    volumeID: <volume-id>
    fsType: ext4

Access Modes

Access ModeCLIDescription
ReadWriteOnceRWOThe volume can be mounted as read-write by a single node
ReadOnlyManyROXThe volume can be mounted read-only by many nodes
ReadWriteManyRWXThe volume can be mounted as read-write by many nodes

Reclaim Policy

Reclaim PolicyDescription
RetainManual reclamation
RecycleBasic scrub(rm -rf /thevolume/*)
DeleteAssociated storage asset such as AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder volume is deleted

Commands

1
kubectl create -f pv-definition.yaml
1
2
kubectl get persistentvolume
kubectl get pv

Persistent Volume Claim

Binding Rule

RuleDescription
Sufficient CapacityPV Capacity
Access ModesReadOnlyMany / ReadWriteOnce / ReadWriteMany
Volume ModesFilesystem / Block
Storage ClassClass
SelectormatchLabels

pvc-definition.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

Commands

Create a PVC

1
kubectl create -f pvc-definition.yaml

PVC List

1
2
kubectl get persistentvolumeclaim
kubectl get pvc

Delete PVC

1
kubectl delete persistentvolumeclaim myclaim

PVC Mount to POD

Mount
This is a same way for ReplicaSet, Deployment in template section.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
        - mountPath: "/var/www/html"
          name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim

Storage Class

Static Provisioning

1
2
3
4
gcloud beta compute disks create \
  --size 1GB
  --region us-east1
  pd-disk
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-vol1
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 500Mi
  gcePersistentDisk:
    pdName: pd-disk
    fsType: ext4

Dynamic Provisioning

Storage Class

Storage Class
Check official Storage Class

sc-definition.yaml

1
2
3
4
5
6
7
8
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: google-storage
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none
ProvisionerParameterValues
kubernetes.io/gce-pdtypepd-standard / pd-ssd
kubernetes.io/gce-pdreplication-typenone / regional_pd

Storage Class to PVC

pvc-definition.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: PersistentVolumClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: google-storage
  resources:
    requests:
      storage: 500Mi

PVC to POD

pod-definition.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
  name: random-number-generator
spec:
  containers:
    - name: alpine
      image: alpine
      command: [ "/bin/sh", "-c" ]
      args: [ "shuf -i 0-100 -n 1 >> /opt/number.out;" ]
      volumeMounts:
        - mountPath: /opt
          name: data-volume
  volumes:
    - name: data-volume
      persistentVolumeClaim:
        claimName: myclaim

Storage Class Leveling

Silver Storage Class

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: silver
provisioner: kubernetes.io/gce-pd
  type: pd-standard
  replication-type: none

Gold Storage Class

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gold
provisioner: kubernetes.io/gce-pd
  type: pd-ssd
  replication-type: none

Platinum Storage Class

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: platinum
provisioner: kubernetes.io/gce-pd
  type: pd-ssd
  replication-type: regional-pd

Storage Class Commands

1
2
kubectl get storageclass
kubectl get sc