6.8 KiB
Using Container Volume Integration Feature
For Magnum user, we use Container Volume Integration in Kubernetes, Swarm and Mesos. This document details instructions how to use the container volume integration in Kubernetes, Swarm and Mesos.
Using container volume integration in Kubernetes
Create the baymodel.
The new attribute volume-driver for a baymodel specifies the volume backend driver to use when deploying a bay. The volume-driver value needs to be specified as 'cinder' for kubernetes:
magnum baymodel-create --name k8sbaymodel \ --image-id fedora-21-atomic-5 \ --keypair-id testkey \ --external-network-id public \ --dns-nameserver 8.8.8.8 \ --flavor-id m1.small \ --docker-volume-size 5 \ --network-driver flannel \ --coe kubernetes \ --volume-driver cinder
Create the bay:
magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1
To enable the container volume integration in kubernetes, log into each minion node of your bay and perform the following step 3, step 4, step 5 and step 6:
Configure kubelet:
sudo vi /etc/kubernetes/kubelet
Comment out the line:
#KUBELET_ARGS=--config=/etc/kubernetes/manifests --cadvisor-port=4194
Uncomment the line:
#KUBELET_ARGS="--config=/etc/kubernetes/manifests --cadvisor-port=4194 --cloud-provider=openstack --cloud-config=/etc/kubernetes/cloud_config"
NOTE: This is a temporary workaround, and Magnum team is working on a long term solution to automate this step.
Enter OpenStack user credential:
sudo vi /etc/kubernetes/cloud_config
The username, tenant-name and region entries have been filled in with the Keystone values of the user who created the bay. Enter the password of this user on the entry for password:
password=ChangeMe
Restart Kubernetes services:
sudo systemctl restart kubelet
Run the docker container:
sudo docker run -v /usr/local/bin:/target jpetazzo/nsenter
Kubernetes container volume integration has configured by the above steps, And you can use the kubernetes container volume now. The following steps is an example for container volume integration with kubernetes bay..
Create the cinder volume:
cinder create --display-name=test-repo 1 ID=$(cinder create --display-name=test-repo 1 | awk -F'|' '$2~/^[[:space:]]*id/ {print $3}')
The command will generate the volume with a ID. The volume ID will be specified in Step 2.
Create a container in this bay.
The following example illustrates how to mount an cinder volume for a pod.
Create a file (e.g nginx-cinder.yaml) describing a pod:
cat > nginx-cinder.yaml << END
apiVersion: v1
kind: Pod
metadata:
name: aws-web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
hostPort: 8081
protocol: TCP
volumeMounts:
- name: html-volume
mountPath: "/usr/share/nginx/html"
volumes:
- name: html-volume
cinder:
# Enter the volume ID below
volumeID: $ID
fsType: ext4
END
NOTE: The cinder volume ID needs to be configured into the yaml file so that an existing Cinder volume can be mounted in a pod by specifying the volume ID in the pod manifest as follows:
volumes:
- name: html-volume
cinder:
volumeID: $ID
fsType: ext4
Create a pod with container:
magnum pod-create --manifest ./nginx-cinder.yaml --bay k8sbay
You can log in the container to check if existing the mountPath, and check if your cinder volume status is 'in-use' by running the command 'cinder list'.
Using container volume integration in Swarm
To be filled in
Using container volume integration in Mesos
Create the baymodel.
One of the new attributes volume-driver for a baymodel specifies the volume backend driver to use when deploying a bay. The volume-driver value needs to be specified as rexray for Mesos. The other new attributes rexray_preempt for a baymodel is an optional parameter here which enables any host to take control of a volume irrespective of whether other hosts are using the volume. If this is set to false then mostly plugins ensure safety first for locking the volume:
magnum baymodel-create --name mesosbaymodel \ --image-id ubuntu-mesos \ --keypair-id testkey \ --external-network-id public \ --dns-nameserver 8.8.8.8 \ --master-flavor-id m1.magnum \ --docker-volume-size 4 \ --tls-disabled \ --flavor-id m1.magnum \ --coe mesos \ --volume-driver rexray \ --labels rexray-preempt=true
Create the mesos bay:
magnum bay-create --name mesosbay --baymodel mesosbaymodel --node-count 1
Create the cinder volume and a container in this bay:
cinder create --display-name=redisdata 1
Create the following mesos.json file:
cat > mesos.json << END { "id": "redis", "container": { "docker": { "image": "redis", "network": "BRIDGE", "portMappings": [ { "containerPort": 80, "hostPort": 0, "protocol": "tcp"} ], "parameters": [ { "key": "volume-driver", "value": "rexray" }, { "key": "volume", "value": "redisdata:/data" } ] } }, "cpus": 0.2, "mem": 32.0, "instances": 1 } END
NOTE: When the mesos bay is created using this baymodel, the mesos bay will be configured so that an existing cinder volume can be mounted in a container by configuring the parameters to mount the cinder volume in the json file:
"parameters": [
{ "key": "volume-driver", "value": "rexray" },
{ "key": "volume", "value": "redisdata:/data" }
]
Using the REST API of Marathon:
MASTER_IP=$(magnum bay-show mesosbay | awk '/ api_address /{print $4}') curl -X POST -H "Content-Type: application/json" \ http://${MASTER_IP}:8080/v2/apps -d@mesos.json
You can log in the container to check if existing the mountPath, and check if your cinder volume status is 'in-use' by running the command 'cinder list'.