Run and operate MariaDB in a cloud native way. Declaratively manage your MariaDB using Kubernetes CRDs rather than imperative commands.
- Provisioning highly configurable MariaDB servers.
- Multiple HA modes supported: SemiSync Replication and Galera. Automatic primary failover.
- Take and restore backups. Scheduled backups. Backup rotation
- PVCs and Kubernetes volumes (i.e. NFS) backup storage
- Bootstrap new instances from backups and volumes (i.e NFS)
- Manage users, grants and logical databases
- Configure connections for your applications
- Orchestrate and schedule sql scripts
- Prometheus metrics
- Validation webhooks to provide CRD inmutability
- Additional printer columns to report the current CRD status
- CRDs designed according to the Kubernetes API conventions
- GitOps friendly
- Multi-arch distroless based image
- Install it using kubectl, helm or OLM
This installation flavour provides the minimum resources required to run mariadb-operator in your cluster.
helm repo add mariadb-operator https://mariadb-operator.github.io/mariadb-operator
helm install mariadb-operator mariadb-operator/mariadb-operatorThe recommended installation includes the following features to provide a better user experience and reliability:
- Metrics: Leverage prometheus operator to scrape metrics from both the
mariadb-operatorand the provisionedMariaDBinstances. - Webhook certificate renewal: Automatic webhook certificate issuance and renewal using cert-manager. By default, a static self-signed certificate is generated.
helm repo add mariadb-operator https://mariadb-operator.github.io/mariadb-operator
helm install mariadb-operator mariadb-operator/mariadb-operator \
--set metrics.enabled=true --set webhook.certificate.certManager=trueThe Openshift installation is managed separately in the mariadb-operator-helm repository, which contains a helm based operator that allows you to install mariadb-operator via OLM.
Let's see mariadb-operator🦭 in action! First of all, install the following configuration manifests that will be referenced by the CRDs further:
kubectl apply -f examples/manifests/configNext, you can proceed with the installation of a MariaDB instance:
kubectl apply -f examples/manifests/mariadb_v1alpha1_mariadb.yamlkubectl get mariadbs
NAME READY STATUS PRIMARY POD AGE
mariadb True Running mariadb-0 3m57s
kubectl get statefulsets
NAME READY AGE
mariadb 1/1 2m12s
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mariadb ClusterIP 10.96.235.145 <none> 3306/TCP,9104/TCP 2m17sUp and running 🚀, we can now create our first logical database and grant access to users:
kubectl apply -f examples/manifests/mariadb_v1alpha1_database.yaml
kubectl apply -f examples/manifests/mariadb_v1alpha1_user.yaml
kubectl apply -f examples/manifests/mariadb_v1alpha1_grant.yamlkubectl get databases
NAME READY STATUS CHARSET COLLATE AGE
data-test True Created utf8 utf8_general_ci 22s
kubectl get users
NAME READY STATUS MAXCONNS AGE
mariadb-metrics True Created 3 19m
user True Created 20 29s
kubectl get grants
NAME READY STATUS DATABASE TABLE USERNAME GRANTOPT AGE
mariadb-metrics True Created * * mariadb-metrics false 19m
user True Created * * user true 36sAt this point, we can run our database initialization scripts:
kubectl apply -f examples/manifests/sqljobskubectl get sqljobs
NAME COMPLETE STATUS MARIADB AGE
01-users True Success mariadb 2m47s
02-repos True Success mariadb 2m47s
03-stars True Success mariadb 2m47s
kubectl get jobs
NAME COMPLETIONS DURATION AGE
01-users 1/1 10s 3m23s
02-repos 1/1 11s 3m13s
03-stars-28067562 1/1 10s 106s
kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
03-stars */1 * * * * False 0 57s 2m33sNow that the database has been initialized, let's take a backup:
kubectl apply -f examples/manifests/mariadb_v1alpha1_backup_scheduled.yamlAfter one minute, the backup should have completed:
kubectl get backups
NAME COMPLETE STATUS MARIADB AGE
backup-scheduled True Success mariadb 15m
kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
backup-scheduled */1 * * * * False 0 56s 15m
kubectl get jobs
NAME COMPLETIONS DURATION AGE
backup-scheduled-27782894 1/1 4s 3m2sLast but not least, let's provision a second MariaDB instance bootstrapping from the previous backup:
kubectl apply -f examples/manifests/mariadb_v1alpha1_mariadb_from_backup.yamlkubectl get mariadbs
NAME READY STATUS PRIMARY POD AGE
mariadb True Running mariadb-0 7m47s
mariadb-from-backup True Running mariadb-from-backup-0 53s
kubectl get restores
NAME COMPLETE STATUS MARIADB AGE
bootstrap-restore-mariadb-from-backup True Success mariadb-from-backup 72s
kubectl get jobs
NAME COMPLETIONS DURATION AGE
backup 1/1 9s 12m
bootstrap-restore-mariadb-from-backup 1/1 5s 84sYou can take a look at the whole suite of example CRDs available in examples/manifests.
This operator supports the following High Availability modes:
- Single master HA via SemiSync Replication: The primary node allows both reads and writes, while secondary nodes only allow reads.
- Multi master HA via Galera: All nodes support reads and writes, but it is recommended to perform writes in a single primary for preventing deadlocks.
In order to address nodes, mariadb-operator provides you with the following Kubernetes Services:
<mariadb-name>: To be used for read requests. It will point to all nodes.<mariadb-name>-primary: To be used for write requests. It will point to a single node, the primary.<mariadb-name>-secondary: To be used for read requests. It will point to all nodes, except the primary.
Whenever the primary changes, either by the user or by the operator, both the <mariadb-name>-primary and <mariadb-name>-secondary Services will be automatically updated by the operator to address the right nodes.
The primary may be manually changed by the user at any point by updating the spec.[replication|galera].primary.podIndex field. Alternatively, automatic primary failover can be enabled by setting spec.[replication|galera].primary.automaticFailover, which will make the operator to switch primary whenever the primary Pod goes down.
You can configure mariadb-operator's CRDs in your git repo and reconcile them using your favorite GitOps tool, see an example with flux:
Take a look at our roadmap and feel free to open an issue to suggest new features.
We welcome and encourage contributions to this project! Please check our contributing and development guides. PRs welcome!
- Run and operate MariaDB in Kubernetes with mariadb-operator - MariaDB Foundation
