# Deploy Generic Kubernetes The instructions outlined below assume you are deploying the environment using Ansible Playbooks either via Ansible's CLI or AWX. ### Deploy K8S User ```jsx title="01-deploy-k8s-user.yml" - hosts: 'controller-nodes, worker-nodes' become: yes tasks: - name: create the k8sadmin user account user: name=k8sadmin append=yes state=present createhome=yes shell=/bin/bash - name: allow 'k8sadmin' to use sudo without needing a password lineinfile: dest: /etc/sudoers line: 'k8sadmin ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s' - name: set up authorized keys for the k8sadmin user authorized_key: user=k8sadmin key="{{item}}" with_file: - ~/.ssh/id_rsa.pub ``` ### Install K8S ```jsx title="02-install-k8s.yml" --- - hosts: "controller-nodes, worker-nodes" remote_user: nicole become: yes become_method: sudo become_user: root gather_facts: yes connection: ssh tasks: - name: Create containerd config file file: path: "/etc/modules-load.d/containerd.conf" state: "touch" - name: Add conf for containerd blockinfile: path: "/etc/modules-load.d/containerd.conf" block: | overlay br_netfilter - name: modprobe shell: | sudo modprobe overlay sudo modprobe br_netfilter - name: Set system configurations for Kubernetes networking file: path: "/etc/sysctl.d/99-kubernetes-cri.conf" state: "touch" - name: Add conf for containerd blockinfile: path: "/etc/sysctl.d/99-kubernetes-cri.conf" block: | net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 - name: Apply new settings command: sudo sysctl --system - name: install containerd shell: | sudo apt-get update && sudo apt-get install -y containerd sudo mkdir -p /etc/containerd sudo containerd config default | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd - name: disable swap shell: | sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab - name: install and configure dependencies shell: | sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - - name: Create kubernetes repo file file: path: "/etc/apt/sources.list.d/kubernetes.list" state: "touch" - name: Add K8s Source blockinfile: path: "/etc/apt/sources.list.d/kubernetes.list" block: | deb https://apt.kubernetes.io/ kubernetes-xenial main - name: Install Kubernetes shell: | sudo apt-get update sudo apt-get install -y kubelet=1.20.1-00 kubeadm=1.20.1-00 kubectl=1.20.1-00 sudo apt-mark hold kubelet kubeadm kubectl ``` ### Configure ControlPlanes ```jsx title="03-configure-controllers.yml" - hosts: controller-nodes become: yes tasks: - name: Initialize the K8S Cluster shell: kubeadm init --pod-network-cidr=10.244.0.0/16 args: chdir: $HOME creates: cluster_initialized.txt - name: Create .kube directory become: yes become_user: k8sadmin file: path: /home/k8sadmin/.kube state: directory mode: 0755 - name: Copy admin.conf to user's kube config copy: src: /etc/kubernetes/admin.conf dest: /home/k8sadmin/.kube/config remote_src: yes owner: k8sadmin - name: Install the Pod Network become: yes become_user: k8sadmin shell: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml args: chdir: $HOME - name: Get the token for joining the worker nodes become: yes become_user: k8sadmin shell: kubeadm token create --print-join-command register: kubernetes_join_command - name: Output Join Command to the Screen debug: msg: "{{ kubernetes_join_command.stdout }}" - name: Copy join command to local file. become: yes local_action: copy content="{{ kubernetes_join_command.stdout_lines[0] }}" dest="/tmp/kubernetes_join_command" mode=0777 ``` ### Join Worker Node(s) ```jsx title="04-join-worker-nodes.yml" - hosts: worker-nodes become: yes gather_facts: yes tasks: - name: Copy join command from Ansible host to the worker nodes. become: yes copy: src: /tmp/kubernetes_join_command dest: /tmp/kubernetes_join_command mode: 0777 - name: Join the Worker nodes to the cluster. become: yes command: sh /tmp/kubernetes_join_command register: joined_or_not ``` ### Host Inventory File Template ```jsx title="hosts" [controller-nodes] k8s-ctrlr-01 ansible_host=192.168.3.6 ansible_user=nicole [worker-nodes] k8s-node-01 ansible_host=192.168.3.4 ansible_user=nicole k8s-node-02 ansible_host=192.168.3.5 ansible_user=nicole [all:vars] ansible_become_user=root ansible_become_method=sudo ```