Development / Kubernetes

Deploy a Kubernetes Desktop Cluster with Ubuntu Multipass

15 Jul 2020 9:00am, by

Canonical’s Multipass is an incredibly easy tool for the deploying of virtual machines. It’s quite unlike VirtualBox or VMware, in that it’s a command-line only tool and you’re limited to spinning up only Ubuntu-based images as virtual machines. However, what it lacks in flexibility, it makes up for in ease of use.

With this tool, you can deploy a Kubernetes cluster to make your development process a bit easier. You certainly won’t be using Multipass as a production environment, but for anyone that prefers development on a single machine, you cannot beat this platform.

I want to walk you through the process of deploying a Kubernetes cluster using Multipass. I’ll be demonstrating on System76’s very own Pop!_OS, an OS tweaked for science work built upon Ubuntu. If Pop!_OS isn’t your jam, you can install Multipass on any Linux distribution that supports snap packages. You can also install Multipass on macOS and Windows, by downloading either the .exe or .pkg files from the Multipass downloads page. Once you have Multipass installed, the instructions for usage will be similar, regardless of platform.

Installing Multipass

Before we install Multipass, let’s make sure to update and upgrade our system (for good measure). To do this, log in, open a terminal window, and issue the following two commands:

sudo apt-get update

sudo apt-get upgrade -y

Do remember, if the kernel gets upgraded, you’ll need to reboot the system, in order for the changes to take effect. So, if this is a production machine, you’ll want to run the upgrade at a time when a reboot is feasible.

With the update/upgrade out of the way, let’s install Multipass. To do this, we’ll use the snap command like so:

sudo snap install multipass --classic --stable

When the command completes, Multipass is installed and ready to deploy your first virtual machine.

Launching Your Virtual Machines

We’re going to launch three virtual machines for our Kubernetes cluster. I’m going to launch some bare minimum VMs, but you can bump up the specs as you see fit. My VMs will each have a unique name, 2 CPUs, 1024MB of memory, and 10GB of storage. Remember, you can alter that configuration as needed.

The first VM will be the Kubernetes controller. To launch this, the command would be:

multipass launch --name k3s-controller --cpus 2 --mem 1024M --disk 10G

Depending on your network connection (and the speed of your hosting machine), this will take anywhere between 1-5 minutes.

Next, we’ll launch our first node with the command:

multipass launch --name k3s-node1 --cpus 2 --mem 1024M --disk 10G

Finally, we’ll launch our second node with the command:

multipass launch --name k3s-node2 --cpus 2 --mem 1024M --disk 10G

To verify that the virtual machines successfully launched, issue the command:

multipass list

You should see all three VMs in place (Figure 1).


Figure 1: Our virtual machines are ready for Kubernetes.

Installing the Necessary Software

At this point, things should start looking familiar (if you’ve ever deployed a Kubernetes cluster). We’re going to access the controller and install Docker and Kubernetes. Access the controller with the command:

multipass shell k3s-controller

Update apt with the command:

sudo apt-get update

Now we can install Docker with the command:

sudo apt-get install -y

Start and enable the Docker service with the commands:

sudo systemctl start docker

sudo systemctl enable docker

Now, add the current user to the docker group with the command:

sudo usermod -aG docker $USER

Make the system aware of the new group addition with the command:

newgrp docker

It’s now time to install Kubernetes. We first must add the repository key and the repository with the following commands:

curl -s | sudo apt-key add

sudo apt-add-repository "deb kubernetes-xenial main"

Finally, we can install all of the necessary Kubernetes tools with the command:

sudo apt-get install kubeadm kubelet kubectl -y

Open a second terminal window and issue the command:

multipass list

Take note of the IP addresses assigned to the virtual machines.

Back at the k3s-controller, issue the command:

sudo nano /etc/hosts

In that file, add the following:

Make sure to adjust the IP addresses according to your multipass list command output.

Turn off swap with the command:

sudo swapoff -a

Now it’s time to deploy Kubernetes on the controller with the command:

sudo kubeadm init --pod-network-cidr=

Again, make sure to adjust the IP address above to that of your k3s-controller.

This could take some time. While it finishes, gain access to node1 and node2 and install both Docker and Kubernetes in the same fashion you did with the controller. Also, make sure to edit the /etc/hosts files on both machines as well.

Once you’ve taken care of the nodes, go back to the controller and you should see the kubeadm join command, which should look like:

sudo kubeadm join –token 6latiw.pjq5e1qrgwabrhc8 –discovery-token-ca-cert-hash sha256:a8ebefbc70706dd31d016ea215b947e56baea354f0d1d4927926af2ec564ea44

Copy that join command.

Access node1 with the command:

multipass shell k3s-node1

Connect node1 with the kubernetes join command. Once that’s taken care of, exit out of node1 and access node2 with the command:

multipass shell k3s-node2

Once inside node2, run the kubernetes join command as you did in node1. When that completes, exit out of node2 with the exit command.

The final steps are taken back at the controller. If you’re not still within the controller, gain access with the command:

multipass shell k3s-controller

Once inside, the first thing to do is to create a directory for the cluster with the command:

mkdir -p $HOME/.kube

Next, copy the config file into this directory with the command:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

Change the config file’s permissions with the command:

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Finally, deploy a pod network to the cluster with the command:

sudo kubectl apply -f

Checking the Status of Your Cluster

At this point, both our nodes have joined the cluster. But how do we know for sure? On the controller, issue the command:

kubectl get nodes

You should see both nodes have joined the cluster and are listed as Ready (Figure 2).

Figure 2: Our nodes have joined our Kubernetes cluster.

And there you have it, your Multipass-deployed Kubernetes cluster is ready for you to start developing.

Feature image by Nareeta Martin on Unsplash.

At this time, The New Stack does not allow comments directly on this website. We invite all readers who wish to discuss a story to visit us on Twitter or Facebook. We also welcome your news tips and feedback via email:

A newsletter digest of the week’s most important stories & analyses.