Compare commits

...

8 Commits

14 changed files with 99 additions and 274 deletions
-137
View File
@@ -1,137 +0,0 @@
- name: Primary Master Initialisation
hosts: masters[0]
tasks:
- name: Initialise high-availability Kubernetes cluster
ansible.builtin.command: >-
kubeadm init --pod-network-cidr="172.16.0.0/16" --control-plane-endpoint="{{ ansible_default_ipv4.address }}:6443" --upload-certs
args:
creates: /etc/kubernetes/admin.conf
- name: Copy Kubernetes Admin Config
ansible.builtin.command: "{{ item }}"
loop:
- mkdir -p $HOME/.kube
- cp /etc/kubernetes/admin.conf $HOME/.kube/config
- chown $(id -u):$(id -g) $HOME/.kube/config
args:
creates: $HOME/.kube/config
- name: Install Pod Network (Calico)
ansible.builtin.shell: kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml > pod_network_setup.txt
args:
chdir: $HOME
creates: pod_network_setup.txt
- name: Add Helm repositories
kubernetes.core.helm_repository:
name: "{{ item.name }}"
repo_url: "{{ item.url }}"
loop:
- name: metrics-server
url: https://kubernetes-sigs.github.io/metrics-server/
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts
- name: longhorn
url: https://charts.longhorn.io
- name: traefik
url: https://traefik.github.io/charts
- name: minecraft-server-charts
url: https://itzg.github.io/minecraft-server-charts/
- name: Install Metrics Server
kubernetes.core.helm:
release_name: metrics-server
release_namespace: kube-system
chart_ref: metrics-server/metrics-server
chart_version: 3.13.0
values:
args:
- --kubelet-insecure-tls
- name: Install Longhorn
kubernetes.core.helm:
release_name: longhorn
release_namespace: longhorn-system
create_namespace: true
chart_ref: longhorn/longhorn
chart_version: 1.12.0
- name: Install Prometheus
kubernetes.core.helm:
release_name: prometheus
release_namespace: monitoring
create_namespace: true
chart_ref: prometheus-community/prometheus
chart_version: 29.10.0
state: absent
- name: Install Traefik
kubernetes.core.helm:
release_name: traefik
release_namespace: default
create_namespace: true
chart_ref: traefik/traefik
chart_version: 40.2.0
values:
deployment:
kind: DaemonSet
securityContext:
capabilities:
drop: [ALL]
add: [NET_BIND_SERVICE]
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
ports:
web:
port: 80
containerPort: 80
hostPort: 80
websecure:
port: 443
containerPort: 443
hostPort: 443
- name: Install Minecraft
kubernetes.core.helm:
release_name: minecraft
release_namespace: default
chart_ref: minecraft-server-charts/minecraft
chart_version: 5.1.3
values:
minecraftServer:
eula: true
persistence:
dataDir:
enabled: true
- name: Extract Control Plane Decryption Key & Join Token
block:
- name: Generate Fresh Join Command
ansible.builtin.command: kubeadm token create --print-join-command
register: join_command_raw
- name: Upload Certs and Capture Certificate Key
shell: kubeadm init phase upload-certs --upload-certs | tail -n 1
register: cert_key_raw
- name: Set facts across playbooks
ansible.builtin.set_fact:
k8s_join_base: "{{ join_command_raw.stdout }}"
k8s_cert_key: "{{ cert_key_raw.stdout }}"
delegate_to: localhost
delegate_facts: true
- name: Join Secondary Control Planes
hosts: masters:!masters[0] # <--- Targets masters 1 and 2
tasks:
- name: Join Cluster as Control Plane Node
ansible.builtin.shell: "{{ hostvars['localhost']['k8s_join_base'] }} --control-plane --certificate-key {{ hostvars['localhost']['k8s_cert_key'] }}"
args:
creates: /etc/kubernetes/admin.conf
- name: Copy Kubernetes Admin Config
ansible.builtin.shell: "{{ item }}"
loop:
- mkdir -p $HOME/.kube
- cp /etc/kubernetes/admin.conf $HOME/.kube/config
- chown $(id -u):$(id -g) $HOME/.kube/config
args:
creates: $HOME/.kube/config
- name: Remove control plane taint
hosts: masters[0]
tasks:
- name: Remove control plane NoSchedule taint from all nodes
kubernetes.core.k8s_taint:
state: absent
name: "{{ item }}"
taints:
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
loop: "{{ groups['masters'] }}"
@@ -1,4 +1,4 @@
- name: Provision kolibri automation user - name: Create Kolibri automation user
hosts: all hosts: all
become: true become: true
tasks: tasks:
+8
View File
@@ -0,0 +1,8 @@
- name: Reset nodes
hosts: all
become: true
tasks:
- name: Reset kubeadm
ansible.builtin.command: kubeadm reset -f
args:
removes: /etc/kubernetes/*.conf
-78
View File
@@ -1,78 +0,0 @@
- name: Initialise Master and Worker Nodes
hosts: all
tasks:
- name: Enable IPv4 forwarding
ansible.posix.sysctl:
name: net.ipv4.ip_forward
value: 1
sysctl_set: true
- name: Enable Kernel Modules
community.general.modprobe:
name: "{{ item }}"
persistent: present
loop:
- br_netfilter
- dm-crypt
- name: Ensure /sys mount is set to shared for container runtimes
block:
- name: Remount /sys as shared immediately
ansible.builtin.command: mount --make-rshared {{ item }}
loop:
- /
- /sys
- /run
changed_when: false
- name: Create Alpine local.d script for permanent shared mount
ansible.builtin.copy:
dest: /etc/local.d/mount-shared.start
content: |
#!/bin/sh
mount --make-rshared /
mount --make-rshared /sys
mount --make-rshared /run
owner: root
group: root
mode: '0755'
- name: Ensure Alpine local service is enabled on boot
ansible.builtin.service:
name: local
enabled: true
runlevel: default
- name: Install tools
ansible.builtin.package:
name: "{{ item }}"
state: present
loop:
- htop
- name: Install kubectl, kubelet, kubeadm and containerd
ansible.builtin.package:
name: "{{ item }}"
state: present
loop:
- kubectl
- kubeadm
- kubelet
- containerd
- cni-plugins
- helm
- open-iscsi
- name: Start kubelet and containerd
ansible.builtin.service:
name: "{{ item }}"
enabled: true
state: started
loop:
- kubelet
- containerd
- iscsid
- name: Add /opt/cni/bin to containerd CNI binary directories
ansible.builtin.replace:
path: /etc/containerd/config.toml
regexp: "bin_dirs = \\['/usr/libexec/cni'\\]"
replace: "bin_dirs = ['/opt/cni/bin', '/usr/libexec/cni']"
notify: Restart containerd
handlers:
- name: Restart containerd
ansible.builtin.service:
name: containerd
state: restarted
-22
View File
@@ -1,22 +0,0 @@
- name: Extract Worker Join Token from Primary Master
hosts: masters[0] # <--- Targets only the first master safely
gather_facts: false
tasks:
- name: Generate worker join command
ansible.builtin.command: kubeadm token create --print-join-command
register: join_command_raw
changed_when: false # Reading/generating a token text string changes no host state
- name: Save join command globally
ansible.builtin.set_fact:
k8s_worker_join: "{{ join_command_raw.stdout }}"
delegate_to: localhost
delegate_facts: true
- name: Join Worker Nodes to Cluster
hosts: workers
gather_facts: false
tasks:
- name: Join cluster
ansible.builtin.shell: "{{ hostvars['localhost']['k8s_worker_join'] }} >> node_joined.txt"
args:
chdir: $HOME
creates: node_joined.txt
@@ -2,3 +2,5 @@
ansible.builtin.import_tasks: repo.yaml ansible.builtin.import_tasks: repo.yaml
- name: Install Kubernetes packages - name: Install Kubernetes packages
ansible.builtin.import_tasks: packages.yaml ansible.builtin.import_tasks: packages.yaml
- name: Ensure services running
ansible.builtin.import_tasks: services.yaml
@@ -4,4 +4,5 @@
- kubeadm - kubeadm
- kubelet - kubelet
- containerd - containerd
- open-iscsi
update_cache: true update_cache: true
@@ -0,0 +1,5 @@
- name: Ensure containerd is running
ansible.builtin.service:
name: containerd
state: started
enabled: true
@@ -0,0 +1,17 @@
- name: Copy Kubernetes Admin configuration
block:
- name: Ensure .kube directory
ansible.builtin.file:
path: "{{ ansible_facts['env']['HOME'] }}/.kube"
state: directory
owner: "{{ ansible_facts['user_id'] }}"
group: "{{ ansible_facts['user_id'] }}"
mode: "0755"
- name: Copy Admin configuration
ansible.builtin.copy:
src: /etc/kubernetes/admin.conf
dest: "{{ ansible_facts['env']['HOME'] }}/.kube/config"
remote_src: true
owner: "{{ ansible_facts['user_id'] }}"
group: "{{ ansible_facts['user_id'] }}"
mode: "0600"
@@ -2,4 +2,4 @@
ansible.builtin.template: ansible.builtin.template:
src: kube-vip.yaml.j2 src: kube-vip.yaml.j2
dest: /etc/kubernetes/manifests/kube-vip.yaml dest: /etc/kubernetes/manifests/kube-vip.yaml
mode: "0644" mode: "0600"
@@ -0,0 +1,13 @@
- name: Ensure Longhorn repository exists
kubernetes.core.helm_repository:
name: longhorn
url: https://charts.longhorn.io
- name: Ensure Longhorn is installed
kubernetes.core.helm:
release_name: longhorn
release_namespace: longhorn-system
chart_ref: longhorn/longhorn
chart_version: 1.12.0
create_namespace: true
run_once: true
@@ -1,65 +1,63 @@
- name: Install kube-vip - name: Install kube-vip static pod
ansible.builtin.import_tasks: kube-vip.yaml ansible.builtin.import_tasks: kube-vip.yaml
- name: Copy kubeadm config
ansible.builtin.template:
src: kubeadm-config.yaml.j2
dest: /tmp/kubeadm-config.yaml
mode: "0600"
- name: Initialise Kubernetes cluster - name: Initialise Kubernetes cluster
ansible.builtin.command: ansible.builtin.command: kubeadm init --config /tmp/kubeadm-config.yaml
argv:
- kubeadm
- init
- --pod-network-cidr=172.16.0.0/16
- --control-plane-endpoint={{ vip_address }}:6443
- --upload-certs
args: args:
creates: /etc/kubernetes/admin.conf creates: /etc/kubernetes/admin.conf
run_once: true run_once: true
- name: Copy Kubernetes Admin Configuration
ansible.builtin.include_tasks: copy-config.yaml
run_once: true
- name: Generate Join Command - name: Generate Join Command
ansible.builtin.command: ansible.builtin.command: kubeadm token create --print-join-command
argv:
- kubeadm
- token
- create
- --print-join-command
register: kubernetes_control_plane_join_command register: kubernetes_control_plane_join_command
run_once: true run_once: true
changed_when: true changed_when: true
- name: Get Certificate Key - name: Get Certificate Key
ansible.builtin.shell: ansible.builtin.shell: set -o pipefail && kubeadm init phase upload-certs --upload-certs | tail -n 1
cmd: set -o pipefail && kubeadm init phase upload-certs --upload-certs | tail -n 1
register: kubernetes_control_plane_certificate_key register: kubernetes_control_plane_certificate_key
run_once: true run_once: true
changed_when: true changed_when: true
- name: Join Additional Control Planes - name: Join Additional Control Planes
ansible.builtin.command: ansible.builtin.command: >-
cmd: "{{ kubernetes_control_plane_join_command.stdout }} --control-plane --certificate-key {{ kubernetes_control_plane_certificate_key.stdout }}" {{ kubernetes_control_plane_join_command.stdout }}
--control-plane
--certificate-key
{{ kubernetes_control_plane_certificate_key.stdout }}
args: args:
creates: /etc/kubernetes/admin.conf creates: /etc/kubernetes/admin.conf
- name: Copy Kubernetes Admin Config
ansible.builtin.command: "{{ item }}" - name: Copy Kubernetes Admin Configuration
loop: ansible.builtin.include_tasks: copy-config.yaml
- mkdir -p $HOME/.kube
- cp /etc/kubernetes/admin.conf $HOME/.kube/config
- chown $(id -u):$(id -g) $HOME/.kube/config
args:
creates: $HOME/.kube/config
- name: Untaint control planes - name: Untaint control planes
ansible.builtin.import_tasks: untaint.yaml ansible.builtin.import_tasks: untaint.yaml
- name: Install Kubernetes CLI
ansible.builtin.apt:
pkg:
- kubectl
state: present
- name: Install Helm - name: Install Tools
ansible.builtin.import_tasks: helm.yaml ansible.builtin.import_tasks: tools.yaml
- name: Install Cilium CNI - name: Install Cilium CNI
ansible.builtin.import_tasks: cilium.yaml ansible.builtin.import_tasks: cilium.yaml
# - name: Install Longhorn CSI
# ansible.builtin.import_tasks: longhorn.yaml
@@ -8,8 +8,11 @@
signed_by: https://packages.buildkite.com/helm-linux/helm-debian/gpgkey signed_by: https://packages.buildkite.com/helm-linux/helm-debian/gpgkey
state: present state: present
- name: Install Helm
- name: Install Kubernetes Tools
ansible.builtin.apt: ansible.builtin.apt:
name: helm pkg:
- kubectl
- helm
state: present state: present
update_cache: true update_cache: true
@@ -0,0 +1,15 @@
# Configuration reference can be found at https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta4/
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
clusterName: aeon
controlPlaneEndpoint: "{{ vip_address }}"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
failSwapOn: false
memorySwap:
swapBehaviour: LimitedSwap