Charmed MicroK8s How To Deploy Kubernetes charms

This guide explains how to deploy a MicroK8s cluster and add it as a second cloud on your Juju controller, so that you can deploy Kubernetes workloads.


  • An existing bootstrapped Juju controller on a cloud like AWS, Azure, OpenStack, LXD, etc


Deploy Cluster

Create a new model microk8s and deploy a 3-node cluster:

juju add-model microk8s
juju deploy microk8s -n 3 --config hostpath_storage=true --constraints 'mem=4G root-disk=20G'

Then, make sure to expose the microk8s application so that the Juju controller can reach the Kubernetes cluster:

juju expose microk8s

Wait until the cluster is deployed. The juju status should look like this:

Model     Controller  Cloud/Region   Version  SLA          Timestamp
microk8s  zs          zerostack/KHY  2.9.38   unsupported  01:41:13+03:00

App       Version  Status  Scale  Charm     Channel  Rev  Exposed  Message
microk8s           active      3  microk8s            77  yes      node is ready

Unit          Workload  Agent  Machine  Public address  Ports      Message
microk8s/30   active    idle   0  16443/tcp  node is ready
microk8s/31*  active    idle   1   16443/tcp  node is ready
microk8s/33   active    idle   2  16443/tcp  node is ready

Machine  State    Address         Inst id                               Series  AZ    Message
0        started  795b9667-fd5d-4ff4-8c42-e2de40e581c5  focal   nova  ACTIVE
1        started   27a00794-d77d-4aae-ab9c-18032e293085  focal   nova  ACTIVE
2        started  584ad91e-5ae7-4e1a-9a2c-6a4cc24d8ee2  focal   nova  ACTIVE

Add Kubernetes cluster as a cloud on the Juju controller

Retrieve the kubeconfig for the cluster with the following command:

# Juju 2.9
kubeconfig="$(juju run --unit microk8s/leader -- microk8s config)"

# Juju 3.1
kubeconfig="$(juju exec --unit microk8s/leader -- microk8s config)"

Then, create a microk8s-cloud cloud on your Juju controller with:

controller="$(juju controller-config controller-name)"
echo "$kubeconfig" | juju add-k8s microk8s-cloud --controller "$controller"

If successful, you should see output like the following:

k8s substrate "microk8s/localhost" added as cloud "microk8s-cloud" on controller zs.

Finally, check the configured clouds on the controller using juju clouds. The output should look like this:

Clouds available on the controller:
Cloud           Regions  Default    Type
microk8s-cloud  1        localhost  k8s
zerostack       1        KHY        openstack

Deploy Kubernetes charms

Now that the Juju controller is aware of our cluster, we can deploy Kubernetes workloads like this:

Create a model prometheus using the microk8s-cloud cloud.

juju add-model prometheus microk8s-cloud

Then, deploy prometheus-k8s:

juju deploy prometheus-k8s

Watch the progress of the deployment with juju status. After a while, it should look like this:

Model       Controller  Cloud/Region              Version  SLA          Timestamp
prometheus  zs          microk8s-cloud/localhost  2.9.38   unsupported  01:57:38+03:00

App         Version  Status      Scale  Charm           Channel  Rev  Address         Exposed  Message
prometheus  2.44.0   active          1  prometheus-k8s  edge     130   no

Unit           Workload  Agent  Address       Ports  Message
prometheus/0*  active    idle