mariadb-operator icon indicating copy to clipboard operation
mariadb-operator copied to clipboard

🦭 Run and operate MariaDB in a cloud native way

mariadb

CI Release Helm Manifests OLM Helm

Go Report Card Go Reference Slack Artifact Hub Operator Hub

🦭 mariadb-operator

Run and operate MariaDB in a cloud native way. Declaratively manage your MariaDB using Kubernetes CRDs rather than imperative commands.

  • Easily provision MariaDB servers in Kubernetes.
  • Highly configurable MariaDB servers.
  • Multiple HA modes: SemiSync Replication and Galera.
  • Automated primary failover.
  • Automated Galera cluster recovery.
  • Enhanced HA with MaxScale: a sophisticated database proxy, router, and load balancer designed specifically for and by MariaDB.
    • Query-based routing: Transparently route write queries to the primary nodes and read queries to the replica nodes.
    • Connection-based routing: Load balance connections between multiple servers.
    • Automated primary failover based on MariaDB internals.
    • Replay pending transactions when a server goes down.
    • Support for Galera and Replication.
  • Flexible storage configuration. Volume expansion.
  • Take and restore backups.
  • Scheduled backups.
  • Multiple backup storage types: S3 compatible, PVCs and Kubernetes volumes.
  • Backup retention policy.
  • Target recovery time: infer which backup to restore.
  • Bootstrap new instances from: Backups, S3, PVCs ...
  • Prometheus metrics via mysqld-exporter.
  • Manage users, grants and logical databases.
  • Configure connections for your applications.
  • Orchestrate and schedule sql scripts.
  • Validation webhooks to provide CRD immutability.
  • 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.

Please, refer to the documentation, the API reference and the example suite for further detail.

Bare minimum installation

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-operator

Recommended installation

The recommended installation includes the following features:

  • Metrics: Leverage prometheus operator to scrape the mariadb-operator internal metrics.
  • 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.cert.certManager.enabled=true

Openshift

The 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.

Quickstart

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/config

Next, you can proceed with the installation of a MariaDB instance:

kubectl apply -f examples/manifests/mariadb.yaml
kubectl 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   2m17s

Up and running 🚀, we can now create our first logical database and grant access to users:

kubectl apply -f examples/manifests/database.yaml
kubectl apply -f examples/manifests/user.yaml
kubectl apply -f examples/manifests/grant.yaml
kubectl 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
user              True    Created   20         29s

kubectl get grants
NAME              READY   STATUS    DATABASE   TABLE   USERNAME          GRANTOPT   AGE
user              True    Created   *          *       user              true       36s

At this point, we can run our database initialization scripts:

kubectl apply -f examples/manifests/sqljobs
kubectl 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             2m33s

Now that the database has been initialized, let's take a backup:

kubectl apply -f examples/manifests/backup.yaml
kubectl get backups
NAME               COMPLETE   STATUS    MARIADB   AGE
backup             True       Success   mariadb   15m

kubectl get jobs
NAME               COMPLETIONS   DURATION   AGE
backup-27782894    1/1           4s         3m2s

Last but not least, let's provision a second MariaDB instance bootstrapping from the previous backup:

kubectl apply -f examples/manifests/mariadb_from_backup.yaml
kubectl 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         84s

Documentation

  • Index
  • API reference
  • Example suite

GitOps

You can embrace GitOps best practises by using this operator, just place your CRDs in a git repo and reconcile them with your favorite tool, see an example with flux:

  • Run and operate MariaDB in a GitOps fashion using Flux

Roadmap

Take a look at our roadmap and feel free to open an issue to suggest new features.

Adopters

Please create a PR and add your company or project to our ADOPTERS.md file if you are using our project!

Contributing

We welcome and encourage contributions to this project! Please check our contributing and development guides. PRs welcome!

Community

Get in touch