How to setup multinode Kubernetes cluster on centos kvm VMs using kubeadmin and ansible automation

How to deploy multinode Kubernetes cluster on centos using kubeadmin and ansible automation

1) Pre-Requisites

    ===> A Linux management node is needed to operate on. It can be ubuntu, centos7 or rhel7 
    ===> Management node should have kvm virtualization enabled and properly configured.

2) Software requirements

    ===> Ansible and python3 should be instaled on management node
    ===> Download minimal centos 7.x and rename it to centos.iso.Place centos.iso in /var/lib/libvirt/images/ directory on
         management node. Optionally, below command can be used: 
    
         wget -O /var/lib/libvirt/images/centos.iso --continue http://mirror.vanehost.com/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso


3) Cluster node sizing:
    
    ===> Master node:
    
              ===> RAM : 2GB
              ===> vCPU: 2
              ===> DISK: 30GB
              
    ===> Two Worker nodes:
    
              ===> RAM : 1GB
              ===> vCPU: 1
              ===> DISK: 10GB
    

4) Procedure:
    
   ===> Clone this code on management node:
   
        git clone git@github.com:udautkarsh/automation.git

   ===> Navigate to directory "automation/kubernetes/centos" and trigger playbook
        
        cd automation/kubernetes/centos
        ansible-playbook -i hosts create.yaml

5) Execution console logs:

        root@bastion:/home/uday/kubernetes/kubernetes/centos# ansible-playbook -i hosts create.yaml
        PLAY [localhost] **************************************************************************************************************************************************************************************************
        TASK [deploy-vm : Check if nodes are deployed] ********************************************************************************************************************************************************************
        changed: [localhost]
        TASK [deploy-vm : debug] ******************************************************************************************************************************************************************************************
        ok: [localhost] => {
        "msg": "All VMs are ==> [u'kube-master', u'kube-worker1', u'docker', u'helper', u'kube-rh-master', u'kube-rh-worker0', u'kube-rh-worker1', u'kube-worker0', u'node-bootstrap', u'node-master-0', u'node-master-1', u'node-master-2', u'node-worker-0', u'node-worker-1', u'node-worker-2', u'ocp-infra', u'ocp-lb-ext', u'ocp-lb-int', u'ocp-registry']"
        }
        TASK [deploy-vm : deploying kube master node] *********************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : waiting for master node to deploy] **************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : deploying kube worker-0 node] *******************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : waiting for worker-0 node to deploy] ************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : deploying kube worker-1  node] ******************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : waiting for worker-1 node to deploy] ************************************************************************************************************************************************************
        skipping: [localhost]

        TASK [deploy-vm : Fetch all running domains] **********************************************************************************************************************************************************************
        changed: [localhost]

        TASK [deploy-vm : debug] ******************************************************************************************************************************************************************************************
        ok: [localhost] => {
            "msg": "All running VMs are ==> [u'kube-master', u'kube-worker1']"
        }

        TASK [deploy-vm : starting nodes if not started already] **********************************************************************************************************************************************************
        skipping: [localhost] => (item=kube-master) 
        changed: [localhost] => (item=kube-worker0)
        skipping: [localhost] => (item=kube-worker1) 

        TASK [deploy-vm : waiting for nodes to start] *********************************************************************************************************************************************************************
        Pausing for 20 seconds
        (ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
        ok: [localhost]

        PLAY [localhost] **************************************************************************************************************************************************************************************************

        TASK [prepare : Generating ssh keys] ******************************************************************************************************************************************************************************
        ok: [localhost]

        TASK [prepare : deleting known-hosts file] ************************************************************************************************************************************************************************
        ok: [localhost]

        TASK [prepare : Copying public keys to nodes] *********************************************************************************************************************************************************************
        changed: [localhost] => (item=192.168.122.201)
        changed: [localhost] => (item=192.168.122.202)
        changed: [localhost] => (item=192.168.122.200)

        PLAY [masters] ****************************************************************************************************************************************************************************************************

        TASK [master : copying kubernetes.repo files] *********************************************************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : adjust modprobe br_netfilter] **********************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Letting iptables see bridged traffic] **************************************************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : Reloading sysctl] **********************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Open up firewall ports] ****************************************************************************************************************************************************************************
        ok: [192.168.122.200] => (item=6443/tcp)
        ok: [192.168.122.200] => (item=2379-2380/tcp)
        ok: [192.168.122.200] => (item=10250-20252/tcp)

        TASK [master : disable swap memory (1/2)] *************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Disable SWAP in fstab (2/2)] ***********************************************************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : adjuts net bridge nf call iptables] ****************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Install kubeadm and docker] ************************************************************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : Starting services] *********************************************************************************************************************************************************************************
        ok: [192.168.122.200] => (item=kubelet)
        ok: [192.168.122.200] => (item=docker)

        TASK [master : Put SELinux in permissive mode, logging actions that would be blocked.] ****************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : Check if master cluster initialization has already been done] **************************************************************************************************************************************
        ok: [192.168.122.200]

        TASK [master : Initialize master with kubeadm init] ***************************************************************************************************************************************************************
        skipping: [192.168.122.200]

        TASK [master : Remove .kube directory if present] *****************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : making .kube dir] **********************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : copying credentials file in .kube] *****************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Adjusting owenership] ******************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : restore file(s) default SELinux security contexts] *************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : get status of cluster] *****************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : debug] *********************************************************************************************************************************************************************************************
        ok: [192.168.122.200] => {
            "msg": [
                "NAME               STATUS   ROLES    AGE     VERSION", 
                "kmaster.lab.com    Ready    master   72m     v1.18.2", 
                "kworker0.lab.com   Ready    <none>   8m32s   v1.18.2", 
                "kworker1.lab.com   Ready    <none>   57m     v1.18.2"
            ]
        }

        TASK [master : waiting for pods to comeup] ************************************************************************************************************************************************************************
        Pausing for 60 seconds
        (ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
        ok: [192.168.122.200]

        TASK [master : Cluster pods status] *******************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : debug] *********************************************************************************************************************************************************************************************
        ok: [192.168.122.200] => {
            "msg": [
                "NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE", 
                "kube-system   coredns-66bff467f8-lzxb4                  1/1     Running   0          73m", 
                "kube-system   coredns-66bff467f8-p4k5k                  1/1     Running   0          73m", 
                "kube-system   etcd-kmaster.lab.com                      1/1     Running   0          73m", 
                "kube-system   kube-apiserver-kmaster.lab.com            1/1     Running   0          73m", 
                "kube-system   kube-controller-manager-kmaster.lab.com   1/1     Running   0          73m", 
                "kube-system   kube-proxy-lxmmt                          1/1     Running   2          9m33s", 
                "kube-system   kube-proxy-m6sh2                          1/1     Running   0          73m", 
                "kube-system   kube-proxy-xwsdx                          1/1     Running   0          58m", 
                "kube-system   kube-scheduler-kmaster.lab.com            1/1     Running   0          73m", 
                "kube-system   weave-net-4vnt6                           2/2     Running   0          58m", 
                "kube-system   weave-net-m9k49                           2/2     Running   3          9m33s", 
                "kube-system   weave-net-nc2kl                           2/2     Running   0          72m"
            ]
        }

        TASK [master : Installing a Pod network add-on] *******************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : Cluster pods status] *******************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [master : debug] *********************************************************************************************************************************************************************************************
        ok: [192.168.122.200] => {
            "msg": [
                "NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE", 
                "kube-system   coredns-66bff467f8-lzxb4                  1/1     Running   0          73m", 
                "kube-system   coredns-66bff467f8-p4k5k                  1/1     Running   0          73m", 
                "kube-system   etcd-kmaster.lab.com                      1/1     Running   0          73m", 
                "kube-system   kube-apiserver-kmaster.lab.com            1/1     Running   0          73m", 
                "kube-system   kube-controller-manager-kmaster.lab.com   1/1     Running   0          73m", 
                "kube-system   kube-proxy-lxmmt                          1/1     Running   2          9m36s", 
                "kube-system   kube-proxy-m6sh2                          1/1     Running   0          73m", 
                "kube-system   kube-proxy-xwsdx                          1/1     Running   0          58m", 
                "kube-system   kube-scheduler-kmaster.lab.com            1/1     Running   0          73m", 
                "kube-system   weave-net-4vnt6                           2/2     Running   0          58m", 
                "kube-system   weave-net-m9k49                           2/2     Running   3          9m36s", 
                "kube-system   weave-net-nc2kl                           2/2     Running   0          72m"
            ]
        }

        PLAY [masters] ****************************************************************************************************************************************************************************************************

        TASK [command] ****************************************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [Store node join command] ************************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        PLAY [localhost] **************************************************************************************************************************************************************************************************

        TASK [debug] ******************************************************************************************************************************************************************************************************
        ok: [localhost] => {
            "msg": [
                "kubeadm join 192.168.122.200:6443 --token ir1wno.cgv0jv349j3znucq     --discovery-token-ca-cert-hash sha256:ca7e1de862b669fa635a8d57593a4cddcee87f0c21521fa887d1db04c6118acc "
            ]
        }

        PLAY [workers] ****************************************************************************************************************************************************************************************************

        TASK [worker : copying kubernetes.repo files] *********************************************************************************************************************************************************************
        ok: [192.168.122.201]
        ok: [192.168.122.202]

        TASK [worker : adjust modprobe br_netfilter] **********************************************************************************************************************************************************************
        changed: [192.168.122.201]
        changed: [192.168.122.202]

        TASK [worker : adjuts net bridge nf call iptables] ****************************************************************************************************************************************************************
        changed: [192.168.122.201]
        changed: [192.168.122.202]

        TASK [worker : Letting iptables see bridged traffic] **************************************************************************************************************************************************************
        ok: [192.168.122.201]
        ok: [192.168.122.202]

        TASK [worker : Reloading sysctl] **********************************************************************************************************************************************************************************
        changed: [192.168.122.201]
        changed: [192.168.122.202]

        TASK [worker : Open up firewall ports] ****************************************************************************************************************************************************************************
        ok: [192.168.122.201] => (item=30000-32767/tcp)
        ok: [192.168.122.202] => (item=30000-32767/tcp)
        ok: [192.168.122.201] => (item=10250/tcp)
        ok: [192.168.122.202] => (item=10250/tcp)

        TASK [worker : disable swap memory (1/2)] *************************************************************************************************************************************************************************
        changed: [192.168.122.202]
        changed: [192.168.122.201]

        TASK [worker : Disable SWAP in fstab (2/2)] ***********************************************************************************************************************************************************************
        ok: [192.168.122.201]
        ok: [192.168.122.202]

        TASK [worker : Put SELinux in permissive mode, logging actions that would be blocked.] ****************************************************************************************************************************
        ok: [192.168.122.201]
        ok: [192.168.122.202]

        TASK [worker : Install kubeadm and docker] ************************************************************************************************************************************************************************
        ok: [192.168.122.202]
        ok: [192.168.122.201]

        TASK [worker : Starting services] *********************************************************************************************************************************************************************************
        ok: [192.168.122.201] => (item=kubelet)
        ok: [192.168.122.202] => (item=kubelet)
        ok: [192.168.122.202] => (item=docker)
        ok: [192.168.122.201] => (item=docker)

        TASK [worker : Check if this worker node is joined already] *******************************************************************************************************************************************************
        ok: [192.168.122.201]
        ok: [192.168.122.202]

        TASK [worker : debug] *********************************************************************************************************************************************************************************************
        ok: [192.168.122.201] => {
            "msg": "kubeadm join 192.168.122.200:6443 --token ir1wno.cgv0jv349j3znucq     --discovery-token-ca-cert-hash sha256:ca7e1de862b669fa635a8d57593a4cddcee87f0c21521fa887d1db04c6118acc "
        }
        ok: [192.168.122.202] => {
            "msg": "kubeadm join 192.168.122.200:6443 --token ir1wno.cgv0jv349j3znucq     --discovery-token-ca-cert-hash sha256:ca7e1de862b669fa635a8d57593a4cddcee87f0c21521fa887d1db04c6118acc "
        }

        TASK [worker : joining to the master] *****************************************************************************************************************************************************************************
        skipping: [192.168.122.201]
        skipping: [192.168.122.202]

        PLAY [masters] ****************************************************************************************************************************************************************************************************

        TASK [shell] ******************************************************************************************************************************************************************************************************
        changed: [192.168.122.200]

        TASK [Cluster status after worker nodes are added, note ==> worker nodes might take a while to come to Ready state] ***********************************************************************************************
        ok: [192.168.122.200] => {
            "msg": [
                "NAME               STATUS   ROLES    AGE     VERSION", 
                "kmaster.lab.com    Ready    master   73m     v1.18.2", 
                "kworker0.lab.com   Ready    <none>   9m41s   v1.18.2", 
                "kworker1.lab.com   Ready    <none>   58m     v1.18.2"
            ]
        }

        PLAY RECAP ********************************************************************************************************************************************************************************************************
        192.168.122.200            : ok=29   changed=16   unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
        192.168.122.201            : ok=13   changed=4    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
        192.168.122.202            : ok=13   changed=4    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
        localhost                  : ok=10   changed=4    unreachable=0    failed=0    skipped=6    rescued=0    ignored=0   

Comments