--- title: "Deploy K8s Cluster in Minutes with k3s" description: "deploy kubernetes cluster in minutes with k3s with metallb letsencrypt nginx ingress" publishDate: "2020-03-23" tags: ["archived", "docker", "kubernetes", "en"] author: "Dawid" --- [K3S](https://k3s.io) is a lightweight and certified Kubernetes distribution, perfect for run development environments, CI/CD and IoT. It works very well with the ARM architecture. It's packaged to a single binary that makes deployment and setup easy. The default installation comes with: - embedded SQLite - containerd - flannel - coredns - traefik (ingress controller) - local path provisioner - service load balancer All those features are more than enough for most use-cases. Of course, installation is fully configurable, so if you want etcd, docker, Nginx ingress and so on - go to official documentation page https://rancher.com/docs/k3s/latest/en/ . ## Default installation Login to machine and run: ```bash curl -sfL https://get.k3s.io | sh - ``` and that's it... After a few seconds, you should see that the master node is ready with `k3s kubectl get node`. You will find *config.yaml* for kubernetes in `/etc/rancher/k3s/k3s.yaml` ## Advanced installation with nginx-ingress, metallb and cert-manager 1. Deploy k3s without traefik and servicelb ```bash curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC=" --no-deploy=servicelb --no-deploy=traefik" sh -s - ``` 2. Get config from `/etc/rancher/k3s/k3s.yaml` and put into `~/.kube/config` on your machine 3. [Install helm](https://helm.sh/docs/intro/install/) ```bash curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash ``` 4. Add helm repo and update ```bash helm repo add stable https://kubernetes-charts.storage.googleapis.com/ helm repo update ``` 5. Install [metallb](https://github.com/metallb/metallb). Range of available ip addresses for loadbalancer are set in `configInline.address-pools[0].addresses[0]`. ```bash helm install --namespace=kube-system \ --set configInline.address-pools[0].name=default \ --set configInline.address-pools[0].protocol=layer2 \ --set configInline.address-pools[0].addresses[0]=192.168.1.10-192.168.1.50 \ metallb stable/metallb ``` 6. Install [nginx-ingress](https://github.com/kubernetes/ingress-nginx) ```bash helm install --namespace=kube-system \ --set rbac.create=true \ nginx-ingress stable/nginx-ingress ``` 7. Install and configure [certmanager](https://github.com/jetstack/cert-manager) for lets-encrypt ```bash kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.14/deploy/manifests/00-crds.yaml helm install --namespace=kube-system cert-manager stable/cert-manager cat <