Deploy product module

The MySQL K8s product Terraform module is the set of recommended charms to be deployed using Terraform, only containing Data-Platform owned charms by default. It could be extended with the addition of TLS and COS (Canonical Observability Stack) charms to build more complex setups.

Install Terraform tooling

This guide assumes Juju is installed, and you have a K8s controller already bootstrapped. For more information, check the Charmed MySQL tutorial.

Let’s install Terraform Provider and example modules:

sudo snap install terraform --classic

Switch to the K8s provider and create a new model:

juju switch microk8s
juju add-model my-model

Clone the MySQL operator repository and navigate to the terraform module:

git clone https://github.com/canonical/mysql-k8s-bundle.git
cd terraform

Initialise the Juju Terraform Provider:

terraform init

Verify the deployment

Open the main.tf file to see the brief contents of the Terraform module, and run terraform plan to get a preview of the changes that will be made:

terraform plan -var 'model=my-model'

Apply the deployment

Default charms

The default MySQL product module deploys MySQL Server, MySQL Router and S3 Integrator charms. In order to deploy those resources:

terraform apply -auto-approve \
    -var 'model=my-model'

Extended charms

The extended MySQL product module deploys self-signed-certificates and grafana-agent-k8s charms on top. In order to deploy all resources:

terraform apply -auto-approve \
    -var 'model=my-model' \
    -var 'tls_offer=certificates' \
    -var 'cos_offers={"dashboard"="grafana-dashboards-consumer","metrics"="metrics-endpoint"}'

It is possible to substitute both of these charms by overwriting some of the module variables.

For instance, the self-signed-certificates charm is used to provide the TLS certificates, but it is not a production-ready charm. It must be changed before deploying on a real environment. As an alternative, the manual-tls-certificates could be used.

terraform apply -auto-approve \
    -var 'model=my-model' \
    -var 'tls_offer=certificates' \
    -var 'certificates={"app_name"="manual-tls-certificates","base"="[email protected]","channel"="latest/stable"}'

Configure the deployment

The S3 Integrator charm needs to be configured for it to work properly. Wait until it reaches blocked status and run:

juju run s3-integrator/leader sync-s3-credentials \
    access-key=<access-key> \
    secret-key=<secret-key>

Check deployment status

Check the deployment status with

juju status --model k8s:my-model --watch 1s

Sample output:

Model     Controller      Cloud/Region         Version  SLA          Timestamp
my-model  k8s-controller  microk8s/localhost   3.5.3    unsupported  12:49:34Z

App               Version          Status  Scale  Charm              Channel        Rev  Address         Exposed  Message                                
mysql-k8s         8.0.41-0ubun...  active      3  mysql-k8s          8.0/stable     255  10.152.183.112  no
mysql-router-k8s                   blocked     1  mysql-router-k8s   8.0/stable     748  10.152.183.140  no       Missing relation: database
s3-integrator                      active      1  s3-integrator      1/stable       241  10.152.183.160  no

Unit                 Workload  Agent  Address         Ports           Message
mysql-k8s/0*         active    idle   10.1.77.76      3306,33060/tcp  Primary
mysql-k8s/1          active    idle   10.1.77.77
mysql-k8s/2          active    idle   10.1.77.78
mysql-router-k8s/0*  active    idle   10.1.77.79    
s3-integrator/0*     active    idle   10.1.77.80

Continue to operate the charm as usual from here or apply further Terraform changes.

Clean up

To keep the house clean, remove the newly deployed MySQL K8s charm by running

terraform destroy -var 'model=my-model'

Feel free to contact us if you have any question and collaborate with us on GitHub!