diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..366cdd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +playbook/* diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..47a6ef8 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,2 @@ +--- +k8s_version: "1.22" diff --git a/requirements.yml b/requirements.yml new file mode 100644 index 0000000..6ba155c --- /dev/null +++ b/requirements.yml @@ -0,0 +1,4 @@ +--- +- src: git+https://git.shnee.net/shnee/docker-ansible.git + name: install_docker + version: master diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..35f69b3 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,193 @@ +--- +# https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker +- name: Install docker daemon config. + template: + src: docker-daemon-config.json + dest: /etc/docker/daemon.json + mode: 0644 + become: true + register: docker_daemon_config + # TODO REM remove if not needed, also remove the handler. + # notify: Restart docker + +- name: Restart docker service if needed. + systemd: + state: restarted + name: docker + daemon_reload: true + enabled: true + become: true + when: docker_daemon_config.changed + +- name: Install kubectl dependencies. + package: + name: + - apt-transport-https + - ca-certificates + - curl + state: present + become: true + when: ansible_os_family == "Debian" +- name: Add GPG key to apt for Ubuntu. + apt_key: + url: https://packages.cloud.google.com/apt/doc/apt-key.gpg + id: 59FE0256827269DC81578F928B57C5C2836F4BEB + state: present + become: true +- name: Add k8s repository for Debian-like distro. + apt_repository: + repo: "deb https://apt.kubernetes.io/ kubernetes-xenial main" + state: present + update_cache: true + become: true +- name: Add k8s apt preferences file to pin a version. + template: + src: apt-preferences-k8s.j2 + dest: /etc/apt/preferences.d/kubernetes + mode: 0644 + become: true + when: ansible_os_family == "Debian" +- name: Install kubectl. + package: + name: + - kubectl + - kubeadm + - kubelet + state: present + become: true + when: ansible_os_family == "Debian" + +################################################################################ +# sysctl stuff +# https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#letting-iptables-see-bridged-traffic +################################################################################ + +- name: Force kernel modules to load. + copy: + dest: /etc/modules-load.d/k8s.conf + content: br_netfilter + mode: 0644 + become: true + +- name: Let iptables see bridged traffic. + sysctl: + name: "{{ item }}" + value: '1' + state: present + become: true + loop: + - net.bridge.bridge-nf-call-iptables + - net.bridge.bridge-nf-call-ip6tables + when: ansible_os_family == "Debian" + +################################################################################ + +- name: Ensure kubelet is started and enabled at boot. + service: + name: kubelet + state: started + enabled: true + become: true + +################################################################################ + +- name: Get swap status. + command: swapon -s + changed_when: false + register: swap_status +- name: Disable swap if needed. + command: swapoff -a + become: true + changed_when: true + when: swap_status.stdout | length > 0 +- name: comment out swap in fstab. + replace: + path: /etc/fstab + regexp: '^([^#].*swap.*)$' + replace: '# \1' + become: true + +################################################################################ +# master +################################################################################ + +- name: Initialize Kubernetes master with kubeadm init + command: + cmd: kubeadm init --pod-network-cidr=10.10.0.0/16 + creates: /etc/kubernetes/admin.conf + become: true + # TODO REM do we need this register? + register: kubeadmin_init + ignore_errors: true + when: kubernetes_role == 'master' + +- name: Debug kubectl init. + debug: + var: kubeadmin_init + when: kubernetes_role == 'master' + +# TODO REM find a way to copy this file to local machine. +- name: Ensure .kube directory exists. + file: + path: ~/.kube + state: directory + mode: 0700 + when: kubernetes_role == 'master' + +- name: Copy the kubectl admin.conf to ~/.kube/conf. + copy: + src: /etc/kubernetes/admin.conf + remote_src: true + dest: "/home/{{ ansible_user }}/.kube/config" + mode: 0600 + owner: "{{ ansible_user }}" + become: true + when: kubernetes_role == 'master' + +################################################################################ +# Join nodes to cluster. +################################################################################ + +- name: Get the kubeadm join command from the Kubernetes master. + command: kubeadm token create --print-join-command + changed_when: false + when: kubernetes_role == 'master' + register: kubernetes_join_command_result + +- name: debug + debug: + var: kubernetes_join_command_result + +# This is not how we want to do this just grab the join command from a mater no +# need to set a fact. +- name: Set the kubeadm join command globally. + set_fact: + kubernetes_join_command: "{{ kubernetes_join_command_result.stdout }}" + when: kubernetes_join_command_result.stdout is defined + delegate_to: "{{ item }}" + delegate_facts: true + with_items: "{{ groups['all'] }}" + +- name: Join node to cluster. + command: + cmd: "{{ kubernetes_join_command }}" + creates: /etc/kubernetes/kubelet.conf + become: true + when: kubernetes_role == 'worker' + +################################################################################ +# calico +################################################################################ + +- name: Check if calico is already deployed by getting all pods. + command: kubectl get pods --all-namespaces + ignore_errors: true + changed_when: false + register: pods + when: kubernetes_role == 'master' + +- name: Deploy Calico if not already installed. + command: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml + register: calico_result + changed_when: "'created' in calico_result.stdout" + when: kubernetes_role == 'master' and 'calico' not in pods.stdout diff --git a/templates/apt-preferences-k8s.j2 b/templates/apt-preferences-k8s.j2 new file mode 100644 index 0000000..7709524 --- /dev/null +++ b/templates/apt-preferences-k8s.j2 @@ -0,0 +1,11 @@ +Package: kubectl +Pin: version {{ k8s_version }}.* +Pin-Priority: 1000 + +Package: kubeadm +Pin: version {{ k8s_version }}.* +Pin-Priority: 1000 + +Package: kubelet +Pin: version {{ k8s_version }}.* +Pin-Priority: 1000 diff --git a/templates/docker-daemon-config.json b/templates/docker-daemon-config.json new file mode 100644 index 0000000..5d18abc --- /dev/null +++ b/templates/docker-daemon-config.json @@ -0,0 +1,8 @@ +{ + "exec-opts": ["native.cgroupdriver=systemd"], + "log-driver": "json-file", + "log-opts": { + "max-size": "100m" + }, + "storage-driver": "overlay2" +}