# Automated build of HA k3s Cluster ![Fully Automated K3S etcd High Availability Install](https://img.youtube.com/vi/CbkEWcUZ7zM/0.jpg) This playbook will build an HA Kubernetes cluster with `k3s`, `kube-vip` and MetalLB via `ansible`. It is based on the work from [this fork](https://github.com/212850a/k3s-ansible) which is based on the work from [k3s-io/k3s-ansible](https://github.com/k3s-io/k3s-ansible). It uses [kube-vip](https://kube-vip.chipzoller.dev/) to create a load balancer for control plane, and [metal-lb](https://metallb.universe.tf/installation/) for its service `LoadBalancer`. If you want more context on how this works, see: 📄 [Documentation](https://docs.technotim.live/posts/k3s-etcd-ansible/) 📺 [Video](https://www.youtube.com/watch?v=CbkEWcUZ7zM) ## 📖 k3s Ansible Playbook Build a Kubernetes cluster using Ansible with k3s. The goal is easily install a HA Kubernetes cluster on machines running: - [X] Debian - [X] Ubuntu - [X] CentOS on processor architecture: - [X] x64 - [X] arm64 - [X] armhf ## ✅ System requirements * Deployment environment must have Ansible 2.4.0+ * `server` and `agent` nodes should have passwordless SSH access, tf not you can supply arguments to provide credentials `-ask-pass --ask-become-pass` to ach command. ## 🚀 Getting Started First create a new directory based on the `sample` directory within the `inventory` directory: ```bash cp -R inventory/sample inventory/my-cluster ``` Second, edit `inventory/my-cluster/hosts.ini` to match the system information gathered above. For example: ```ini [master] 192.168.30.38 192.168.30.39 192.168.30.40 [node] 192.168.30.41 192.168.30.42 [k3s_cluster:children] master node ``` If multiple hosts are in the master group, the playbook will automatically setup k3s in HA mode with etcd. This requires at least k3s version 1.19.1 If needed, you can also edit `inventory/my-cluster/group_vars/all.yml` to match your environment. Start provisioning of the cluster using the following command: ```bash ansible-playbook site.yml -i inventory/my-cluster/hosts.ini ``` After deployment control plane will be accessible via virtual ip-address which is defined in inventory/group_vars/all.yml as `apiserver_endpoint` Remove k3s cluster ```bash ansible-playbook reset.yml -i inventory/my-cluster/hosts.ini ``` ## ⚙️ Kube Config To copy your `kube config` locally so that you can access your **Kubernetes** cluster run: ```bash scp debian@master_ip:~/.kube/config ~/.kube/config ```