243 lines
7.3 KiB
Org Mode
243 lines
7.3 KiB
Org Mode
* 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 <whatever> -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:
|
||
[36mINFO[0m[0000] No clusters found
|
||
[36mINFO[0m[0000] portmapping '8081:80' targets the loadbalancer: defaulting to [servers:*:proxy agents:*:proxy]
|
||
[36mINFO[0m[0000] Prep: Network
|
||
[36mINFO[0m[0000] Created network 'k3d-k3s-default'
|
||
[36mINFO[0m[0000] Created image volume k3d-k3s-default-images
|
||
[36mINFO[0m[0000] Starting new tools node...
|
||
[36mINFO[0m[0000] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.7.4'
|
||
[36mINFO[0m[0001] Creating node 'k3d-k3s-default-server-0'
|
||
[36mINFO[0m[0002] Pulling image 'docker.io/rancher/k3s:v1.30.4-k3s1'
|
||
[36mINFO[0m[0002] Starting node 'k3d-k3s-default-tools'
|
||
[36mINFO[0m[0005] Creating node 'k3d-k3s-default-agent-0'
|
||
[36mINFO[0m[0005] Creating node 'k3d-k3s-default-agent-1'
|
||
[36mINFO[0m[0005] Creating LoadBalancer 'k3d-k3s-default-serverlb'
|
||
[36mINFO[0m[0006] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.7.4'
|
||
[36mINFO[0m[0008] Using the k3d-tools node to gather environment information
|
||
[36mINFO[0m[0008] HostIP: using network gateway 172.18.0.1 address
|
||
[36mINFO[0m[0008] Starting cluster 'k3s-default'
|
||
[36mINFO[0m[0008] Starting servers...
|
||
[36mINFO[0m[0008] Starting node 'k3d-k3s-default-server-0'
|
||
[36mINFO[0m[0010] Starting agents...
|
||
[36mINFO[0m[0010] Starting node 'k3d-k3s-default-agent-0'
|
||
[36mINFO[0m[0010] Starting node 'k3d-k3s-default-agent-1'
|
||
[36mINFO[0m[0019] Starting helpers...
|
||
[36mINFO[0m[0019] Starting node 'k3d-k3s-default-serverlb'
|
||
[36mINFO[0m[0026] Injecting records for hostAliases (incl. host.k3d.internal) and for 4 network members into CoreDNS configmap...
|
||
[36mINFO[0m[0028] Cluster 'k3s-default' created successfully!
|
||
[36mINFO[0m[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 <none> 15s v1.30.4+k3s1
|
||
k3d-k3s-default-agent-1 Ready <none> 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 <none> <none>
|
||
kube-system helm-install-traefik-crd-5d927 0/1 Completed 0 15s 10.42.2.2 k3d-k3s-default-server-0 <none> <none>
|
||
kube-system helm-install-traefik-dh9mb 0/1 Completed 1 15s 10.42.0.2 k3d-k3s-default-agent-0 <none> <none>
|
||
kube-system local-path-provisioner-6795b5f9d8-k9hd8 1/1 Running 0 15s 10.42.1.4 k3d-k3s-default-agent-1 <none> <none>
|
||
kube-system metrics-server-557ff575fb-45mc8 1/1 Running 0 15s 10.42.1.3 k3d-k3s-default-agent-1 <none> <none>
|
||
kube-system svclb-traefik-f13b85a3-bmsc5 2/2 Running 0 4s 10.42.1.5 k3d-k3s-default-agent-1 <none> <none>
|
||
kube-system svclb-traefik-f13b85a3-mttkt 2/2 Running 0 4s 10.42.2.3 k3d-k3s-default-server-0 <none> <none>
|
||
kube-system svclb-traefik-f13b85a3-pprtw 2/2 Running 0 4s 10.42.0.3 k3d-k3s-default-agent-0 <none> <none>
|
||
kube-system traefik-5fb479b77-csb4k 1/1 Running 0 4s 10.42.0.4 k3d-k3s-default-agent-0 <none> <none>
|
||
: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:
|