MySQL NDB Operator
The MySQL NDB Operator is a Kubernetes operator for managing a MySQL NDB Cluster setup inside a Kubernetes Cluster.
This is in preview state – DO NOT USE FOR PRODUCTION.
Copyright (c) 2021, Oracle and/or its affiliates.
License information can be found in the LICENSE file. This distribution may include materials developed by third parties. For license and attribution notices for these materials, please refer to the LICENSE file.
NDB Operator requires at least a version of 1.19.0 Kubernetes Cluster to run. Any lower version is not supported.
Install using helm
Ndb operator comes with a helm chart that can install the NdbCluster CRD, deploy the operator and the webhook server in the K8s cluster.
Install the NDB Operator and other related resources in the
ndb-operator namespace using :
helm install ndb-operator deploy/charts/ndb-operator \ --namespace=ndb-operator --create-namespace
More information on using the helm chart is available at deploy/charts/ndb-operator/README.md
Install using regular manifest
Create custom resource definitions, the roles and deploy the ndb operator using the single YAML file at deploy/manifests/ndb-operator.yaml. It creates all the resources, and deploys the NDB Operator in the
kubectl apply -f deploy/manifests/ndb-operator.yaml
To directly use the file without cloning this entire repository, run :
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-ndb-operator/main/deploy/manifests/ndb-operator.yaml
To run the operator in a different namespace, the manifest file has to be updated before applying it to the K8s Server.
Once installed, either using helm or using the yaml file, the ndb-operator and a webhook server will be running in the K8s server. To verify it, run the following in the namespace they were installed :
kubectl get pods -n ndb-operator -l 'app in (ndb-operator,ndb-operator-webhook-server)'
Output will be similar to :
NAME READY STATUS RESTARTS AGE ndb-operator-555b7b65-7fmv8 1/1 Running 0 13s ndb-operator-webhook-server-d67c97d54-zdhhp 1/1 Running 0 13s
ndb-operator-555b7b65-7fmv8 runs the NDB Operator and the other pod
ndb-operator-webhook-server-d67c97d54-zdhhp runs a server that acts as a validator for any changes made to a NdbCluster resource. Once both these pods are ready, we can start deploying MySQL Clusters.
Deploy MySQL NDB Cluster in K8s Cluster
The NDB Operator relies on a Custom Resource Definition called NdbCluster to receive the configuration of a MySQL Cluster that needs to be run inside the K8s Cluster. When a user creates, modifies or deletes a K8s object of kind NdbCluster, NDB Operator receives that change event and makes changes to the MySQL Cluster running in K8s Cluster based on that change. The docs/examples folder in this repository has a few examples that can be used to start a MySQL Cluster in the K8s Cluster. The documentation of the NdbCluster CRD is available at docs/NdbCluster-CRD.md.
The docs/examples/example-ndb.yaml defines a simple MySQL Cluster with 2 data nodes and 2 MySQL Servers. To create this resource in the default namespace of the K8s Cluster, run :
kubectl apply -f docs/examples/example-ndb.yaml
Once the NdbCluster resource has been created, all pods started by the NDB Operator can be listed using :
kubectl get pods -l mysql.oracle.com/v1alpha1=example-ndb
example-ndb is the actual name of the resource defined in docs/examples/example-ndb.yaml.
The output will be something similar to
NAME READY STATUS RESTARTS AGE example-ndb-mgmd-0 1/1 Running 0 3m53s example-ndb-mgmd-1 1/1 Running 0 2m5s example-ndb-mysqld-599bcfbd45-b4vld 1/1 Running 0 78s example-ndb-mysqld-599bcfbd45-bgnpz 1/1 Running 0 78s example-ndb-ndbd-0 1/1 Running 0 3m53s example-ndb-ndbd-1 1/1 Running 0 3m53s
Note that the MySQL pods might take some time to appear in the list as they are started only after all the Management and Data nodes are ready.
The MySQL Cluster is ready for transactions once all these pods are ready.
Connect to the MySQL Cluster
The NDB Operator creates a few Services to give access to the MySQL Cluster nodes running inside the K8s Cluster.
kubectl get services -l mysql.oracle.com/v1alpha1=example-ndb
The above command will generate an output similar to :
<div class="highlight highlight-source-shell position-relative" data-snippet-clipboard-copy-content="NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-ndb-mgmd ClusterIP None 1186/TCP 5m
example-ndb-mgmd-ext LoadBalancer 10.100.164.172 1186:30390/TCP 5m
example-ndb-mysqld-ext LoadBalancer 10.109.197.3 3306:32451/TCP 5m
example-ndb-ndbd ClusterIP None 1186/TCP 5m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-ndb-mgmd ClusterIP None <none> 1186/TCP 5m example-ndb-mgmd-ext LoadBalancer 10.100.164.172 <pending> 1186:30390/TCP 5m example-ndb-mysqld-ext LoadBalancer 10.109.197.3 <pending> 3306:32451/TCP 5m example-ndb-ndbd ClusterIP None <none> 1186/TCP 5m