* Hvordan kjøre k8s cluster på hytta for fun and profit! * Hvordan kjøre k8s cluster på hytta for fun +and profit!+ and savings! * Hvordan kjøre k8s cluster på hytta for fun +and profit!+ +and savings!+ uh.... and FUN! [[./images/server.jpg]] * Men altså... how did we get here? * Men altså... how did we get here? [[./images/minecraft.png]] * Bare-metal og vps! [[file:images/baremetal.png]] * Docker! ... og en del nginx og ruter-mikk... [[file:images/docker.png]] * wireguard! [[file:images/docker.png]] veldig enkel måte å sette opp vpn på! * ... er k8s løsningen? #+ATTR_ORG: :width 900 [[./images/k8s-logo.png]] - Distribuert! - Config management! - Mer enn bare containere! - og relevant for jobb! * Men hvilken distro skal jeg velge? * Men hvilken distro skal jeg velge? ** standard / kubeadm - bare base k8s, mangler mange componenter for å faktisk gjøre ting. ** k0s - veldig lightweight, må sette opp en del selv. ** Minikube - enkelt - lager egen vm, kun 1 node ** rancher rke & rke2 - Rke kjører over docker - Rke2 var ikke stabilt når jeg startet ** rancher k3s - egentlig laget for edge, men funker ganske greit for større ting og har mye ute av boksen! - funker i litt mer utradisjonelle k8s miljø * Utfordring: NAT [[file:images/kubeServer.png]] [[file:images/kubeInternal.png]] * helm magic! =helm install -f config.yaml= https://artifacthub.io/ docker hub for helm! * Git-ops & fluxcd! Skriv yaml -> commit til git -> *k8s magic* -> deployed! * Så hva kjører jeg? - Nextcloud - immich - Gitea - Drone cicd - chat-bots - archlinux pakke repo - openldap - bitwarden (vaultwarden) - mail server - jellyfin - k8s componenter! - k3s - openebs - cert-manager & trust-manager - loki / prometheus / grafana - container registry - stakater-reloader - nginx ingress controller - FluxCD * Hva ville jeg gjort anderledes? - all config i git fra starten av! - bruk gitops tidligere * Gode ressurser / Ting å google ** Youtube - Jeff Geerling - TechnoTim - Just me and opensource - Level1Techs ** Reddit - /r/selfhosted - /r/DataHoarder - /r/homelab - /r/HomeServer - /r/k3s - /r/rancher - /r/linux ** StackExchange ** eller, spør meg! * Demo? #+begin_src bash :results drawer replace k3d cluster delete k3d cluster create -p "8081:80@loadbalancer" --agents 2 #+end_src #+RESULTS: :results: INFO[0000] No clusters found INFO[0000] portmapping '8081:80' targets the loadbalancer: defaulting to [servers:*:proxy agents:*:proxy] INFO[0000] Prep: Network INFO[0000] Created network 'k3d-k3s-default' INFO[0000] Created image volume k3d-k3s-default-images INFO[0000] Starting new tools node... INFO[0000] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.7.4' INFO[0001] Creating node 'k3d-k3s-default-server-0' INFO[0002] Pulling image 'docker.io/rancher/k3s:v1.30.4-k3s1' INFO[0002] Starting node 'k3d-k3s-default-tools' INFO[0005] Creating node 'k3d-k3s-default-agent-0' INFO[0005] Creating node 'k3d-k3s-default-agent-1' INFO[0005] Creating LoadBalancer 'k3d-k3s-default-serverlb' INFO[0006] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.7.4' INFO[0008] Using the k3d-tools node to gather environment information INFO[0008] HostIP: using network gateway 172.18.0.1 address INFO[0008] Starting cluster 'k3s-default' INFO[0008] Starting servers... INFO[0008] Starting node 'k3d-k3s-default-server-0' INFO[0010] Starting agents... INFO[0010] Starting node 'k3d-k3s-default-agent-0' INFO[0010] Starting node 'k3d-k3s-default-agent-1' INFO[0019] Starting helpers... INFO[0019] Starting node 'k3d-k3s-default-serverlb' INFO[0026] Injecting records for hostAliases (incl. host.k3d.internal) and for 4 network members into CoreDNS configmap... INFO[0028] Cluster 'k3s-default' created successfully! INFO[0028] You can now use it like this: kubectl cluster-info :end: #+begin_src bash :results drawer replace kubectl get nodes #+end_src #+RESULTS: :results: NAME STATUS ROLES AGE VERSION k3d-k3s-default-agent-0 Ready 15s v1.30.4+k3s1 k3d-k3s-default-agent-1 Ready 16s v1.30.4+k3s1 k3d-k3s-default-server-0 Ready control-plane,master 24s v1.30.4+k3s1 :end: #+begin_src bash :results drawer replace kubectl get pods -A -o wide #+end_src #+RESULTS: :results: NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-576bfc4dc7-qf4jr 1/1 Running 0 15s 10.42.1.2 k3d-k3s-default-agent-1 kube-system helm-install-traefik-crd-5d927 0/1 Completed 0 15s 10.42.2.2 k3d-k3s-default-server-0 kube-system helm-install-traefik-dh9mb 0/1 Completed 1 15s 10.42.0.2 k3d-k3s-default-agent-0 kube-system local-path-provisioner-6795b5f9d8-k9hd8 1/1 Running 0 15s 10.42.1.4 k3d-k3s-default-agent-1 kube-system metrics-server-557ff575fb-45mc8 1/1 Running 0 15s 10.42.1.3 k3d-k3s-default-agent-1 kube-system svclb-traefik-f13b85a3-bmsc5 2/2 Running 0 4s 10.42.1.5 k3d-k3s-default-agent-1 kube-system svclb-traefik-f13b85a3-mttkt 2/2 Running 0 4s 10.42.2.3 k3d-k3s-default-server-0 kube-system svclb-traefik-f13b85a3-pprtw 2/2 Running 0 4s 10.42.0.3 k3d-k3s-default-agent-0 kube-system traefik-5fb479b77-csb4k 1/1 Running 0 4s 10.42.0.4 k3d-k3s-default-agent-0 :end: #+begin_src bash :results drawer replace helm repo add podinfo https://stefanprodan.github.io/podinfo helm install podinfo podinfo/podinfo --set ingress.enabled=true #+end_src #+RESULTS: :results: "podinfo" has been added to your repositories NAME: podinfo LAST DEPLOYED: Fri Nov 15 00:02:07 2024 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: 1. Get the application URL by running these commands: http://podinfo.local/ :end: #+begin_src bash :results drawer replace curl -H 'Host: podinfo.local' localhost:8081 #+end_src #+RESULTS: :results: { "hostname": "podinfo-5c7765bf4-c49bd", "version": "6.7.1", "revision": "6b7aab8a10d6ee8b895b0a5048f4ab0966ed29ff", "color": "#34577c", "logo": "https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif", "message": "greetings from podinfo v6.7.1", "goos": "linux", "goarch": "amd64", "runtime": "go1.23.2", "num_goroutine": "8", "num_cpu": "16" } :end: