Introduction
MicroK8s is a lightweight Kubernetes that tracks upstream releases and is simple to install and configure for development, prototyping and testing. You can have a simple application running on a Kubernetes cluster on Hetzner Cloud in less than 30 minutes.
Prerequisites
To follow the steps in this tutorial, you will need the following:
- A Hetzner Cloud account
- A Hetzner Cloud project for your Kubernetes cluster
- A configured SSH key for your Hetzner Cloud project
- An API token for your Hetzner Cloud project
- A local hcloud CLI install
- Basic concepts of Kubernetes
The tutorial uses the following conventions to represent variables used in the code below:
- <network_id> is the name of the network used for the cluster. e.g. network-1
- <ssh_key_id> is the name of an SSH key in your Hetzner cloud project
- <master-1_ip> is the IP address of the master-1 server created below
- <node-1_ip> is the IP address of the node-1 server created below
- <node-2_ip> is the IP address of the node-2 server created below
This tutorial was created on Ubuntu 18.04 and the instructions were tested there. It should work from any operating system with proper adaption of the instructions.
Step 1 - Create the network and subnet
For this step, you will use the hcloud CLI tool on your local workstation to create the network and subnet in your Hetzner Cloud project. To use the hcloud CLI tool, we need to first install it and initialize a context. For information on how to do that, consult the How-to: Hetzner Cloud CLI tutorial.
In the example below, I'm defining the network to have the IP range 10.44.0.0/16. The subnet is in the network zone eu-central with a definition of 10.44.0.0/24.
local$ hcloud network create --name <network_id> --ip-range 10.44.0.0/16
local$ hcloud network add-subnet <network_id> --network-zone eu-central --type server --ip-range 10.44.0.0/24
Step 2 - Create servers
Next, we create the servers using hcloud CLI. This should only take a few minutes.
local$ hcloud server create --type cx11 --name master-1 --image ubuntu-18.04 --ssh-key <ssh_key_id> --network <network_id>
local$ hcloud server create --type cx11 --name node-1 --image ubuntu-18.04 --ssh-key <ssh_key_id> --network <network_id>
local$ hcloud server create --type cx11 --name node-2 --image ubuntu-18.04 --ssh-key <ssh_key_id> --network <network_id>
Be sure to note the IP address for each server that is created as you will need them to login via ssh in later steps.
Step 3 - Install MicroK8s
After we have the servers, we will log into each one, apply updates and install microK8s. From your workstation, ssh to the IP address of the server as root (e.g. local$ ssh root@<master-1_ip> -i ~/.ssh/id_rsa
) and run the following:
root@master-1:~# apt update && apt -y upgrade
root@master-1:~# snap install microk8s --classic
root@master-1:~# microk8s.enable dns storage ingress
This will take a few minutes to complete. Do the same steps on node-1 and node-2 so that MicroK8s is installed on all of the servers.
Step 4 - Create cluster
Now that we have installed MicroK8s, we create a cluster for our three machines using the microk8s.add-node
and microk8s.join
commands. SSH to the master-1 server and run the following:
root@master-1:~# microk8s.add-node
Join node with: microk8s.join 95.217.153.160:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s.join 95.217.153.160:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
microk8s.join 10.44.0.2:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
microk8s.join 10.1.77.0:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
Copy the microk8s.join command that uses the network you defined above (e.g. microk8s.join 10.44.0.2:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
). Next, ssh to the node-1 server and run the microk8s.join
command:
root@node-1:~# microk8s.join 10.44.0.2:25000/ruNhDtPezpdTCfyAyhOCJWpPnGhSggvZ
This command will take a few seconds and return.
Go back to the master-1 server and run microk8s.add-node
again to generate a new join key. Copy the microk8s.join command as you did before and run it on node-2.
root@node-2:~# microk8s.join 10.44.0.2:25000/cwWfPWPUmrmFGKUYaVovhhWVUrLpsEyP
After the microk8s.join command returns, log into master-1 again and check that the nodes are joined using the following command:
root@master-1:~# microk8s.kubectl get nodes
You should get a response that lists the three nodes that are in the network:
NAME STATUS ROLES AGE VERSION
10.44.0.3 Ready <none> 5m v1.17.2
10.44.0.4 Ready <none> 119s v1.17.2
master-1 Ready <none> 44m v1.17.2
Step 5 - Run an application
Now that we have a MicroK8s cluster, let's run a simple application in the cluster. To do that, go to master-1 and run the following command to install a hello-app:
root@master-1:~# microk8s.kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080
You will receive a message that kubectl run
is deprecated which is OK.
Next, we need to expose that application we installed with a service:
root@master-1:~# microk8s.kubectl expose deployment web --target-port=8080 --type=NodePort
service/web exposed
Now, using whichever text editor you prefer (e.g. vim, nano, etc.) create a text file called simple-ingress.yaml on master-1 with the following contents:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: sample-ingress
spec:
backend:
serviceName: web
servicePort: 8080
This will create an ingress controller for the hello-web application which allows it to be accessed from outside the Kubernetes cluster. We create this ingress with the following command:
root@master-1:~# microk8s.kubectl apply -f simple-ingress.yaml
To test that this works, go to your local workstation and run curl:\\<master-1_ip>
. You will get some result like:
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-68fbd
We now have a working application running on our Kubernetes cluster.
Conclusion
If you have worked all the way through this tutorial, you now have a working MicroK8s cluster running on Hetzner Cloud that you can use for development or prototyping. There are many more things we can with this simple cluster. A nice feature of running MicroK8s on Hetzner Cloud is that you can upgrade your server to a larger instance to get more capacity when you need it.