Merge pull request #2553 from ashish-amarnath/csi-blog

📖  Blogpost announcing CSI snapshotting capability
pull/2594/head
Nolan Brubaker 2020-05-29 15:00:03 -04:00 committed by GitHub
commit eaec20f2fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 202 additions and 0 deletions

View File

@ -0,0 +1,202 @@
---
title: "How to use CSI Volume Snapshotting with Velero"
excerpt: In the Velero 1.4 release, we introduced support for CSI snapshotting v1beta1 APIs. This post provides step-by-step instructions on setting up a CSI environment in Azure, installing Velero 1.4 with the velero-plugin-for-csi, and a demo of this feature in action.
author_name: Ashish Amarnath
image: /img/posts/csi-announce-blog.jpg
# Tag should match author to drive author pages
tags: ['Velero Team', 'Ashish Amarnath']
---
In the recent [1.4 release of Velero](https://github.com/vmware-tanzu/velero/releases), we announced a new feature of supporting CSI snapshotting using the [Kubernetes CSI Snapshot Beta APIs](https://kubernetes.io/docs/concepts/storage/volume-snapshots/).
With this capability of CSI volume snapshotting, Velero can now support any volume provider that has a CSI driver with snapshotting capability, without requiring a Velero-specific volume snapshotter plugin to be available.
This post has the necessary instructions for you to start using this feature.
## Getting Started
Using the CSI volume snapshotting features in Velero involves the following steps.
1. Set up a CSI environment with a driver supporting the Kubernetes CSI snapshot beta APIs.
1. Install Velero with CSI snapshotting feature enabled.
1. Deploy `csi-app`: a stateful application that uses CSI backed volumes that we will backup and restore.
1. Use Velero to backup and restore the `csi-app`.
## Set up a CSI environment.
As the [Kubernetes CSI Snapshot Beta API](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) is available starting from Kubernetes `1.17`, you need to run Kubernetes `1.17` or later.
This post uses an AKS cluster running Kubernetes `1.17`, with Azure disk CSI driver as an example.
Following instructions to install the Azure disk CSI driver from [here](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/docs/install-csi-driver-master.md) run the below command
```bash
curl -skSL https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/install-driver.sh | bash -s master snapshot --
```
This script will deploy the following CSI components, CRDs, and necessary RBAC:
- [`deployment.apps/csi-azuredisk-controller`](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/deploy/csi-azuredisk-controller.yaml)
- [`daemonset.apps/csi-azuredisk-node`](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/deploy/csi-azuredisk-node.yaml)
- [`deployment.apps/csi-snapshot-controller`](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/deploy/csi-snapshot-controller.yaml)
## Install Velero with CSI support enabled
The CSI volume snapshot capability is currently, as of Velero 1.4, a beta feature behind the `EnableCSI` feature flag and is not enabled by default.
Following instructions from our [docs website](https://velero.io/docs/csi/), install Velero with the [velero-plugin-for-csi](https://github.com/vmware-tanzu/velero-plugin-for-csi) and using the Azure Blob Store as our BackupStorageLocation. Please refer to our [velero-plugin-for-microsoft-azure documentation](https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure) for instructions on setting up the BackupStorageLocation. Please note that the BackupStorageLocation should be set up before installing Velero.
Install Velero by running the below command
```bash
velero install \
--provider azure \
--plugins velero/velero-plugin-for-microsoft-azure:v1.1.0,velero/velero-plugin-for-csi:v0.1.1 \
--bucket $BLOB_CONTAINER \
--secret-file <PATH_TO_CREDS_FILE>/aks-creds \
--backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID,subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID \
--snapshot-location-config apiTimeout=5m,resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID \
--image velero/velero:v1.4.0 \
--features=EnableCSI
```
## Deploy a stateful application with CSI backed volumes
Before installing the stateful application with CSI backed volumes, install the storage class and the volume snapshot class for the Azure disk CSI driver by applying the below `yaml` to our cluster.
```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: disk.csi.azure.com
provisioner: disk.csi.azure.com
parameters:
skuname: StandardSSD_LRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
---
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
name: csi-azuredisk-vsc
driver: disk.csi.azure.com
deletionPolicy: Retain
parameters:
tags: 'foo=aaa,bar=bbb'
```
NOTE: The above `yaml` was sourced from [StorageClass](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/deploy/example/storageclass-azuredisk-csi.yaml) and [VolumeSnapshotClass](https://github.com/kubernetes-sigs/azuredisk-csi-driver/blob/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml).
Deploy the stateful application that is using CSI backed PVCs, in the `csi-app` namespace by applying the below yaml.
```yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: csi-app
---
kind: Pod
apiVersion: v1
metadata:
namespace: csi-app
name: csi-nginx
spec:
nodeSelector:
kubernetes.io/os: linux
containers:
- image: nginx
name: nginx
command: [ "sleep", "1000000" ]
volumeMounts:
- name: azuredisk01
mountPath: "/mnt/azuredisk"
volumes:
- name: azuredisk01
persistentVolumeClaim:
claimName: pvc-azuredisk
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: csi-app
name: pvc-azuredisk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: disk.csi.azure.com
---
```
For demonstration purposes, instead of relying on the application writing data to the mounted CSI volume, exec into the pod running the stateful application to write data into `/mnt/azuredisk`, where the CSI volume is mounted.
This is to let us get a consistent checksum value of the data and verify that the data on restore is exacly same as that in the backup.
```bash
$ kubectl -n csi-app exec -ti csi-nginx bash
root@csi-nginx:/# while true; do echo -n "FOOBARBAZ " >> /mnt/azuredisk/foobar; done
^C
root@csi-nginx:/# cksum /mnt/azuredisk/foobar
2279846381 1726530 /mnt/azuredisk/foobar
```
## Back Up
Back up the `csi-app` namespace by running the below command
```bash
$ velero backup create csi-b2 --include-namespaces csi-app --wait
Backup request "csi-b2" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
..................
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe csi-b2` and `velero backup logs csi-b2`.
```
## Restore
Before restoring from the backup simulate a disaster by running
```bash
kubectl delete ns csi-app
```
Once the namespace has been deleted, restore the `csi-app` from the backup `csi-b2`.
```bash
$ velero create restore --from-backup csi-b2 --wait
Restore request "csi-b2-20200518085136" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.
....
Restore completed with status: Completed. You may check for more information using the commands `velero restore describe csi-b2-20200518085136` and `velero restore logs csi-b2-20200518085136`.
```
Now that the restore has completed and our `csi-nginx` pod is `Running`, confirm that contents of `/mnt/azuredisk/foobar` have been correctly restored.
```bash
$ kubectl -n csi-app exec -ti csi-nginx bash
root@csi-nginx:/# cksum /mnt/azuredisk/foobar
2279846381 1726530 /mnt/azuredisk/foobar
root@csi-nginx:/#
```
The stateful application that we deployed has been successfully restored with its data intact.
And that's all it takes to backup and restore a stateful application that uses CSI backed volumes!
## Community Engagement
Please try out the CSI support in Velero 1.4. Feature requests, suggestions, bug reports, PRs are all welcome.
Get in touch with us on [Kubernetes Slack #velero](https://kubernetes.slack.com/archives/C6VCGP4MT), [Twitter](https://twitter.com/projectvelero), or [Our weekly community calls](https://velero.io/community/)
## Resources
More details about CSI volume snapshotting and its support in Velero may be found in the following links:
- [Kubernetes 1.17 Feature: Kubernetes Volume Snapshot Moves to Beta](https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-feature-cis-volume-snapshot-beta/) for more information on the CSI beta snapshot APIs.
- Prerequisites to use this feature is available [on our website](https://velero.io/docs/csi).
- [Kubernetes CSI docs](https://kubernetes-csi.github.io/docs/sidecar-containers.html): To understand components in a CSI environment
- [Velero plugin for CSI snapshots](https://github.com/vmware-tanzu/velero-plugin-for-csi) for implementation details of the CSI plugin.

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB