1 of 39

Kubernetes Storage Intro

sig-apps

July 20, 2016

Saad Ali <saadali@google.com>

Software Engineer

https://github.com/saad-ali

Google Cloud Platform

2 of 39

Files in containers are ephemeral

  • Can’t run stateful applications
  • Container crashes result in loss of data

Can’t share files between containers

Problems

Google Cloud Platform

3 of 39

Kubernetes Volumes

  • Directory, possibly with some data in it
  • Accessible by all containers in pod
  • Lifetime same as the pod or longer
  • Volume Plugins Define
    • How directory is setup
    • Medium that backs it
    • Contents of the directory
  • http://kubernetes.io/docs/user-guide/volumes/

Solution

Google Cloud Platform

4 of 39

Kubernetes has many volume plugins

  • Empty dir (and tmpfs)
  • Host path
  • Git repository
  • GCE Persistent Disk
  • AWS Elastic Block Store
  • Azure File Storage
  • iSCSI
  • Flocker
  • NFS
  • vSphere
  • GlusterFS
  • Ceph File and RBD
  • Cinder
  • FibreChannel
  • Secret, ConfigMap, DownwardAPI
  • Flex (exec a binary)
  • ...

Volumes

Google Cloud Platform

5 of 39

EmptyDir

  • Temporary directory created when pod is created
  • Directory shared between all containers in pod
  • Directory and contents deleted when pod is terminated

EmptyDir Demo

Google Cloud Platform

6 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

EmptyDir Demo

Google Cloud Platform

7 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

EmptyDir Demo

Google Cloud Platform

8 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

EmptyDir Demo

Google Cloud Platform

9 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

EmptyDir Demo

Google Cloud Platform

10 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

EmptyDir Demo

Google Cloud Platform

11 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-nsk7h 2/2 Running 0 55s

EmptyDir Demo

Google Cloud Platform

12 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-nsk7h 2/2 Running 0 55s

$ kubectl exec -ti sleepypod-nsk7h -c sleepycontainer1 -- /bin/sh

/ # ls

bin etc lib64 mnt root sys var

data home linuxrc opt run tmp

dev lib media proc sbin usr

EmptyDir Demo

Google Cloud Platform

13 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-nsk7h 2/2 Running 0 55s

$ kubectl exec -ti sleepypod-nsk7h -c sleepycontainer1 -- /bin/sh

/ # ls

bin etc lib64 mnt root sys var

data home linuxrc opt run tmp

dev lib media proc sbin usr

/ # ls /data/

EmptyDir Demo

Google Cloud Platform

14 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-nsk7h 2/2 Running 0 55s

$ kubectl exec -ti sleepypod-nsk7h -c sleepycontainer1 -- /bin/sh

/ # ls

bin etc lib64 mnt root sys var

data home linuxrc opt run tmp

dev lib media proc sbin usr

/ # ls /data/

/ # echo "hello world" > /data/test.txt

hello world

/ # exit

EmptyDir Demo

Google Cloud Platform

15 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

emptyDir: {}

containers:

- name: sleepycontainer1

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

- name: sleepycontainer2

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

emptydir.yaml

$ kubectl create -f emptydir.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-nsk7h 2/2 Running 0 55s

$ kubectl exec -ti sleepypod-nsk7h -c sleepycontainer1 -- /bin/sh

/ # ls

bin etc lib64 mnt root sys var

data home linuxrc opt run tmp

dev lib media proc sbin usr

/ # ls /data/

/ # echo "hello world" > /data/test.txt

hello world

/ # exit

$ kubectl exec -ti sleepypod-nsk7h -c sleepycontainer2 -- /bin/sh

/ # ls /data/

test.txt

/ # echo /data/test.txt

/data/test.txt

EmptyDir Demo

Google Cloud Platform

16 of 39

Google Compute Engine Persistent Disk

  • Network attached storage
  • Mounted as directory when pod is created
  • Directory shared between all containers in pod
  • Directory unmounted, contents persisted on disk after pod is terminated

GCE PD Demo

Google Cloud Platform

17 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

GCE PD Demo

Google Cloud Platform

18 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

GCE PD Demo

Google Cloud Platform

19 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

GCE PD Demo

Google Cloud Platform

20 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

GCE PD Demo

Google Cloud Platform

21 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

GCE PD Demo

Google Cloud Platform

22 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

GCE PD Demo

Google Cloud Platform

23 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

GCE PD Demo

Google Cloud Platform

24 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

GCE PD Demo

Google Cloud Platform

25 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

$ kubectl delete -f gcepd.yaml

replicationcontroller "sleepypod" deleted

GCE PD Demo

Google Cloud Platform

26 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-8rrk

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

$ kubectl delete -f gcepd.yaml

replicationcontroller "sleepypod" deleted

GCE PD Demo

Google Cloud Platform

27 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-8rrk

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

$ kubectl delete -f gcepd.yaml

replicationcontroller "sleepypod" deleted

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

GCE PD Demo

Google Cloud Platform

28 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-8rrk

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

$ kubectl delete -f gcepd.yaml

replicationcontroller "sleepypod" deleted

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-5kp98 1/1 Running 0 1m

GCE PD Demo

Google Cloud Platform

29 of 39

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

nodeName: e2e-test-saadali-minion-group-8rrk

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

gcepd.yaml

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-v8ggx 1/1 Running 0 33s

$ kubectl exec -ti sleepypod-v8ggx -c sleepycontainer -- /bin/sh

/ # ls /data

/ # echo "Hello world" > /data/test.txt

/ # cat /data/test.txt

Hello world

/ # exit

$ kubectl delete -f gcepd.yaml

replicationcontroller "sleepypod" deleted

$ kubectl create -f gcepd.yaml

replicationcontroller "sleepypod" created

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

sleepypod-5kp98 1/1 Running 0 1m

$ kubectl exec -ti sleepypod-5kp98 -c sleepycontainer -- /bin/sh

/ # ls /data/

test.txt

/ # cat /data/test.txt

Hello world

/ # exit

GCE PD Demo

Google Cloud Platform

30 of 39

  • Abstracts details of how storage is provided from how it is consumed
  • PersistentVolume (PV) API Object
    • Piece of networked storage in the cluster
    • Not used directly in pod
    • Lifecycle independent of any individual pod
  • PersistentVolumeClaim (PVC) API Object
    • Request for storage by a user
    • Claims request specific size and access modes of storage
    • Pods reference claims

PV/PVC

Google Cloud Platform

31 of 39

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV1

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 10Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk

---

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV2

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 100Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk2

pv.yaml

PV/PVC

Google Cloud Platform

32 of 39

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV1

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 10Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk

---

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV2

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 100Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk2

pv.yaml

PV/PVC

Google Cloud Platform

33 of 39

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV1

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 10Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk

---

apiVersion: v1

kind: PersistentVolume

metadata:

name : myPV2

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 100Gi

persistentVolumeReclaimPolicy: Retain

gcePersistentDisk:

fsType: ext4

pdName: panda-disk2

pv.yaml

$ kubectl create -f pv.yaml

persistentvolume "pv1" created

persistentvolume "pv2" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 1m

pv2 100Gi RWO Available 1m

PV/PVC

Google Cloud Platform

34 of 39

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mypvc

namespace: testns

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 100Gi

pvc.yaml

$ kubectl create -f pv.yaml

persistentvolume "pv1" created

persistentvolume "pv2" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 1m

pv2 100Gi RWO Available 1m

PV/PVC

Google Cloud Platform

35 of 39

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mypvc

namespace: testns

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 100Gi

pvc.yaml

$ kubectl create -f pv.yaml

persistentvolume "pv1" created

persistentvolume "pv2" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 1m

pv2 100Gi RWO Available 1m

PV/PVC

Google Cloud Platform

36 of 39

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mypvc

namespace: testns

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 100Gi

pvc.yaml

$ kubectl create -f pv.yaml

persistentvolume "pv1" created

persistentvolume "pv2" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 1m

pv2 100Gi RWO Available 1m

$ kubectl create -f pvc.yaml

persistentvolumeclaim "mypvc" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 3m

pv2 100Gi RWO Bound testns/mypvc 3m

PV/PVC

Google Cloud Platform

37 of 39

$ kubectl create -f pv.yaml

persistentvolume "pv1" created

persistentvolume "pv2" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 1m

pv2 100Gi RWO Available 1m

$ kubectl create -f pvc.yaml

persistentvolumeclaim "mypvc" created

$ kubectl get pv

NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE

pv1 10Gi RWO Available 3m

pv2 100Gi RWO Bound testns/mypvc 3m

apiVersion: v1

kind: ReplicationController

metadata:

name: sleepypod

spec:

replicas: 1

selector:

name: sleepy

template:

metadata:

labels:

name: sleepy

Spec:

volumes:

- name: data

gcePersistentDisk:

pdName: panda-disk

fsType: ext4

volumes:

- name: data

persistentVolumeClaim:

claimName: mypvc

nodeName: e2e-test-saadali-minion-group-6d45

containers:

- name: sleepycontainer

image: gcr.io/google_containers/busybox

command:

- sleep

- "6000"

volumeMounts:

- name: data

mountPath: /data

readOnly: false

pod.yaml

PV/PVC

Google Cloud Platform

38 of 39

  • Dynamic Provisioning (Alpha)
    • Automatic creation of volumes on-demand
    • Alpha in Kubernetes v1.2
      • Triggered by an annotation on PVC object
        • “volume.alpha.kubernetes.io/storage-class”
    • Anticipated Kubernetes v1.4
    • Example: https://github.com/kubernetes/kubernetes/tree/master/examples/experimental/persistent-volume-provisioning
  • Pet Sets (Alpha)
    • Group of pods with a stronger notion of identity.
    • Enable “clustered applications”
    • http://kubernetes.io/docs/user-guide/petset/

New and Coming Soon

Google Cloud Platform

39 of 39

Saad Ali <saadali@google.com>

Software Engineer

https://github.com/saad-ali

Q&A

Google Cloud Platform