A Kubernetes Operator for scheduled backup of Git repositories.
- You create a
Repositoryresource. - The Operator creates a
CronJobresource from it. - The
CronJobdoes the actual work.
apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Repository
metadata:
name: repo1
spec:
src: https://github.com/ebiiim/gitbackup
dst: https://gitlab.com/ebiiim/gitbackup
schedule: "0 6 * * *"
gitCredentials:
name: repo1-secret # specify a Secret resource in the same namespaceSupported Kubernetes versions: 1.21 or higher
Make sure you have cert-manager deployed, as it is used to generate webhook certificates.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml
⚠️ You may have to wait a second for cert-manager to be ready.
Deploy the Operator with the following command. It creates gitbackup-system namespace and deploys CRDs, controllers and other resources.
kubectl apply -f https://github.com/ebiiim/gitbackup/releases/download/v0.2.1/gitbackup.yamlFirst, create a Secret resource that contains .git-credentials.
kubectl create secret generic repo1-secret --from-file=$HOME/.git-credentialsNext, create a Repository resource.
apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Repository
metadata:
name: repo1
spec:
src: https://github.com/ebiiim/gitbackup
dst: https://gitlab.com/ebiiim/gitbackup
schedule: "0 6 * * *"
gitCredentials:
name: repo1-secretFinally, confirm that resources has been created.
$ kubectl get repos
NAME AGE
repo1 5s
$ kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
gitbackup-repo1 0 6 * * * False 0 <none> 5s
💡 You can test the
CronJobby manually triggering it.kubectl create job --from=cronjob/<name> <job-name>
First, create a Secret resource that contains .git-credentials.
kubectl create secret generic coll1-secret --from-file=$HOME/.git-credentialsNext, create a Collection resource.
apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Collection
metadata:
name: coll1
spec:
schedule: "0 6 * * *"
gitCredentials:
name: coll1-secret
repos:
- name: gitbackup
src: https://github.com/ebiiim/gitbackup
dst: https://gitlab.com/ebiiim/gitbackup
- name: foo
src: https://example.com/src/foo
dst: https://example.com/dst/foo
- name: bar
src: https://example.com/src/bar
dst: https://example.com/dst/barFinally, confirm that resources has been created.
$ kubectl get colls
NAME AGE
coll1 5s
$ kubectl get repos
NAME AGE
coll1-bar 5s
coll1-foo 5s
coll1-gitbackup 5s
$ kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
gitbackup-coll1-bar 2 6 * * * False 0 <none> 5s
gitbackup-coll1-foo 1 6 * * * False 0 <none> 5s
gitbackup-coll1-gitbackup 0 6 * * * False 0 <none> 5s
💡 Each job runs one minute apart.
Delete the Operator and resources with the following command.
kubectl delete -f https://github.com/ebiiim/gitbackup/releases/download/v0.2.1/gitbackup.yamlThis Operator uses Kubebuilder (v3.8.0), so we basically follow the Kubebuilder way. See the Kubebuilder Documentation for details.
Make sure you have the following tools installed:
- Git
- Make
- Go
- Docker
Run a development cluster with kind
./hack/dev-kind-reset-cluster.sh # create a K8s cluster `kind-gitbackup`
./hack/dev-kind-deploy.sh # build and deploy the Operator