Setting up a MySQL Cluster on Microsoft Azure using the Kubernetes MySQL Operator

We continue our Kubernetes series with a tutorial on how to properly configure the Kubernetes-based MySQL Operator. We’re starting with a tutorial on Microsoft Azure, which is the first part of an extensive step-by-step guide covering various platforms.

In the following lines, you can find simple instructions and examples to help you prepare your cluster environment, install, update and configure all the tools you need and finally create your own cluster.

Firstly, visit the Microsoft Azure Portal.

Select the Cloud Shell button in the upper-right corner of the menu.

If you choose to install and use the CLI locally, this quick start requires that you are already running the Azure CLI version 2.0.4 or later. Run

az --version

to find the version. If you need to install it or upgrade it, go to Install Azure CLI 2.0.

Create a resource group with the

az group create

command. An Azure resource group is a logical group in which Azure resources are deployed and managed.

$ az group create --name myAKSCluster --location eastus
    "id": "/subscriptions/****/resourceGroups/myAKSCluster",
    "location": "eastus",
    "managedBy": null,
    "name": "myAKSCluster",
    "properties": {
        "provisioningState": "Succeeded"
    "tags": null

Create a Kubernetes cluster in Azure Container Service with the

az acs create


$ az aks create --resource-group myAKSCluster --name myAKSCluster --node-count 1 --enable-addons monitoring --generate-ssh-keys
"location": "eastus",
"name": "myAKSCluster",
"nodeResourceGroup": "MC_myAKSCluster_myAKSCluster_eastus",
"provisioningState": "Succeeded",
"resourceGroup": "myAKSCluster",
“type": "Microsoft.ContainerService/ManagedClusters",

If you’re using Azure Cloud Shell, kubectl is already installed. If you want to install it locally, use the

az aks install-cli


$ az aks install-cli

To configure kubectl to connect to your Kubernetes cluster, use the

az aks get-credentials

command. This step downloads credentials and configures the Kubernetes CLI to use them.

$ az aks get-credentials --resource-group myAKSCluster --name myAKSCluster
Merged "myAKSCluster" as current context in /home/user-name/.kube/config

To verify the connection to your cluster, use the

kubectl get

command to return the list of cluster nodes. It can take a few minutes for the nodes to appear.

$ kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-14445398-0   Ready     agent     13m       v1.9.9

Install helm. If you use the Azure Cloud Shell, the Helm CLI is already installed. For additional installation options go to Install Helm.

To deploy this controller, use the provided helm chart by running:

$ kubectl create serviceaccount -n kube-system tiller
serviceaccount "tiller" created
$ kubectl create clusterrolebinding tiller-crule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller "tiller-crule" created
$ helm init --service-account tiller --wait
HELM_HOME has been configured at /home/presslabs/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see:
Happy Helming!
$ helm repo add presslabs
"presslabs" has been added to your repositories
$ helm install presslabs/mysql-operator --name mysql-operator
NAME:   mysql-operator
LAST DEPLOYED: Tue Aug 14 15:50:42 2018
NAMESPACE: default

For more information about chart values see go to README. This chart will deploy the controller along with an orchestrator cluster.

Before creating a cluster, you need a secret that contains the ROOT_PASSWORD key. An example of this secret can be found at examples/example-cluster-secret.yaml. Create a file named example-cluster-secret.yaml and copy into it the following YAML code:

apiVersion: v1
kind: Secret
name: my-secret
type: Opaque
# root password is required to be specified

Now, to create a cluster you need just a simple YAML file that defines it (an example can be found at examples/example-cluster.yaml). Create a file named example-cluster.yaml and copy into it the following YAML code:

kind: MysqlCluster
name: my-cluster
replicas: 2
secretName: my-secret

For a more in-depth configuration, check examples.

Deploying a cluster:

$ kubectl apply -f example-cluster-secret.yaml
secret "my-secret" created
$ kubectl apply -f example-cluster.yaml "my-cluster"  created

To list the deployed clusters, use:

$ kubectl get mysql
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-14445398-0   Ready     agent     13m       v1.9.9

To check cluster state, use:

$ kubectl describe mysql my-cluster
Ready Nodes:             1
Last Transition Time:  2018-08-16T11:28:14Z
Message:               Cluster is not ready.
Reason:                statefulset not ready
Status:                False
Type:                  Ready

To connect to the orchestrator dashboard you have to port forward orchestrator port 3000 to your local machine by using:

$ kubectl port-forward mysql-operator-orchestrator-0 3000
Forwarding from -> 3000
Forwarding from [::1]:3000 -> 3000

Type localhost:3000 in a browser.

We hope our tutorial was useful enough to get your cluster up and running! You can always give us feedback or contribute to our project directly on GitHub.
Keep an eye on our blog, next week we’ll be back with a Kubernetes MySQL Cluster tutorial for Google Kubernetes Engine!

Smart Managed WordPress Hosting

Presslabs provides high-performance hosting and business intelligence for the WordPress sites you care about.

Get Started