Cinder Volumes
Cinder Volumes
This tutorial explains how to mount cinder volumes in containers in Magnum.
For all examples we'll use a previously created volume on OpenStack:
$ openstack volume create --size 2 myvolume
$ openstack volume show myvolume | grep '| id'
| id | 242de616-95a0-4bd7-9bfa-166022509788 |
We'll require the ID of the volume later.
Additional documentation is available in the upstream Magnum guide.
Docker Swarm
We rely on a docker volume driver called rexray for integration in Docker Swarm.
Simply pass rexray as volume driver and the ID of the volume.
$ docker run -it --volume-driver rexray -v 242de616-95a0-4bd7-9bfa-166022509788:/mydata
Kubernetes
Below is an example of a kubernetes application definition.
You can either refer to an existing cinder volume (via its ID):
$ cat nginx-cinder.yaml
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
hostPort: 8081
protocol: TCP
volumeMounts:
- name: myvolume
mountPath: "/usr/share/nginx/html"
volumes:
- name: myvolume
cinder:
# Enter the volume ID below
volumeID: 242de616-95a0-4bd7-9bfa-166022509788
fsType: ext4
$ kubectl create -f nginx-cinder.yaml
Or alternatively, rely on dynamic volume provisioning by defining a volume claim.
You can defined multiple StorageClass objects mapping Cinder volume types, as defined here.
In this example we define two StorageClass objects (standard and io1), and create a volume claim for a standard volume of 1GB.
$ cat nginx-cinder.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: standard
provisioner: kubernetes.io/cinder
parameters:
type: standard
---
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: io1
provisioner: kubernetes.io/cinder
parameters:
type: io1
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
annotations:
volume.beta.kubernetes.io/storage-class: standard
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi # pass here the size of the volume
---
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
hostPort: 8081
protocol: TCP
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
$ kubectl create -f nginx-cinder.yaml
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
myclaim Bound pvc-e93fc7ad-1ae2-11e7-a49c-02163e018bf2 1Gi RWO 4s
$ kubectl get pv
NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE
pvc-e93fc7ad-1ae2-11e7-a49c-02163e018bf2 1Gi RWO Bound default/myclaim 7m
In this case a new cinder volume will be created and attached to the web pod.
Full documentation on storage classes, persistent volume and claims is available here.