homeserver/ansible: add playbook to spin up k8s cluster
- add new playbook to spin-up kubernetes cluster using k0sctl and k0sctl config file
This commit is contained in:
		| @ -2,3 +2,21 @@ apt_packages: | |||||||
|   - curl |   - curl | ||||||
|   - vim |   - vim | ||||||
|   - htop |   - htop | ||||||
|  |  | ||||||
|  | # Kubernetes k0sctl configuration vars | ||||||
|  | master1_ip: "192.168.1.151" | ||||||
|  | master1_hostname: "vm6" | ||||||
|  | master2_ip: "192.168.1.161" | ||||||
|  | master2_hostname: "vm8" | ||||||
|  | worker1_ip: "192.168.1.152" | ||||||
|  | worker1_hostname: "vm7" | ||||||
|  | worker2_ip: "192.168.1.162" | ||||||
|  | worker2_hostname: "vm9" | ||||||
|  |  | ||||||
|  | pod_CIDR: "10.244.0.0/16" | ||||||
|  | service_CIDR: "10.96.0.0/12" | ||||||
|  | metallb_ip_range: "192.168.1.201-192.168.1.220" | ||||||
|  |  | ||||||
|  | k0s_version: "v1.33.2+k0s.0" | ||||||
|  | metallb_version: "0.15.2" | ||||||
|  | traefik_version: "36.2.0" | ||||||
| @ -17,7 +17,7 @@ vm_list: | |||||||
|     ip: "192.168.1.152/24" |     ip: "192.168.1.152/24" | ||||||
|     gateway: "192.168.1.1" |     gateway: "192.168.1.1" | ||||||
|     nameserver1: "192.168.1.145" |     nameserver1: "192.168.1.145" | ||||||
|     nameserver2: "8.8.8.8" |     nameserver2: "1.1.1.1" | ||||||
|  |  | ||||||
| # cloud-init variables | # cloud-init variables | ||||||
| node: "homeserver1" | node: "homeserver1" | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								ansible/playbooks/create-kubernetes-cluster.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ansible/playbooks/create-kubernetes-cluster.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | - name: Create Kubernetes Cluster | ||||||
|  |   hosts: vms | ||||||
|  |   vars_files: | ||||||
|  |     - ../secrets/vault.yaml | ||||||
|  |   roles: | ||||||
|  |     - create-kubernetes-cluster | ||||||
							
								
								
									
										97
									
								
								ansible/roles/create-kubernetes-cluster/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								ansible/roles/create-kubernetes-cluster/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | |||||||
|  | - name: Remove known_hosts file if it exists | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.file: | ||||||
|  |     path: /home/taqi/.ssh/known_hosts | ||||||
|  |     state: absent | ||||||
|  |  | ||||||
|  | - name: Remove k0ctl lock file if it exists | ||||||
|  |   ansible.builtin.file: | ||||||
|  |     path: /run/lock/k0sctl | ||||||
|  |     state: absent | ||||||
|  |   become: true | ||||||
|  |  | ||||||
|  | - name: Install k0sctl on host | ||||||
|  |   delegate_to: localhost | ||||||
|  |   ansible.builtin.command: | ||||||
|  |     cmd: "go install github.com/k0sproject/k0sctl@latest" | ||||||
|  |  | ||||||
|  | - name: Ensure k0sctl is installed on host | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.command: | ||||||
|  |     cmd: "k0sctl version" | ||||||
|  |   register: k0sctl_version | ||||||
|  |   changed_when: false | ||||||
|  |  | ||||||
|  | - name: Generate k0sctl configuration file | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.template: | ||||||
|  |     src: k0sctl.yaml.j2 | ||||||
|  |     dest: /tmp/k0sctl.yaml | ||||||
|  |   when: k0sctl_version is defined | ||||||
|  |   tags: | ||||||
|  |     - generate-k0sctl-config | ||||||
|  |  | ||||||
|  | - name: Generate MetalLB IP Address Pool configuration file | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.template: | ||||||
|  |     src: ipAddressPool.yaml.j2 | ||||||
|  |     dest: /tmp/ipAddressPool.yaml | ||||||
|  |   when: k0sctl_version is defined | ||||||
|  |   tags: | ||||||
|  |     - generatemetallb-ippool | ||||||
|  |     - metallb-ippool | ||||||
|  |  | ||||||
|  | - name: Create Cluster using k0sctl from host | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.command: | ||||||
|  |     cmd: "k0sctl apply --config /tmp/k0sctl.yaml" | ||||||
|  |   when: k0sctl_version is defined | ||||||
|  |  | ||||||
|  | - name: Save kubeconfig file on host | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.shell: | ||||||
|  |     cmd: "cd /tmp && k0sctl kubeconfig > /home/taqi/.kube/k0s_config.yaml" | ||||||
|  |   register: kubeconfig_result | ||||||
|  |   retries: 3 | ||||||
|  |   delay: 5 | ||||||
|  |   until: kubeconfig_result.rc == 0 | ||||||
|  |   when: k0sctl_version is defined | ||||||
|  |   tags: | ||||||
|  |     - generate-kubeconfig | ||||||
|  |  | ||||||
|  | - name: Apply IP Pool for MetalLB from host | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   ansible.builtin.shell: | ||||||
|  |     cmd: "kubectl apply -f /tmp/ipAddressPool.yaml --kubeconfig /home/taqi/.kube/k0s_config.yaml" | ||||||
|  |   register: metallb_ippool_result | ||||||
|  |   retries: 3 | ||||||
|  |   delay: 5 | ||||||
|  |   until: metallb_ippool_result.rc == 0 | ||||||
|  |   when: k0sctl_version is defined | ||||||
|  |   tags: | ||||||
|  |     - metallb-ippool | ||||||
|  |  | ||||||
|  | - name: Cleanup temporary files | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   block: | ||||||
|  |     - name: Remove k0sctl.yaml temporary file | ||||||
|  |       ansible.builtin.file: | ||||||
|  |         path: /tmp/k0sctl.yaml | ||||||
|  |         state: absent | ||||||
|  |  | ||||||
|  |     - name: Remove ipAddressPool.yaml temporary file | ||||||
|  |       ansible.builtin.shell: | ||||||
|  |         cmd: "rm -f /tmp/ipAddressPool.yaml" | ||||||
|  |   delegate_to: localhost | ||||||
|  |   run_once: true | ||||||
|  |   tags: | ||||||
|  |     - cleanup | ||||||
|  |   when: k0sctl_version is defined | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | apiVersion: metallb.io/v1beta1 | ||||||
|  | kind: IPAddressPool | ||||||
|  | metadata: | ||||||
|  |   name: first-pool | ||||||
|  |   namespace: metallb-system | ||||||
|  | spec: | ||||||
|  |   addresses: | ||||||
|  |   - "{{ metallb_ip_range }}" | ||||||
| @ -0,0 +1,70 @@ | |||||||
|  | apiVersion: k0sctl.k0sproject.io/v1beta1 | ||||||
|  | kind: Cluster | ||||||
|  | metadata: | ||||||
|  |   name: k0s-cluster | ||||||
|  | spec: | ||||||
|  |   hosts: | ||||||
|  |     - ssh: | ||||||
|  |         address: "{{ master1_ip }}" | ||||||
|  |         user: "{{ ansible_vm_user }}" | ||||||
|  |         keyPath: "{{ ansible_ssh_private_key_file }}" | ||||||
|  |       role: controller+worker | ||||||
|  |       hostname: "{{ master1_hostname }}" | ||||||
|  |       noTaints: true | ||||||
|  |     - ssh: | ||||||
|  |         address: "{{ master2_ip }}" | ||||||
|  |         user: "{{ ansible_vm_user }}" | ||||||
|  |         keyPath: "{{ ansible_ssh_private_key_file }}" | ||||||
|  |       role: controller+worker | ||||||
|  |       hostname: "{{ master2_hostname }}" | ||||||
|  |       noTaints: true | ||||||
|  |     - ssh: | ||||||
|  |         address: "{{ worker1_ip }}" | ||||||
|  |         user: "{{ ansible_vm_user }}" | ||||||
|  |         keyPath: "{{ ansible_ssh_private_key_file }}" | ||||||
|  |       role: worker | ||||||
|  |       hostname: "{{ worker1_hostname }}" | ||||||
|  |     - ssh: | ||||||
|  |         address: "{{ worker2_ip }}" | ||||||
|  |         user: "{{ ansible_vm_user }}" | ||||||
|  |         keyPath: "{{ ansible_ssh_private_key_file }}" | ||||||
|  |       role: worker | ||||||
|  |       hostname: "{{ worker2_hostname }}" | ||||||
|  |   k0s: | ||||||
|  |     version: "{{ k0s_version }}" | ||||||
|  |     config: | ||||||
|  |       spec: | ||||||
|  |         api: | ||||||
|  |           address: "{{ master1_ip }}" | ||||||
|  |           port: 6443 | ||||||
|  |           k0sApiPort: 9443 | ||||||
|  |           sans: | ||||||
|  |             - "{{ master1_ip }}" | ||||||
|  |             - "{{ master2_ip }}" | ||||||
|  |             - k8s.local | ||||||
|  |             - api.k8s.local | ||||||
|  |         network: | ||||||
|  |           kubeProxy: | ||||||
|  |             mode: iptables | ||||||
|  |           kuberouter: | ||||||
|  |             disabled: false | ||||||
|  |           podCIDR: "{{ pod_CIDR }}" | ||||||
|  |           serviceCIDR: "{{ service_CIDR }}" | ||||||
|  |           provider: kuberouter | ||||||
|  |         extensions: | ||||||
|  |           helm: | ||||||
|  |             concurrencyLevel: 5 | ||||||
|  |             repositories: | ||||||
|  |               - name: metallb | ||||||
|  |                 url: https://metallb.github.io/metallb | ||||||
|  |               - name: traefik | ||||||
|  |                 url: https://traefik.github.io/charts | ||||||
|  |             charts: | ||||||
|  |               - name: metallb | ||||||
|  |                 chartname: metallb/metallb | ||||||
|  |                 version: "{{ metallb_version }}" | ||||||
|  |                 namespace: metallb-system | ||||||
|  |               - name: traefik | ||||||
|  |                 chartname: traefik/traefik | ||||||
|  |                 version: "{{ traefik_version }}" | ||||||
|  |                 namespace: traefik-system | ||||||
							
								
								
									
										12
									
								
								kubernetes/kube-vip/values.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								kubernetes/kube-vip/values.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | # custom-values.yaml | ||||||
|  | config: | ||||||
|  |   address: $VIP_ADDRESS | ||||||
|  | env: | ||||||
|  |   # Ensure the interface name is correct for the Nodes | ||||||
|  |   # Can be found using `ip a` command | ||||||
|  |   # For proxmox nodes, the interface name is usually `ens18` | ||||||
|  |   vip_interface: ens18 | ||||||
|  |   cp_enable: true | ||||||
|  |   svc_enable: false | ||||||
|  | nodeSelector: | ||||||
|  |   node-role.kubernetes.io/control-plane: "true" | ||||||
		Reference in New Issue
	
	Block a user