k3s — lekki Kubernetes na VPS
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Kontenery
Pełny Kubernetes wymaga minimum kilku serwerów, skomplikowanej konfiguracji i sporego budżetu. k3s (Rancher/SUSE) to certyfikowana dystrybucja Kubernetes skompilowana do jednego pliku binarnego — instalujesz go w 30 sekund jednym poleceniem i masz działający klaster K8s na VPS za 20 PLN/miesiąc. API jest w 100% kompatybilne z vanilla Kubernetes — wszystkie manifesty YAML, helm charty i narzędzia jak kubectl, Helm, Kustomize działają bez żadnych modyfikacji. Ten artykuł pokazuje jak zainstalować k3s, uruchomić aplikację w deploymencie i wystawić ją na świat przez Traefik Ingress z Let's Encrypt.
k3s vs pełny Kubernetes — porównanie
| Cecha | k3s | Pełny K8s (kubeadm) |
|---|---|---|
| Instalacja | 1 polecenie, ~30 sekund | Kilkanaście kroków, 30-60 min |
| RAM (control plane) | od 512 MB | od 2 GB |
| Rozmiar binarki | ~70 MB | Dziesiątki komponentów |
| Datastore | SQLite (domyślnie), PostgreSQL, MySQL, etcd | etcd (obowiązkowo) |
| Ingress | Traefik (wbudowany) | Brak — instalujesz sam |
| Load Balancer | ServiceLB (wbudowany) | Brak — MetalLB lub cloud LB |
| Kompatybilność API | 100% CNCF certified | 100% |
| Prod-ready | Tak (z HA setup) | Tak |
Instalacja k3s — single node
# Na serwerze Linux (Ubuntu 22.04 / Debian 12) curl -sfL https://get.k3s.io | sh - # k3s server startuje automatycznie jako systemd service systemctl status k3s # Konfiguracja kubectl export KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get nodes # NAME STATUS ROLES AGE VERSION # vps-01 Ready control-plane,master 1m v1.29.4+k3s1 # Pobierz kubeconfig na swoj komputer lokalny # Na lokalnym: scp root@vps-ip:/etc/rancher/k3s/k3s.yaml ~/.kube/config-k3s # Zamien server: na adres IP VPS # Sprawdz pody systemowe kubectl get pods -A
Deployment — uruchomienie aplikacji
# Przyklad: deployment aplikacji Node.js
# myapp-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: node:20-alpine
command: ["node", "-e", "require('http').createServer((req,res)=>res.end('Hello k3s!')).listen(3000)"]
ports:
- containerPort: 3000
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
# Zastosuj manifesty
kubectl apply -f myapp-deployment.yml
# Sprawdz status
kubectl get deployments
kubectl get pods
kubectl get svc
kubectl describe pod myapp-xxxx Ingress z Traefik i Let's Encrypt
k3s instaluje Traefik automatycznie. Żeby wystawić aplikację na zewnątrz z HTTPS, utwórz zasób Ingress i skonfiguruj Let's Encrypt przez HelmChartConfig:
# /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /data/acme.json
httpChallenge:
entryPoint: web
ports:
websecure:
tls:
certResolver: letsencrypt # ingress.yml — Ingress dla myapp
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80
tls:
- hosts:
- app.example.com
kubectl apply -f ingress.yml
# Po chwili Traefik zamawia certyfikat Let's Encrypt
# https://app.example.com dziala Przydatne komendy kubectl
# Logi z poda kubectl logs -f myapp-xxxx # Wejdz do kontenera kubectl exec -it myapp-xxxx -- sh # Skalowanie kubectl scale deployment myapp --replicas=3 # Rolling update (nowy image) kubectl set image deployment/myapp myapp=node:22-alpine # Status rollout kubectl rollout status deployment/myapp # Historia i rollback kubectl rollout history deployment/myapp kubectl rollout undo deployment/myapp # Zasoby (CPU/RAM) uzywane przez pody kubectl top pods kubectl top nodes # Opisz node (dostepna pojemnosc) kubectl describe node vps-01
Klaster multi-node — dodawanie worker nodes
# Na masterze — pobierz token cat /var/lib/rancher/k3s/server/node-token # Na workerze — dolacz do klastra curl -sfL https://get.k3s.io | K3S_URL=https://<master-ip>:6443 K3S_TOKEN=<token> sh - # Na masterze sprawdz nowe nody kubectl get nodes # NAME STATUS ROLES AGE # master Ready control-plane,master 10m # worker01 Ready <none> 30s
Helm — manager pakietów dla k3s
# Instalacja Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # Dodaj repo i zainstaluj aplikacje helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update # Instalacja PostgreSQL helm install my-postgres bitnami/postgresql \ --set auth.postgresPassword=mocne-haslo \ --set primary.persistence.size=10Gi # Instalacja WordPress helm install my-wordpress bitnami/wordpress \ --set wordpressUsername=admin \ --set wordpressPassword=haslo-wp # Lista zainstalowanych chartow helm list helm status my-postgres