DEV Community

Cover image for Setup kubernetes cluster using kubeadm

Posted on

Setup kubernetes cluster using kubeadm

From previous post, you prepare a number of VMs machine, in this post, we will install kubeadm and setup it to work together as a cluster.

This is part of Setup your own kubernetes cluster on VMs series.


This is an opinionated kubernetes cluster setup so it is easy enough for beginners. Meaning, something have already been chosen for you but you can change it if you want.
This post is based on this kubernetes official document


  • At least 2 Virtual machines with Ubuntu installed and connected network

Switch to root user (All machines)

Run below command and enter root password (password when you setup VM)

sudo su

Install Docker (All machines)

Follow these steps to install docker to all machines.

1. Install Docker

# Install Docker from Ubuntu's repositories:
apt-get update
apt-get install -y

2. Configure docker

In case you want to use your own docker private registry, follow below, otherwise follow "Without private registry below"

Note: "" is my docker private registry.

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  "storage-driver": "overlay2",

  "insecure-registries": [
  "disable-legacy-registry": true

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl daemon-reload
systemctl restart docker

Without private registry.

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  "storage-driver": "overlay2"

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl daemon-reload
systemctl restart docker

3. (Optional) Install image cleanup job

I recommend to install this job to clean up unused docker images otherwise they will consume all your disk.

docker run -d --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock:rw \
  -v /var/lib/docker:/var/lib/docker:rw \
  -e "CLEAN_PERIOD=86400" \

4. Check if everything alright

Run below command to see if everything is ok.

docker ps

You should see something like below on all machines and you're good to proceed.

Install Kubeadm (All machines)

Next step is to install kubernetes cluster tool.

1. Disable swap

This is a prerequisite for kubeadm.

# disable temporarily
swapoff -a

To disable permanently, edit /etc/fstab and command swap line out and save.

vi /etc/fstab

Note for vi newby:

  • move cursor to the beginning of last line
  • type 'i' to insert
  • type '#' then 'esc'
  • type ':wq' then enter to save

2. Run below commands on all machines

apt-get update && apt-get install -y apt-transport-https curl


curl -s | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb kubernetes-xenial main
apt-get update
apt-get install -y kubelet kubeadm kubectl nfs-common


apt-mark hold kubelet kubeadm kubectl

These commands will install:

  • kubelet : kubernetes node runtime
  • kubeadm : kubernetes cluster setup tool
  • kubectl : kubernetes cluster command line interface
  • nfs-common: nfs client library to be able to connect to NFS server

Setup cluster (Master Node only)

This step, we will initialize master node by running command.

# init master
kubeadm init

Note: Run on master node only

You will need to wait for sometimes depending on your internet connection.

If everything is ok, you will see.

Please copy the last line. It will be used in the next step to join worker node.

Setup cluster (Worker Node only)

Run join command copied from previous step on all the worker nodes.

Here is an example (Do not use this command, it won't work for you)

kubeadm join --token srzyez.wjnqsmt2gcohxtp4 --discovery-token-ca-cert-hash sha256:ac8d21e46aeaba3664c4f6060072de03d906d0032f9731b021eeb8d54a876e35

On worker node, if join command succeed, you will see.

Post install (Master node only)

1. Setup cluster connection configuration

Switch back to normal user.


Run below command and enter root password.

# setup kube config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. Install Pod network (weavenet)

A kubernetes cluster needs pod network. To install weavenet (one of several pod network providers), run command on master node as below.

sudo sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f "$(kubectl version | base64 | tr -d '\n')"

3. Check the result

On master node, run command below.

kubectl get nodes

If you see something like below, congratulation! you have your cluster.

Install Dashboard (Optional)

To be able to see the overall picture of your cluster, you need a dashboard.

1. Install dashboard

On master node, run below command.

kubectl apply -f

2. Setup permission to access dashboard

For simplify thing, we will grant admin permission to anyone access dashboard. You won't do this in the actual cluster.

echo "apiVersion:
kind: ClusterRoleBinding
  name: kubernetes-dashboard
    k8s-app: kubernetes-dashboard
  kind: ClusterRole
  name: cluster-admin
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system" | kubectl apply -f -

3. Run proxy command

Open a proxy so that the cluster can be accessed from outside.

kubectl proxy --address='' --accept-hosts='.*'

4. Open dashboard UI

Open url https://<your master node ip>:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy.

You should see login page.

Click "Skip" button and you will see overview page.

Congratulation! You've got a dashboard to see and manage your workload.


We've got a kubernetes cluster running on VMs. Next step will setup cluster storage so we can build application that store something.

Top comments (1)

umar14 profile image

Hello. I was wondering if it would be easier to setup one VirtualBox vm with everything and then simply clone it multiple times to get desired number of worker nodes.