Although MicroK8s is designed as an ultra-lightweight implementation of Kubernetes, it is still possible, and useful to be able to create a MicroK8s cluster. This Page explains how to add and remove nodes and what is required to make the cluster highly available.
ⓘ Note: Each node on a MicroK8s cluster requires its own environment to work in, whether that is a separate VM or container on a single machine or a different machine on the same network. Note that, as with almost all networked services, it is also important that these instances have the correct time (e.g. updated from an ntp server) for inter-node communication to work.
To create a cluster out of two or more already-running MicroK8s instances, use the
microk8s add-node command. The MicroK8s instance on which this command is run will be the master of the cluster and will host the Kubernetes control plane:
This will return some joining instructions, such as:
From the node you wish to join to this cluster, run the following: microk8s join 192.168.1.230:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 Use the '--worker' flag to join a node as a worker not running the control plane, eg: microk8s join 192.168.1.230:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 --worker If the node you are adding is not reachable through the default interface you can use one of the following: microk8s join 192.168.1.230:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 microk8s join 10.23.209.1:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 microk8s join 172.17.0.1:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05
add-node command prints a
microk8s join command which should
be executed on the MicroK8s instance that you wish to join to the
cluster (NOT THE NODE YOU RAN
microk8s join 192.168.1.230:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05
Joining a node to the cluster should only take a few seconds. Afterwards
you should be able to see the node has joined:
microk8s kubectl get no
NAME STATUS ROLES AGE VERSION 10.22.254.79 Ready <none> 27s v1.15.3 ip-172-31-20-243 Ready <none> 53s v1.15.3
First, on the node you want to remove, run
microk8s leave. MicroK8s on the departing node
will restart its own control plane and resume operations as a full single node cluster:
To complete the node removal, call
microk8s remove-node from the remaining nodes to
indicate that the departing (unreachable now) node should be removed permanently:
microk8s remove-node 10.22.254.79
From the 1.19 release of MicroK8s, HA is enabled by default. If your cluster consists of three or more nodes, the datastore will be replicated across the nodes and it will be resilient to a single failure (if one node develops a problem, workloads will continue to run without interruption).
microk8s status now includes information about the HA state. For example:
microk8s is running high-availability: yes datastore master nodes: 10.128.63.86:19001 10.128.63.166:19001 10.128.63.43:19001 datastore standby nodes: none
For more information about how HA works, and how to manage an HA cluster, please see the High Availability page.
Starting from the 1.23 release a node can join the cluster as a worker node. Worker nodes are able to host workloads but they do not run the Kubernetes control plane and therefore they do not add to the availability (HA) of the cluster. Worker nodes are ideal for low-end devices as they consume fewer resources. They also make sense in large clusters with enough control plane nodes to ensure HA. To add a worker node use the
--worker flag when running the
microk8s join command:
microk8s join 192.168.1.230:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 --worker
A worker node runs a local Traefik load balancer that takes care of the communication between the local services (kubelet, kbe-proxy) and the API servers running on multiple control plane nodes. When adding a worker node, MicroK8s attempts to detect all API server endpoints in the cluster and configure the new node accordingly. The list of API servers is stored in
/var/snap/microk8s/current/args/traefik/provider.yaml. Please, review this list right after the join operation completes to verify all control plane endpoints are there. If your API servers are behind a load balancer you will need to replace the detected endpoints in this file with the entry your provided by the load balancer. Also note that this list does not update when new control plane nodes are added to the cluster. Therefore you will need to revise the traefik configuration each time the control plane is updated/extended.