Single-node deployments of Kubernetes are more common than what one would expect. In some scenarios, single-node clusters make much more sense. For development purposes or testing, there’s no need to deploy a full-blown production-grade cluster. Single-node deployments are also handy for appliances and IoT applications since they have a much smaller footprint.
Enter MicroK8s, a tool by Canonical that enables you to easily deploy a lightweight single-node cluster in your local environment.
But wait, doesn’t Minikube already allow me to do just this? Well, I’m glad you asked! Yes, Minikube also allows you to deploy a single-node Kubernetes cluster locally but with one key difference — it’s VM-based, and thus will work best running within a VM, primarily on Mac and Windows but also on Linux. MicroK8s, on the other hand, were designed for Linux and does not require a VM. Instead, it can be easily be installed as a snap package using one simple command. Because it doesn’t require a VM, there are more resources available on the given machine to run applications, which makes MicroK8s a perfect fit for edge installations. You can even use it to install Kubernetes on Raspberry Pi!
Let’s take a closer look.
The recommended way for installing MicroK8s is on Linux. Specifically, any Linux distribution that supports snapd. There are also alternative installation methods available for Mac and Windows but I cannot attest to how well these scenarios will work.
I will be installing MicroK8s on an Ubuntu 18.04 EC2 instance as Ubuntu supports snapd by default (both are Canonical-led projects) and is also my preferred distro. If you’re using a different Linux distro, go to snapd docs to install it.
To install MicroK8s, use this one simple command:
sudo snap install microk8s --classic --channel=1.16/stable
MicroK8s will be installed in a snap and within a few seconds you should see this message displayed:
microk8s (1.16/stable) v1.16.3 from Canonical✓ installed
To make sure MicroK8s is running, you can use this status command:
And the output:
microk8s is running addons: cilium: disabled dashboard: disabled dns: disabled fluentd: disabled gpu: disabled helm: disabled ingress: disabled istio: disabled jaeger: disabled knative: disabled linkerd: disabled metrics-server: disabled prometheus: disabled rbac: disabled registry: disabled storage: disabled
As you can see, MicroK8s is running as expected and we can see a long list of addon components that are disabled which we will discuss in the next step.
MicroK8s ships with kubectl so we can use this familiar CLI to interact with our Kubernetes cluster, and to monitor and operate it.
As an example:
microk8s.kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-31-52-245 Ready 7m38s v1.16.3
Optionally, if you want to use kubectl in your commands instead of microk8s.kubectl, you can add an alias:
sudo snap alias microk8s.kubectl kubectl
To make MicroK8s as lightweight as possible, the default installation includes a barebones Kubernetes deployment, which includes the api-server, controller-manager, scheduler, kubelet, cni and kube-proxy.
Our single-node deployment, however, can be easily extended by enabling the provided addons we saw in the previous step. For example, you can enable Istio services or deploy a private Docker registry. Addons can be easily enabled and disabled whenever you like and are pre-configured to work out-of-the-box.
For the sake of demonstration in this tutorial, we’ll add the dashboard addon that provides the well-known user interface to monitor and operate Kubernetes clusters. We’ll also enable two other addons that will support the dashboard — dns and ingress.
To do this, we’ll use this command:
sudo microk8s.enable dns dashboard ingress
Next, we’ll set up a proxy to pass and allow external requests to the dashboard:
sudo microk8s.kubectl proxy --accept-hosts=.* --address=0.0.0.0 &
To allow access to the dashboard without requiring a token, I’m going to edit the deployment file for the dashboard service:
sudo microk8s.kubectl -n kube-system edit deploy kubernetes-dashboard -o yaml
Here, I’m going to add the –enable-skip-login flag to the deployment’s specs:
spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: k8s-app: kubernetes-dashboard spec: containers: - args: - --auto-generate-certificates - --namespace=kube-system - --enable-skip-login
Once we save the file, we’ll be able to access the dashboard by entering the following URL:
Just hit the Skip button to access the dashboard:
Logging in MicroK8s
You can easily set up a local EFK Stack (Elasticsearch, Fluentd and Kibana) using the provided fluentd addon. Note, that the default images will deploy versions 6.3 of Elasticsearch and Kibana:
sudo microk8s.enable fluent
This creates three pods, one for each component of the stack:
sudo microk8s.kubectl get services -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.152.183.71 8000/TCP 144m elasticsearch-logging ClusterIP 10.152.183.183 9200/TCP 138m heapster ClusterIP 10.152.183.208 80/TCP 144m kibana-logging ClusterIP 10.152.183.65 5601/TCP 138m kube-dns ClusterIP 10.152.183.10 53/UDP,53/TCP,9153/TCP 144m kubernetes-dashboard ClusterIP 10.152.183.84 443/TCP 144m monitoring-grafana ClusterIP 10.152.183.163 80/TCP 144m monitoring-influxdb ClusterIP 10.152.183.125 8083/TCP,8086/TCP 144m
To access Kibana, we can use the same URL we used to access the dashboard with the name of the Kibana service:
MicroK8s is by far the easiest way I’ve encountered to setup a single-node Kubernetes cluster for a test environment. Yes, it’s Linux-oriented, which might be a bit of hurdle for most developers working with a Mac, but there are options to set MicroK8s on Mac as well as Windows. Installing on a VM and a remote machine are also very simple options, as seen in this example.
While MicroK8s is a quick and easy way to set up a single-node cluster, it already has added the ability to cluster up by adding more worker nodes. This is still somewhat premature but as it stands now, this might be a perfect solution for setting up a multi-node Kubernetes cluster, albeit for development purposes only. More about this option soon.