mysql-operator
mysql-operator copied to clipboard
Kubernetes Custom Resource for MySQL
MySQL Operator
Kubernetes Custom Resource for MySQL.
Running MySQL Operator
In order for the custom resources to be properly processed and an actual MySQL cluster
deployed, a running instance of the MySQL Operator is required inside your Kubernetes
infrastructure. The operator listens for changes on MySQLCluster
and MySQLBackupSchedule
custom resources and creates the appropriate objects.
As a Kubernetes pod
This is the recommended option. MySQL Operator will run as a pod inside your Kubernetes cluster.
kubectl run mysql-operator --image=grtl/mysql-operator:latest
As an out-of-cluster binary
Another option (suitable for development rather than a production-ready solution) is to run the MySQL Operator binary outside of the Kubernetes cluster.
go get -u github.com/grtl/mysql-operator
mysql-operator -kubeconfig ~/.kube/config
Run code directly (ex. after making changes)
git clone https://github.com/grtl/mysql-operator && cd $_
go run -kubeconfig ~/.kube/config
MySQL Operator Docker image
Download from DockerHub
Download MySQL Operator image from DockerHub to easily deploy it in your Kubernetes cluster.
docker pull grtl/mysql-operator
Build yourself
Or build it yourself
GOOS=linux GOARCH=amd64 go build -o mysql-operator && docker build .
Usage
Make sure the operator is up and running before creating any custom resources. All resources may be created with standard Kubernetes yaml files.
Clusters
Creating a cluster
First, a Kubernetes Secret containing the database password needs to be created.
kubectl create secret generic my-secret --from-literal=password="P4sSw0rD"
Then you can create a cluster from a yaml file.
kubectl create -f cluster-config.yaml
Example cluster-config.yaml
(minimal)
apiVersion: cr.mysqloperator.grtl.github.com/v1
kind: MySQLCluster
metadata:
name: "my-cluster"
spec:
secret: "my-secret"
Example cluster-config.yaml
(fully customized)
apiVersion: cr.mysqloperator.grtl.github.com/v1
kind: MySQLCluster
metadata:
name: "my-cluster"
spec:
secret: "my-secret" # Name of the secret containing the password
port: 3306 # Port on which the service will expose the MySQL
replicas: 2 # Number of replicas
storage: "1Gi" # Persistance Volume Claim size for each replica
image: "mysql:latest" # MySQL image
Restoring a cluster from the backup
While creating a cluster its data may be restored from an existing
backup instance. The only difference between the
configuration files for creating a cluster and
the one to restore a cluster from backup is an additional field
fromBackup
field pointing to the backup instance.
kubectl create -f cluster-restore-config.yaml
Example cluster-restore-config.yaml
(minimal)
apiVersion: cr.mysqloperator.grtl.github.com/v1
kind: MySQLCluster
metadata:
name: "my-cluster"
spec:
secret: "my-secret"
fromBackup: "my-backup-2017-12-14-01-22"
Example cluster-restore-config.yaml
(fully customized)
apiVersion: cr.mysqloperator.grtl.github.com/v1
kind: MySQLCluster
metadata:
name: "my-cluster"
spec:
secret: "my-secret"
fromBackup: "my-backup-2017-12-14-01-22"
port: 3306
replicas: 2
storage: "1Gi"
image: "mysql:latest"
Deleting a cluster
Simply delete the cluster custom resource
kubectl delete mc "my-cluster"
Backup Schedules
Creating a backup schedule
You can create a backup schedule, which will automatically create backups according to the schedule (cron job style).
kubectl create -f backup-config.yaml
Example backup-config.yaml
apiVersion: cr.mysqlbackup.grtl.github.com/v1
kind: MySQLBackup
metadata:
name: "my-backup"
spec:
cluster: "my-cluster"
time: "*/5 * * * *" # Create a backup every 5 minutes
Deleting a backup schedule
Simply delete the backup schedule custom resource
kubectl delete mbs "my-backup"
Backup Instances
A backup schedule will create backup instances according to the schedule.
Getting backup instances
Get all backup instances
kubectl get mbi
Get all backup instances created within a given backup schedule
kubectl get mbi -l schedule="my-backup"
Get all backup instances created for a given cluster
kubectl get mbi -l cluster="my-cluster"
Standard kubectl
output for backup instances lacks important fields, for
a valuable output we recommend using output flag with the following configuration.
kubectl get mbi -o custom-columns="NAME:metadata.name,STATUS:status.phase,\
SCHEDULE:spec.schedule,CLUSTER:spec.cluster,CREATED:metadata.creationTimestamp"
Example output:
NAME STATUS SCHEDULE CLUSTER CREATED
my-backup-instance Completed my-backup my-cluster 2018-04-27T14:42:33Z
Deleting a backup instance
Simply delete the backup instance custom resource
kubectl delete mbi "my-backup-instance"
Be aware that removing a backup instance will delete its contents from the Persistent Volume.