HowTo Install Kubernetes Cluster with Kubespray
Created on Jan 20, 2020
Introduction
This document describes how to install Kubernetes(K8s) cluster with kubespray.
This guide assumes the following:
Hardware
All servers used during deployment have the same hardware specification and are equipped with a Mellanox ConnectX network card.Software
Ubuntu Server 18.04 operating system is installed on all servers with OpenSSH server packages.Network
DHCP server and DNS server is part of the IT infrastructure.
For each server, the server's name and IP address are reserved on the DHCP server.
All servers used in our deployment are connected to an Ethernet switch by single 100GbE Ethernet copper cable and have Internet access.
This deployment is HW independent, and we use NVIDIA gears as an example.
References
Solution Overview
Equipment
For K8s cluster deployment, you should use the same type of servers.
For additional info please refer to Kubespray Requirements.
Solution Logical Design
The MGMT node is only used to deploy a K8s cluster through Node1-Node5.

Network Configuration
Server names with network configurations are provided in the below table:

Host Configuration
Ubuntu Server 18.04 operating system is installed on all servers with OpenSSH server packages.
Please update/upgrade Ubuntu software packages and install the latest HWE kernel by running the below commands:
Server console
# apt-get update
# apt-get -y install linux-image-generic-hwe-18.04
# reboot
Deployment Guide
K8s Cluster Deployment and Configuration
SSH Private Key and SSH Passwordless Login
Please login to the Management server as root user and create SSH private key for configuring the password-less authentication on your computer by running the following command:
# ssh-keygen
Copy your SSH private key , such as ~/.ssh/id_rsa , to all nodes in your deployment by running the following command:
# ssh-copy-id root@nodename
Kubespray Configuration
Please install dependencies for running Kubespray with Ansible on the Management server:
# cd ~
# apt -y install python3-pip
# git clone https://github.com/kubernetes-sigs/kubespray.git
# cd kubespray
# pip3 install -r requirements.txt
Create new cluster configuration:
# cp -rfp inventory/sample inventory/mycluster
# declare -a IPS=(192.168.222.111 192.168.222.101 192.168.222.102 192.168.222.103 192.168.222.104)
# CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Review and change the host configuration file - inventory/mycluster/hosts.yaml.
Example:
inventory/mycluster/hosts.yaml
all:
hosts:
node1:
ansible_host: 192.168.222.111
ip: 192.168.222.111
access_ip: 192.168.222.111
node2:
ansible_host: 192.168.222.101
ip: 192.168.222.101
access_ip: 192.168.222.101
node3:
ansible_host: 192.168.222.102
ip: 192.168.222.102
access_ip: 192.168.222.102
node4:
ansible_host: 192.168.222.103
ip: 192.168.222.103
access_ip: 192.168.222.103
node5:
ansible_host: 192.168.222.104
ip: 192.168.222.104
access_ip: 192.168.222.104
children:
kube-master:
hosts:
node1:
kube-node:
hosts:
node2:
node3:
node4:
node5:
etcd:
hosts:
node1:
k8s-cluster:
children:
kube-master:
kube-node:
calico-rr:
hosts:
Review and change cluster installation parameters under inventory/mycluster/group_vars:
# cat inventory/mycluster/group_vars/all/all.yml
# cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
The default Kubernetes CNI can be changed by setting the desired kube_network_plugin value parameter in inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml.
Install K8s Cluster Using Ansible Playbook
Deploy K8s cluster with Kubespray Ansible Playbook:
# ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
The execution time for this step may take a while to finalize.
Example of a successful completion of the playbooks:
...
PLAY RECAP *********************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
node1 : ok=611 changed=137 unreachable=0 failed=0
node2 : ok=442 changed=92 unreachable=0 failed=0
node3 : ok=404 changed=88 unreachable=0 failed=0
node4 : ok=404 changed=88 unreachable=0 failed=0
node5 : ok=404 changed=88 unreachable=0 failed=0
Wednesday 15 January 2020 10:39:14 +0200 (0:00:00.164) 0:16:20.903 *****
===============================================================================
container-engine/docker : ensure docker packages are installed --------------------------------------------------------------------------------------------------------------------- 65.67s
download : download_file | Download item ------------------------------------------------------------------------------------------------------------------------------------------- 53.43s
download : download_file | Download item ------------------------------------------------------------------------------------------------------------------------------------------- 50.71s
kubernetes/master : kubeadm | Initialize first master ------------------------------------------------------------------------------------------------------------------------------ 45.96s
kubernetes/kubeadm : Join to cluster ----------------------------------------------------------------------------------------------------------------------------------------------- 42.65s
download : download_file | Download item ------------------------------------------------------------------------------------------------------------------------------------------- 28.74s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 27.37s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 22.59s
kubernetes/master : Master | wait for kube-scheduler ------------------------------------------------------------------------------------------------------------------------------- 22.41s
bootstrap-os : Install python ------------------------------------------------------------------------------------------------------------------------------------------------------ 18.72s
kubernetes/preinstall : Install packages requirements ------------------------------------------------------------------------------------------------------------------------------ 15.50s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 14.98s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 12.85s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 12.33s
download : download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------- 12.08s
download : download_container | Download image if required -------------------------------------------------------------------------------------------------------------------------- 9.86s
download : download_file | Download item -------------------------------------------------------------------------------------------------------------------------------------------- 9.61s
etcd : wait for etcd up ------------------------------------------------------------------------------------------------------------------------------------------------------------- 8.91s
container-engine/docker : ensure docker-ce repository is enabled -------------------------------------------------------------------------------------------------------------------- 8.81s
bootstrap-os : Install dbus for the hostname module --------------------------------------------------------------------------------------------------------------------------------- 7.98s
Deployment Verification
Verify that the Kubernetes cluster is running by executing the following command on the K8s Master Node:
root@node1:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node1 Ready master 4h v1.16.3 192.168.222.111 <none> Ubuntu 18.04.3 LTS 5.0.0-37-generic docker://18.9.7
node2 Ready <none> 4h v1.16.3 192.168.222.101 <none> Ubuntu 18.04.3 LTS 5.0.0-37-generic docker://18.9.7
node3 Ready <none> 4h v1.16.3 192.168.222.102 <none> Ubuntu 18.04.3 LTS 5.0.0-37-generic docker://18.9.7
node4 Ready <none> 4h v1.16.3 192.168.222.103 <none> Ubuntu 18.04.3 LTS 5.0.0-37-generic docker://18.9.7
node5 Ready <none> 4h v1.16.3 192.168.222.104 <none> Ubuntu 18.04.3 LTS 5.0.0-37-generic docker://18.9.7
Done!
Related Documents