user@homelab:~/docs$ cat 09-k3s.md

k3s (Kubernetes)

Instalace k3s v1.35, kubectl bez sudo, alias k a první aplikace přes Ingress

# obsah

Proč verze 1.35

Zkouška CKAD v roce 2026 běží na Kubernetes v1.35. Cluster je na stejné řadě, aby se příkazy, API a chování shodovaly se zkouškou.

1. Firewall pro Kubernetes

shell @ server
sudo ufw allow 6443/tcp comment 'k3s API'
sudo ufw allow 80/tcp comment 'Traefik HTTP'
sudo ufw allow 443/tcp comment 'Traefik HTTPS'
sudo ufw allow from 10.42.0.0/16 comment 'k3s pods'
sudo ufw allow from 10.43.0.0/16 comment 'k3s services'

Bez pravidel pro 10.42/16 a 10.43/16 by firewall blokoval komunikaci uvnitř clusteru, například dotazy podů na CoreDNS.

2. Instalace

shell @ server
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=v1.35 INSTALL_K3S_EXEC="--write-kubeconfig-mode 600" sh -
  • INSTALL_K3S_CHANNEL=v1.35: nejnovější opravná verze řady 1.35,
  • --write-kubeconfig-mode 600: kubeconfig čte jen root.

3. kubectl bez sudo

shell @ server
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
chmod 600 ~/.kube/config
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc

4. Alias a doplňování

shell @ server
cat >> ~/.bashrc <<'EOF'
source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k
EOF
source ~/.bashrc

Na zkoušce šetří k a Tab spoustu času, proto je dobré si na ně zvyknout hned.

5. Kontrola

shell @ server
k get nodes
k get pods -A
text
NAME      STATUS   ROLES           AGE   VERSION
homelab   Ready    control-plane   46s   v1.35.9+k3s1
Pod (kube-system)Co dělá
corednsDNS uvnitř clusteru: služby se najdou podle jména
traefik, svclb-traefikingress: vstup webového provozu zvenku do aplikací
local-path-provisionervytváří PersistentVolumes na disku nodu
metrics-serverspotřeba CPU a RAM (k top)
helm-install-traefik*jednorázové joby, které nainstalovaly Traefik (Completed)

RESTARTS 2 u helm-install-traefik je normální: job čekal, než se připraví CRD.

6. Smoke test: nginx přes Ingress

shell @ server
k create deployment hello --image=nginx
k expose deployment hello --port=80
k create ingress hello --rule="/=hello:80"
k get pods,svc,ingress
  • Deployment spustí pod a hlídá, aby běžel,
  • Service mu dá stálé jméno a vnitřní adresu,
  • Ingress řekne Traefiku, kam poslat HTTP provoz.
shell @ mac
curl --noproxy '*' http://<ip-serveru>

Výsledek: Welcome to nginx! ✅ Úklid:

shell @ server
k delete ingress,svc,deployment hello