This repository provides a Container Storage Interface (CSI) plugin for Apache CloudStack.
-
Minimal Kubernetes version: v1.17
-
The Kubernetes cluster must run in CloudStack. Tested only in a KVM zone.
-
A disk offering with custom size must be available, with type "shared".
-
In order to match the Kubernetes node and the CloudStack instance, they should both have the same name. If not, it is also possible to use cloud-init instance metadata to get the instance name: if the node has cloud-init enabled, metadata will be available in
/run/cloud-init/instance-data.json
; you should then make sure that/run/cloud-init/
is mounted from the node. -
Kubernetes nodes must be in the Root domain, and be created by the CloudStack account whose credentials are used in configuration.
Create the CloudStack configuration file cloud-config
.
It should have the following format, defined for the CloudStack Kubernetes Provider:
[Global]
api-url = <CloudStack API URL>
api-key = <CloudStack API Key>
secret-key = <CloudStack API Secret>
ssl-no-verify = <Disable SSL certificate validation: true or false (optional)>
project-id = <project ID>
Create a secret named cloudstack-secret
in namespace kube-system
:
kubectl create secret generic \
--namespace kube-system \
--from-file ./cloud-config \
cloudstack-secret
Set the correct hypervisor in the DaemonSet Env Vars:
- name: NODE_HYPERVISOR
value: vmware
You can manually set the maximal attachable number of block volumes per node:
- name: NODE_MAX_BLOCK_VOLUMES
value: "15" #Default value is 10 volumes per node
If you have also deployed the CloudStack Kubernetes Provider, you may use the same secret for both tools.
kubectl apply -f https://github.com/apalia/cloudstack-csi-driver/releases/latest/download/manifest.yaml
A storage class can be created manually: see example.
The provisioner
value must be csi.cloudstack.apache.org
.
The volumeBindingMode
must be WaitForFirstConsumer
, in order to delay the
binding and provisioning of a PersistentVolume until a Pod using the
PersistentVolumeClaim is created. It enables the provisioning of volumes
in respect to topology constraints (e.g. volume in the right zone).
The storage class must also have a parameter named
csi.cloudstack.apache.org/disk-offering-id
whose value is the CloudStack disk
offering ID.
The tool cloudstack-csi-sc-syncer
may also be used to synchronize CloudStack
disk offerings to Kubernetes storage classes.
Example:
kubectl apply -f ./examples/k8s/pvc.yaml
kubectl apply -f ./examples/k8s/pod.yaml
- Patch PV
reclaimPolicy
withkubectl patch pv my-pv-name -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
- Delete Old Pod and PVC
- Patch PV
claimRef
withkubectl patch pv my-pv-name -p '{"spec":{"claimRef": null}}'
- Create new Pod and PVC with existing claimName
.spec.claimRef.name = my-pv-name
To build the driver binary:
make build-cloudstack-csi-driver
To build the container images:
make container
- CloudStack Kubernetes Provider - Kubernetes Cloud Controller Manager for Apache CloudStack
- CloudStack documentation on storage
- CSI (Container Storage Interface) specification
Copyright 2021 Apalia SAS
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.