diff --git a/roles/kubernetes/tasks/Debian.yml b/roles/kubernetes/tasks/Debian.yml new file mode 100644 index 0000000..b17114e --- /dev/null +++ b/roles/kubernetes/tasks/Debian.yml @@ -0,0 +1,266 @@ +- name: Install Kubernetes on Ubuntu 24 + become: "{{ 'no' if inventory_hostname == 'nas.home.lan' else 'yes' }}" + block: + - name: Create apt proxy file + ansible.builtin.copy: + dest: /etc/apt/apt.conf.d/02proxy + content: | + Acquire::http::Proxy "http://192.168.77.101:3142"; + Acquire::https::Proxy "false"; + + - name: Remove multiple files + file: + path: "{{ item }}" + state: absent + loop: + - /etc/apt/sources.list.d/docker.list + - /etc/apt/keyrings/docker.gpg + - /etc/apt/trusted.gpg.d/containerd.gpg + - /etc/apt/trusted.gpg.d/docker.gpg + - name: Update apt cache + apt: + update_cache: yes + + - name: Disable swap + command: swapoff -a + when: ansible_swaptotal_mb > 0 + + - name: Remove swap from fstab + replace: + path: /etc/fstab + regexp: '.*swap.*' + replace: '' + + - name: Enable kernel modules + copy: + dest: /etc/modules-load.d/k8s.conf + content: | + overlay + br_netfilter + + - name: Load kernel modules + modprobe: + name: "{{ item }}" + state: present + loop: + - overlay + - br_netfilter + + - name: Set sysctl params + copy: + dest: /etc/sysctl.d/k8s.conf + content: | + net.bridge.bridge-nf-call-iptables = 1 + net.bridge.bridge-nf-call-ip6tables = 1 + net.ipv4.ip_forward = 1 + + - name: Apply sysctl + command: sysctl --system + + - name: Install required packages + apt: + name: + - apt-transport-https + - ca-certificates + - curl + - gpg + - curl + - gnupg2 + - software-properties-common + state: present + + - name: Remove old Docker repository files (if any) + file: + path: "{{ item }}" + state: absent + loop: + - /etc/apt/sources.list.d/docker.list + - /etc/apt/keyrings/docker.gpg + - /etc/apt/trusted.gpg.d/containerd.gpg + + - name: Create keyrings directory + file: + path: /etc/apt/keyrings + state: directory + mode: '0755' + + - name: Download Docker GPG key + shell: | + curl -fsSL https://download.docker.com/linux/debian/gpg | \ + sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + + - name: Add Docker repository source file + ansible.builtin.copy: + dest: /etc/apt/sources.list.d/docker.sources + mode: '0644' + content: | + Types: deb + URIs: https://download.docker.com/linux/debian + Suites: {{ ansible_distribution_release }} + Components: stable + Architectures: {{ 'amd64' if ansible_architecture == 'x86_64' else ansible_architecture }} + Signed-By: /etc/apt/keyrings/docker.asc + + - name: Update apt cache + apt: + update_cache: yes + - name: Install required packages + apt: + name: + - containerd.io + state: present + update_cache: yes + + - name: Generate default containerd config + command: containerd config default + register: containerd_config + + - name: Save containerd configuration + copy: + dest: /etc/containerd/config.toml + content: "{{ containerd_config.stdout }}" + owner: root + group: root + mode: 0644 + - name: Enable SystemdCgroup in containerd config + replace: + path: /etc/containerd/config.toml + regexp: 'SystemdCgroup\s*=\s*false' + replace: 'SystemdCgroup = true' + + - name: Restart containerd + systemd: + name: containerd + state: restarted + enabled: yes + + - name: Add Kubernetes GPG key + ansible.builtin.apt_key: + url: https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key + keyring: /etc/apt/keyrings/k8s.gpg + state: present + + - name: Add Kubernetes repository + copy: + dest: /etc/apt/sources.list.d/k8s.list + content: 'deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' + owner: root + group: root + mode: 0644 + + - name: Install Kubernetes packages + apt: + name: + - kubelet + - kubeadm + - kubectl + state: present + update_cache: yes + + register: k8s_install + retries: 5 + delay: 10 + until: k8s_install is succeeded + + - name: Hold Kubernetes packages + command: apt-mark hold kubelet kubeadm kubectl + + - name: Enable kubelet + systemd: + name: kubelet + enabled: yes + state: started + + # Optional UFW configuration + - name: Ensure UFW is installed + apt: + name: ufw + state: present + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + - name: Allow Kubernetes ports + ufw: + rule: allow + port: "{{ item }}" + proto: tcp + loop: + - 6443 + - 2379:2380 + - 10250 + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + - name: Configure containerd for kubeadm + copy: + dest: /etc/containerd/config.toml + content: | + [plugins."io.containerd.grpc.v1.cri".containerd] + snapshotter = "overlayfs" + + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" + + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] + SystemdCgroup = true + + - name: Enable and start containerd + systemd: + name: containerd + state: restarted + + # - name: Pause for 5 minutes to build app cache + # ansible.builtin.pause: + # minutes: 2 + + - name: Create .kube directory + file: + path: /home/{{ ansible_user }}/.kube + state: directory + owner: "{{ ansible_user }}" + group: "{{ ansible_user }}" + mode: '0755' + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + - name: Initialize Kubernetes + command: sudo kubeadm init --pod-network-cidr=10.244.0.0/16 + args: + creates: /etc/kubernetes/admin.conf + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + + - name: Copy kubeconfig to user + copy: + remote_src: yes + src: /etc/kubernetes/admin.conf + dest: /home/{{ ansible_user }}/.kube/config + owner: "{{ ansible_user }}" + group: "{{ ansible_user }}" + mode: '0644' + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + # - name: Pause for 5 minutes to build app cache + # ansible.builtin.pause: + # minutes: 2 + + - name: Install Flannel CNI + ansible.builtin.command: + cmd: kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml + environment: + KUBECONFIG: /etc/kubernetes/admin.conf + when: inventory_hostname == "ubuntu24-vm01.home.lan" + register: flannel_result + changed_when: "'created' in flannel_result.stdout or 'configured' in flannel_result.stdout" + + - name: Get join command + command: sudo kubeadm token create --print-join-command + register: join_command + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + - name: Save join command + set_fact: + worker_join_cmd: "{{ join_command.stdout }}" + when: inventory_hostname == 'ubuntu24-vm01.home.lan' + + - name: Join cluster + command: "{{ hostvars['ubuntu24-vm01.home.lan'].worker_join_cmd }}" + args: + creates: /etc/kubernetes/kubelet.conf + when: inventory_hostname != 'ubuntu24-vm01.home.lan' \ No newline at end of file diff --git a/roles/kubernetes/tasks/Ubuntu.yml b/roles/kubernetes/tasks/Ubuntu.yml index b17114e..59ead9b 100644 --- a/roles/kubernetes/tasks/Ubuntu.yml +++ b/roles/kubernetes/tasks/Ubuntu.yml @@ -86,20 +86,16 @@ - name: Download Docker GPG key shell: | - curl -fsSL https://download.docker.com/linux/debian/gpg | \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - - name: Add Docker repository source file - ansible.builtin.copy: - dest: /etc/apt/sources.list.d/docker.sources - mode: '0644' - content: | - Types: deb - URIs: https://download.docker.com/linux/debian - Suites: {{ ansible_distribution_release }} - Components: stable - Architectures: {{ 'amd64' if ansible_architecture == 'x86_64' else ansible_architecture }} - Signed-By: /etc/apt/keyrings/docker.asc + - name: Add Docker repository (Ubuntu 24 safe) + apt_repository: + repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] \ + https://download.docker.com/linux/ubuntu noble stable" + state: present + filename: docker + update_cache: no - name: Update apt cache apt: