Provisioning Kubernetes cluster using Ansible and Kubespray

Kubespray is a collection of Ansible Playbooks, inventory and provisioning tools.

Here, we are going to use below 3 VMs to set up Kubernetes cluster,

1) Ansible Controller Machine -> ansible-controller / 192.168.0.37
2) Kubernetes master -> kube-master-1 / 192.168.0.38
3) Kubernetes node -> cent7-node-1 / 192.168.0.36

Requirements for Ansible Controller Machine:

Following needs to installed in Ansible controller machine with latest version,
Ansible
Jinja2-2.10
python-netaddr

Anisble has been installed with below version

[root@ansible-controller ~]# ansible --version
ansible 2.5.5
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
[root@ansible-controller ~]#

Ansible Configuration:

[ansible@ansible-controller ~]$ cat ansible.cfg | grep -v ^#
[defaults]
inventory = /home/ansible/hosts
remote_user = ansible
[inventory]
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
[ansible@ansible-controller ~]$

Installing ‘python-netaddr’ in Ansible controller machine:

[root@ansible-controller ~]# pip install netaddr
Collecting netaddr
Downloading https://files.pythonhosted.org/packages/ba/97/ce14451a9fd7bdb5a397abf99b24a1a6bb7a1a440b019bebd2e9a0dbec74/netaddr-0.7.19-py2.py3-none-any.whl (1.6MB)
100% |████████████████████████████████| 1.6MB 12.5MB/s
Installing collected packages: netaddr
Successfully installed netaddr-0.7.19
[root@ansible-controller ~]# 

Please make sure, managed nodes are reachable from Ansible controller machine as below,’

[ansible@ansible-controller ~]$ ansible -m ping all
cent7-node-1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
kube-master-1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[ansible@ansible-controller ~]$ 

Download kubespray:

wget https://github.com/kubernetes-incubator/kubespray/archive/v2.5.0.tar.gz

[ansible@ansible-controller ~]$ tar -zxvf v2.5.0.tar.gz

[ansible@ansible-controller ~]$ ls
ansible.cfg hosts install_docker.yml kubespray-2.5.0 v2.5.0.tar.gz
[ansible@ansible-controller ~]$

[ansible@ansible-controller inventory]$ pwd
/home/ansible/kubespray-2.5.0/inventory
[ansible@ansible-controller inventory]$ ls
local sample
[ansible@ansible-controller inventory]$ cp -rf sample/* /home/ansible/inventory/k8ssetup/
[ansible@ansible-controller inventory]$

[ansible@ansible-controller k8ssetup]$ pwd
/home/ansible/inventory/k8ssetup
[ansible@ansible-controller k8ssetup]$ ls
group_vars hosts.ini
[ansible@ansible-controller k8ssetup]$

Edit the hosts.ini file as bleow,

[ansible@ansible-controller k8ssetup]$ cat hosts.ini | grep -v ^#
kube-master-1 ansible_ssh_host=192.168.0.38
cent7-node-1 ansible_ssh_host=192.168.0.36

[kube-master]
kube-master-1

[etcd]
kube-master-1

[kube-node]
cent7-node-1

[k8s-cluster:children]
kube-master
kube-node
[ansible@ansible-controller k8ssetup]$

Checking the connectivity as below,

ansible -i /home/ansible/inventory/k8ssetup/hosts.ini -m ping all

[ansible@ansible-controller group_vars]$ pwd
/home/ansible/inventory/k8ssetup/group_vars
[ansible@ansible-controller group_vars]$

Under group_vars, edit the ‘all.yml’ file according to our requirements as below,

[ansible@ansible-controller group_vars]$ cat all.yml | grep -v ^#
bootstrap_os: centos

etcd_data_dir: /var/lib/etcd

bin_dir: /usr/local/bin
[ansible@ansible-controller group_vars]$

Note: SWAP needs to be disabled in managed nodes for k8s setup,

[root@cent7-node-1 ~]# free -m
total used free shared buff/cache available
Mem: 1595 145 1215 8 235 1281
Swap: 819 0 819
[root@cent7-node-1 ~]# swapoff -a
[root@cent7-node-1 ~]# free -m
total used free shared buff/cache available
Mem: 1595 146 1214 8 234 1280
Swap: 0 0 0
[root@cent7-node-1 ~]# 

Now we can execute anible playbook ‘/home/ansible/kubespray-2.5.0/cluster.yml’ to set up kubernetes cluster,

ansible-playbook -b -i /home/ansible/inventory/k8ssetup/hosts.ini cluster.yml

PLAY RECAP *********************************************************************************************************
cent7-node-1 : ok=211 changed=26 unreachable=0 failed=0
kube-master-1 : ok=317 changed=47 unreachable=0 failed=0
localhost : ok=2 changed=0 unreachable=0 failed=0

Monday 13 August 2018 02:21:56 -0400 (0:00:00.037) 0:06:47.708 *********
=============================================================================

[root@kube-master-1 ~]# kubectl version --short
Client Version: v1.9.5
Server Version: v1.9.5
[root@kube-master-1 ~]#

Ref. URL:
https://github.com/kubernetes-incubator/kubespray
https://kubernetes.io/docs/setup/custom-cloud/kubespray/

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: