MySQL Operator
MySQL Operator is a bulletproof MySQL on Kubernetes. It manages all the necessary resources for a MySQL CLuster deployment.
The MySQL Operator provides efortless backups, while the cluster being highly-available.
MySQL Operator was developed by the awesome engineering team at Presslabs,
a Managed WordPress Hosting provider.
For more open-source projects, check Presslabs Code.
Goals
The main goals of this operator are:
- Easily deploy mysql clusters in kubernetes (cluster-per-service model)
- Friendly devops (monitoring story solved)
- Out-of-the-box backups (automated and on demand) and point-in-time recovery
- Support for cloning in cluster and across clusters
Controller deploy
To deploy this controller, use the provided helm chart, by running:
helm repo add presslabs https://presslabs.github.io/charts
helm install presslabs/mysql-operator
This chart will deploy the controller and an orchestrator cluster.
Example of a cluster
Before creating a cluster, we need a secret that contains the ROOT_PASSWORD
to
init mysql with (an example for this secret can be found
here). Now, to create a cluster we need
just a simple yaml file that defines it — let's call it
cluster.yaml
and can be as follows:
apiVersion: mysql.presslabs.net/v1alpha1
kind: MysqlCluster
metadata:
name: foo
spec:
replicas: 2
secretName: the-secret
For a more in depth configuration, check examples. To deploy this
cluster, run:
kubectl apply -f cluster.yaml
To list the deployed clusters use:
$ kubectl get mysql
NAME AGE
foo 1m
To check cluster state use:
$ kubectl describe mysql foo
...
Status:
Ready Nodes: 2
Conditions:
Last Transition Time: 2018-03-28T10:20:23Z
Message: Cluster is ready.
Reason: statefulset ready
Status: True
Type: Ready
...
Example of a backup
Making a backup is easy — defining a cluster, you should define a backup;
for a detailed example, check this example. Let's
define a new one on:
apiVersion: mysql.presslabs.net/v1alpha1
kind: MysqlBackup
metadata:
name: foo-backup
spec:
clusterName: foo
To deploy the backup, run:
kubeclt apply -f backup.yaml
To lists all backups, run:
$ kubectl get backup
NAME AGE
foo-backup 1m
To check backup state and details, use:
$ kubectl describe backup foo-backup
...
Status:
Completed: true
Conditions:
Last Transition Time: 2018-03-21T16:02:56Z
Message:
Reason:
Status: True
Type: Complete
Last Transition Time: 2018-03-21T16:02:48Z
Message: First initialization of backup
Reason: set defaults
Status: Unknown
Type: Failed
...
Tech considerations
This project uses Percona Server for MySQL 5.7 because of backup improvements
(eg. backup locks), monitoring improvements and some serviceability improvements
(eg. utility user). The case against MariaDB is that WordPress requires MySQL,
but MariaDB is not a drop-in replacement for it, since MariaDB 10 is a fork,
rather than following MySQL.
License
This project is licensed under Apache 2.0 license. Read the LICENSE file in the
top distribution directory, for the full license text.