Est. reading time: 6 minutes
Install Kubernetes cluster on Windows Server worker nodes

Kubernetes Cluster On Windows Server Worker Nodes

Kubernetes (k8s) is an open-source, cloud-native, container orchestration and management platform. It’s the go-to way to automate the deployment, scaling, and maintenance of containerised applications across different nodes. From service discovery to auto-restarts, and from resource allocation tracking to compute utilisation and scaling; a well-configured k8s cluster can manage a lot on its own.

Windows Server 2019 is the only Windows-based operating system that supports Kubernetes installation. Unfortunately, for Kubernetes to run on Windows, it still requires a Linux master.

Since the support is relatively new, pay special attention to the steps below.

What is a Kubernetes Cluster?

A Kubernetes cluster consists of a Master and at least one to several worker node(s). The Master is the virtual machine (VM) that administers all activities on your cluster. A node is a VM that serves as a worker machine in your k8s cluster to host running applications. We strongly recommend you only use VMs aka Cloud Servers to run Kubernetes, not system containers aka VPS, as these can cause issues with k8s.

HOSTAFRICA Kubernetes Cluster Diagram - Ubuntu Master and Windows Server workers HOSTAFRICA Kubernetes Cluster Diagram – Ubuntu Master and Windows Server workers


A node is comprised of the Kubelet, a container runtime, and the kube-proxy. The k8s installation’s three core modules: Kubelet, kubeadm, and kubectl are agents that control the node and communicate with the Kubernetes Master. Once they have been installed and other configurations done, you will be able to create your first k8s cluster. You can manage this cluster from the command line on your kubemaster node.

Every Kubernetes instance runs on top of a container runtime, which is software responsible for managing container operations. Containers in this case are not virtualised servers but rather a solution that packages code and dependencies to run a single application (service) in an isolated (containerised) environment, essentially disassociating applications from the host machine. The most popular and recommended one is Docker, and it’s the one we will use for the purpose of this guide. However, if you want to install a different underlying container runtime, you can harness the power of the Container Runtime Interface and use basically any runtime you want.

Kubernetes groups containers into pods, its most basic operational unit, which are basically just groups of containers running on the same node. Pods are connected over a network and share storage resources.

In order to connect your nodes or VMs and make them private, make sure to choose a hosting company who provides a Virtual Local Area Network (VLAN) with their VMs. We offer a VLAN add-on to our Cloud Servers for R200 per month.


• Multiple Windows Server 2019 VMs (Windows Cloud Servers) to house the worker nodes.
• A Linux VM (for this article we will use an Ubuntu VM for the Master node)
• Docker or any other container runtime.
• User with sudo or root privileges on every server.


Got CentOS VMs? Learn How to install Kubernetes and deploy a cluster with Docker on CentOS 7

Got Ubuntu VMs? Learn How to install Kubernetes and deploy a cluster with Docker on Ubuntu 18

How to install Kubernetes on Windows Server 2019 (worker node only)

Step 1. Install Docker on all VMs

Use our guide How to install Docker on Ubuntu 18 for your Ubuntu Master VM.

Then follow our guide How to install Docker on Windows Server 2019 for all your Windows worker VMs.

Step 2. Start Docker Service

If you haven’t already, make sure that the Docker service is installed. Open a PowerShell and enter the following command:

Start-Service docker

Step 3. Pull and tag an Image used by Kubernetes

Once docker is up and running, we need to pull and tag an image used by Kubernetes. Use the following commands:

docker image pull
docker image tag microsoft/nanoserver:latest

Step 4. Download and extract Kubernetes binaries

Next up, we need to fetch, extract, and save the Kubernetes binaries. Use the following commands:

mkdir C:\k
cd C:\k
iwr -outf kubernetes-node-windows-amd64.tar.gz ""
tar -xkf kubernetes-node-windows-amd64.tar.gz -C C:\k
mv C:\k\kubernetes\node\bin\*.exe C:\k

terminal output

Step 5. Set up binaries and install

Use the following snippet of code which will install and move the required files and binaries.







$BaseDir = "c:\k"

$NetworkMode = $NetworkMode.ToLower()

$NetworkName = "vxlan0"

$GithubSDNRepository = 'Microsoft/SDN'

$helper = "c:\k\helper.psm1"

if (!(Test-Path $helper))


    Start-BitsTransfer "$GithubSDNRepository/master/Kubernetes/windows/helper.psm1" -Destination c:\k\helper.psm1


ipmo $helper

$install = "c:\k\install.ps1"

if (!(Test-Path $install))


    Start-BitsTransfer "$GithubSDNRepository/master/Kubernetes/windows/install.ps1" -Destination c:\k\install.ps1

powershell $install -NetworkMode "$NetworkMode" -clusterCIDR "$ClusterCIDR" -KubeDnsServiceIP "$KubeDnsServiceIP" -serviceCIDR "$ServiceCIDR" -InterfaceName "'$InterfaceName'" -LogDir "$LogDir"

You should see the following output:

terminal output

How to add a Windows based Kubernetes Node to a Linux Cluster

Since the Kubernetes control plane still has components that are Linux-specific, it’s not possible for us to build an all-Windows Kubernetes cluster – yet. However, we will share the steps to add a Windows-based Kubernetes worker node to an existing Kubernetes cluster with an Ubuntu 18.09 master. Follow these steps:

Part 1. Set up the Ubuntu 18.09 Kubernetes Master node

Use our guide How to install Kubernetes and deploy a cluster with Docker on Ubuntu 18 and follow all the steps related to setting up the Master node. The worker nodes will be installed in the steps below.

Part 2. Configure and add Windows Kubernetes Node to the Cluster

Step 1. Copy Config File from Kubernetes Master

On your Ubuntu 18.09 VM, enter the following command and copy the output value

cat $HOME/.kube/config

Now, move over to the Windows VM and enter the following command to create a config file in the C:\k folder:

notepad C:\k\config

Paste the contents in the notepad, save and exit.

Note: Please make sure that you are not saving the file with a .txt extension. If necessary, change the extension from PowerShell using this command:

ren config.txt config

config file

Step 2. Register node

Now that we have installed most of the Kubernetes binaries, we can proceed with registering the node. Run the following three commands:

powershell $BaseDir\start-kubelet.ps1 -RegisterOnly -NetworkMode $NetworkMode
ipmo C:\k\hns.psm1

Step 3. Start Kubernetes services and join cluster

Copy the snippet below to start Kubernetes services on the Windows VM and add the Windows VM to the Ubuntu 18.09 cluster:
Note: You have to replace “” with the IP of your machine. You can get that using the ipconfig command)





iwr -outf


mv C:\k\nssm\nssm-2.24-101-g897c7ad\win64\*.exe C:\k

# register & start flanneld

.\nssm.exe install $FlanneldSvc C:\flannel\flanneld.exe

.\nssm.exe set $FlanneldSvc AppParameters --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1

.\nssm.exe set $FlanneldSvc AppEnvironmentExtra NODE_NAME=$Hostname

.\nssm.exe set $FlanneldSvc AppDirectory C:\flannel

.\nssm.exe start $FlanneldSvc

# register & start kubelet

.\nssm.exe install $KubeletSvc C:\k\kubelet.exe

.\nssm.exe set $KubeletSvc AppParameters --hostname-override=$Hostname --v=6 --resolv-conf=""  --enable-debugging-handlers --cluster-dns=$KubeDnsServiceIP --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false  --log-dir=$LogDir --logtostderr=false --enforce-node-allocatable="" --network-plugin=cni --cni-bin-dir=c:\k\cni --cni-conf-dir=c:\k\cni\config

.\nssm.exe set $KubeletSvc AppDirectory C:\k

.\nssm.exe start $KubeletSvc

# register & start kube-proxy

.\nssm.exe install $KubeProxySvc C:\k\kube-proxy.exe

.\nssm.exe set $KubeProxySvc AppDirectory c:\k

GetSourceVip -ipAddress -NetworkName $NetworkName

$sourceVipJSON = Get-Content sourceVip.json | ConvertFrom-Json

$sourceVip = $sourceVipJSON.ip4.ip.Split("/")[0]

.\nssm.exe set $KubeProxySvc AppParameters --v=4 --proxy-mode=kernelspace --feature-gates="WinOverlay=true" --hostname-override=$Hostname --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip=$sourceVip --enable-dsr=false --cluster-cidr=$ClusterCIDR --log-dir=$LogDir --logtostderr=false

.\nssm.exe set $KubeProxySvc DependOnService $KubeletSvc

.\nssm.exe start $KubeProxySvc

To verify that you have successfully started kubelet and kubeproxy services on your Windows node, use the following command:

Get-Service kube*

You should see an output like this:

terminal output

Now when you run kubectl get nodes on your Ubuntu 18.09 master node, you should see a new Windows node added:

terminal output

To set the role for your worker node, use the following command:

sudo kubectl label node w-node1

terminal output

Now you’re all set up.

Happy Hosting!

The Author

Maab S.

Maab is an experienced software engineer who specializes in explaining technical topics to a wider audience.

More posts from Maab

Related posts