How to use launch configurations

In this HowTo we present the three ways launch configurations can be applied on a local MicroK8s node. In this guide, we will use the following configuration file, which deploys a MicroK8s node and enables the dns, ingress, rbac, hostpath-storage and registry addons automatically. See the launch configurations reference for a reference of all possible configuration options as well as examples.

# microk8s-config.yaml
---
version: 0.1.0
addons:
  - name: dns
  - name: rbac
  - name: ingress
  - name: hostpath-storage
  - name: registry

# The extra arguments listed here are not required, as they would be set by the 'rbac' and the 'dns'
# addons respectively. However, we set them to save time by not having to restart the Kubernetes
# services a few times during cluster bootstrap.
extraKubeAPIServerArgs:
  --authorization-mode: RBAC,Node
extraKubeletArgs:
  --cluster-dns: 10.152.183.10
  --cluster-domain: cluster.local

1. When deploying a cluster

Starting with version 1.27, MicroK8s contains a default launch configuration that automatically enables the dns addon for newly deployed clusters. It is possible to override the default launch configuration by creating /var/snap/microk8s/common/.microk8s.yaml like this:

sudo mkdir -p /var/snap/microk8s/common/
sudo cp microk8s-config.yaml /var/snap/microk8s/common/.microk8s.yaml

Similarly, to automatically sideload OCI images into the container runtime, add any .tar archives to /var/snap/microk8s/common/sideload/<image>.tar:

sudo mkdir -p /var/snap/microk8s/common/sideload
sudo cp *.tar /var/snap/microk8s/common/sideload/

The configuration file will be picked up automatically during the snap install microk8s command. After creating the launch configuration file, install MicroK8s as you normally would:

sudo snap install microk8s --classic --channel 1.27

And then wait for the cluster to come up. After a while, list the running pods with sudo microk8s kubectl get pod -A and you should see:

NAMESPACE            NAME                                      READY   STATUS    RESTARTS   AGE
kube-system          calico-node-wtjk2                         1/1     Running   0          2m25s
kube-system          coredns-f58c55f4c-xw87l                   1/1     Running   0          2m37s
kube-system          hostpath-provisioner-69cd9ff5b8-njtpc     1/1     Running   0          2m33s
kube-system          calico-kube-controllers-57b57c56f-wcj57   1/1     Running   0          2m25s
container-registry   registry-77c7575667-66kvf                 1/1     Running   0          2m20s
ingress              nginx-ingress-microk8s-controller-s9wft   1/1     Running   0          2m13s

NOTE: When installing MicroK8s with an invalid launch configuration file, the snap install microk8s command will fail.

2. Using snap set

It is also possible to set a launch configuration on an existing cluster using the snap set microk8s config=<contents> command.

First, install MicroK8s:

sudo snap install microk8s --classic --channel 1.27

Then, apply the launch configuration by setting the config config option. The option value must be the file contents, not the path:

sudo snap set microk8s config="$(cat microk8s-config.yaml)"

After a while, the configuration is applied to the local node.

3. Using a content snap

This method is only supported when running MicroK8s with strict-confinement. This method makes sense in large scale deployments where the operator wants to control the launch configuration of a large fleet of machines, and requires the development and installation of an extra “content snap”. The content snap is built with the custom launch configuration of the operator, and the configuration is applied by connecting the content snap to MicroK8s.

See microk8s-content-demo-snap for an example content snap. You can use it to scaffold your own content snaps. The readme contains instructions for editing and building the content snap.

When using a content snap, the installation process looks like this:

First, install the content snap on the host:

# install content snap from the store...
sudo snap install content-demo-microk8s

# ... or from a local file
sudo snap install ./content-demo-microk8s.snap --dangerous

Then, install MicroK8s with strict-confinement:

sudo snap install microk8s --channel 1.27-strict

Finally, connect the content snap (replace content-demo-microk8s with your own content snap name):

sudo snap connect content-demo-microk8s:configuration microk8s

After a while, the configuration is applied to the local node.