forked from DevFW-CICD/stacks
127 lines
4.9 KiB
Markdown
127 lines
4.9 KiB
Markdown
|
# Local Backup with Velero and Minio
|
||
|
|
||
|
This is example is adapted from the original icpbuilder stack.
|
||
|
|
||
|
The two significant changes from the original were made:
|
||
|
|
||
|
* disabled `hostPath` mount to persist backups within kind, since backups do not work sufficiently in this example due to PVC issues, see below.
|
||
|
* renamed `minio` namespace to `minio-backup` so it does not collide with other minio examples.
|
||
|
|
||
|
Within kind, it can only backup kubernetes objects. Data from PVC's is skipped, see below why.
|
||
|
|
||
|
[Velero](https://velero.io/) requires some compatible storage providers as its backup target. This local installation uses [MinIO](https://min.io/) as an example.
|
||
|
However, MinIO is not officially supported by Velero but works due to S3 compatibility.
|
||
|
|
||
|
The current setup does NOT persist backups but stores them in MinIO's PVCs. Proper backups should configure external storage, see [Supported Providers](https://velero.io/docs/main/supported-providers/).
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
The stack is installed as part of the `./example.sh` run.
|
||
|
|
||
|
In order to persist a local backup you have to mount a local directory within `main.go`:
|
||
|
|
||
|
```yaml
|
||
|
nodes:
|
||
|
- role: control-plane
|
||
|
extraMounts:
|
||
|
- hostPath: /some/path/backup # replace with your own path
|
||
|
containerPath: /backup
|
||
|
```
|
||
|
|
||
|
Kind creates the directory on the host but you might have to adjust the permissions, otherwise the minio pod fails to start.
|
||
|
|
||
|
## Using it
|
||
|
|
||
|
After the installation velero and minio should be visible in ArgoCD.
|
||
|
|
||
|
During the installation credentials for minio are generated and shared with velero. You can access them manually:
|
||
|
|
||
|
```bash
|
||
|
kubectl -n minio-backup get secret root-creds -o go-template='{{ range $key, $value := .data }}{{ printf "%s: %s\n" $key ($value | base64decode) }}{{ end }}'
|
||
|
# example output
|
||
|
# rootPassword: aKKZzLnyry6OYZts17vMTf32H5ghFL4WYgu6bHujm
|
||
|
# rootUser: ge8019yksArb7BICt3MLY9
|
||
|
```
|
||
|
|
||
|
A bucket in minio was created and velero uses it for its backups by default, see helm `values.yaml` files.
|
||
|
|
||
|
|
||
|
### Backup and Restore
|
||
|
|
||
|
Backups and subsequent restores can be scheduled by either using the velero cli or by creating CRD objects.
|
||
|
|
||
|
Check the `./demo` directory for equivalent CRD manifests.
|
||
|
|
||
|
Create a backup of the backstage namespace, see `schedule` task for more permanent setups:
|
||
|
|
||
|
```shell
|
||
|
velero backup create backstage-backup --include-namespaces backstage
|
||
|
```
|
||
|
|
||
|
There are more options to create a fine granular backup and to set the backup storage.
|
||
|
See velero's docs for details.
|
||
|
|
||
|
Check the backup with:
|
||
|
```shell
|
||
|
velero backup get
|
||
|
```
|
||
|
|
||
|
To get more details on the backup you need to be able to connect to velero's backup storage, i.e. minio.
|
||
|
Using `kubefwd` here helps a lot (this is not necessary for restore).
|
||
|
|
||
|
```shell
|
||
|
kubefwd services -n minio-backup
|
||
|
```
|
||
|
|
||
|
More details with `describe` and `logs`:
|
||
|
|
||
|
```shell
|
||
|
velero backup describe backstage-backup --details
|
||
|
velero backup logs backstage-backup
|
||
|
```
|
||
|
|
||
|
Restore the backup into the original namespace, you might want to delete the existing namespace beforehand:
|
||
|
|
||
|
```shell
|
||
|
kubectl delete namespace backstage
|
||
|
velero restore create --from-backup backstage-backup
|
||
|
```
|
||
|
|
||
|
When restoring, velero does not replace existing objects in the backup target.
|
||
|
|
||
|
ArgoCD does pickup on the changes and also validates that the backup is in sync.
|
||
|
|
||
|
|
||
|
## Issues with Persistent Volumes
|
||
|
|
||
|
Velero has no issue to backup kubernetes objects like Deployments, ConfigMaps, etc. since they are just yaml/json definitions.
|
||
|
Volumes containing data are, however, more complex. The preferred type of backup are kubernetes' VolumeSnapshots as they consistently store the state
|
||
|
of a volume at a given point in time in an atomic action. Those snapshots live within the cluster and are subsequently downloaded into one of velero's
|
||
|
storage backends for safekeeping.
|
||
|
|
||
|
However, VolumeSnapshots are only possible on storage backends that support them via CSI drivers.
|
||
|
Backends like `nfs` or `hostPath` do NOT support them. Here, velero uses an alternative method
|
||
|
called [File System Backups](https://velero.io/docs/main/file-system-backup/).
|
||
|
In essence, this a simple copy operation based on the file system. Even though
|
||
|
this uses more sophisticated tooling under the hood, i.e. kopia, it is not
|
||
|
possible to create a backup in an atomic transaction. Thus, the resulting backup
|
||
|
might be inconsistent.
|
||
|
|
||
|
Furthermore, for file system backups to work velero installs a node-agent as a
|
||
|
DaemonSet on each Kubernetes node. The agent is aware of the node's internal
|
||
|
storage and accesses the directories on the host directly to copy the files.
|
||
|
This is not supported for hostPath volumes as they mount an arbitrary path
|
||
|
on the host. In theory, a backup is possible but due extra config and security
|
||
|
considerations intentionally skipped. Kind's local-path provider storage uses
|
||
|
a hostPath and is thus not supported for any kind of backup.
|
||
|
|
||
|
## TODOs
|
||
|
|
||
|
* The MinIO -backup installation is only intended as an example and must either
|
||
|
be configured properly or replaced.
|
||
|
|
||
|
* The current example does not automatically schedule backups.
|
||
|
|
||
|
* velero chart must be properly parameterized
|
||
|
|