Kubernetes — podstawy dla webdeveloperów hostujących aplikacje
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / DevOps
Kubernetes (K8s) jest wszędzie w ogłoszeniach o pracę i na konferencjach, ale większość webdeveloperów nigdy go nie potrzebuje. Ten artykuł wyjaśni czym jest, kiedy ma sens, a kiedy Docker Compose wystarczy — i przeprowadzi przez pierwsze kroki z kubectl.
Czym jest Kubernetes?
Kubernetes to orkiestrator kontenerów — zarządza wieloma kontenerami Docker na wielu serwerach (Node'ach) jednocześnie. Jego główne zadania to:
- Scheduling — decyduje na którym Node uruchomić kontener
- Self-healing — restartuje padłe kontenery, zastępuje Node'y
- Scaling — automatycznie zwiększa/zmniejsza liczbę replik
- Rolling updates — wdraża nowe wersje bez przestoju
- Service discovery — kontenery odnajdują się przez DNS
- Config management — ConfigMap i Secret dla konfiguracji
Podstawowe koncepty
| Obiekt | Co robi | Analogia Docker |
|---|---|---|
| Node | Maszyna wirtualna/fizyczna w klastrze | Serwer z Docker daemon |
| Pod | Jeden lub więcej kontenerów z shared network | docker run (jeden kontener) |
| Deployment | Deklaruje ile replik Poda ma działać i jak je aktualizować | docker-compose service z replicas |
| Service | Stały adres sieciowy dla grupy Podów (load balancing) | Docker network + expose port |
| Ingress | HTTP/HTTPS routing z zewnątrz do Service'ów | Nginx reverse proxy |
| ConfigMap | Konfiguracja jako zmienne środowiskowe lub pliki | env_file w docker-compose |
| Secret | Wrażliwe dane (hasła, klucze API) base64-encoded | .env z secrets |
| Namespace | Wirtualna izolacja w klastrze (dev/staging/prod) | Brak bezpośredniej analogii |
Instalacja kubectl i pierwsze kroki
# Instalacja kubectl (Linux) curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # macOS brew install kubectl # Sprawdź wersję kubectl version --client
# Podstawowe komendy kubectl # Sprawdź status klastra kubectl cluster-info kubectl get nodes # Lista Podów (wszystkie namespaces) kubectl get pods --all-namespaces kubectl get pods -n default # Szczegóły obiektu kubectl describe pod my-pod kubectl describe deployment my-app # Logi kontenera kubectl logs my-pod kubectl logs my-pod -f # Tail/follow kubectl logs my-pod -c sidecar # Konkretny kontener w Podzie # Exec do kontenera kubectl exec -it my-pod -- /bin/bash kubectl exec -it my-pod -- sh # Port forwarding (lokalny debug) kubectl port-forward pod/my-pod 8080:80 # Apply manifest kubectl apply -f deployment.yaml kubectl delete -f deployment.yaml # Skalowanie kubectl scale deployment my-app --replicas=5 # Rolling update kubectl set image deployment/my-app app=myimage:v2
Manifest YAML — Deployment + Service
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: myrepo/my-app:v1.0.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: NODE_ENV
value: production
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secrets
key: db-password
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: ClusterIP # Tylko wewnętrzny. LoadBalancer = publiczny IP. # Wdrożenie kubectl apply -f deployment.yaml # Sprawdź status kubectl get deployments kubectl get pods -l app=my-app kubectl rollout status deployment/my-app # Rollback do poprzedniej wersji kubectl rollout undo deployment/my-app
Kubernetes vs Docker Compose — kiedy co wybrać
| Kryterium | Docker Compose | Kubernetes |
|---|---|---|
| Złożoność | Niska — jeden plik YAML | Wysoka — wiele obiektów, kubeconfig |
| Skalowanie | Ręczne lub docker swarm | Automatyczne (HPA) |
| Multi-node | Nie (tylko Docker Swarm) | Tak — natywnie |
| Krzywa uczenia | 1-2 dni | 2-4 tygodnie |
| Koszt | Koszt VPS | VPS + zarządzanie + ew. managed fee |
| Idealne dla | 1-3 serwery, startup, dev, staging | SaaS, mikroserwisy, 10+ serwisów |
Managed K8s vs self-hosted
Managed Kubernetes (GKE, AWS EKS, DigitalOcean Kubernetes, Hetzner) oddaje control plane (API server, etcd, scheduler) dostawcy — płacisz tylko za worker nodes. Self-hosted (kubeadm, K3s, K0s na własnych VPS) daje pełną kontrolę, ale wymaga zarządzania control plane:
- DigitalOcean Kubernetes — prosty panel, od ~$12/msc per node, dobra opcja na start.
- Google GKE Autopilot — serverless K8s, płacisz za CPU/RAM Podów, nie za Node'y.
- AWS EKS — $0.10/h za control plane + EC2 workers, pełna integracja z AWS.
- K3s na VPS — lekka dystrybucja K8s (Rancher), działa na 512 MB RAM, idealna do nauki i małych projektów.
Kiedy NIE używać Kubernetes
Kubernetes nie jest odpowiedzią na wszystkie problemy:
- Mały projekt (1-3 serwisy) — Docker Compose + Nginx wystarczy. K8s dodaje tygodnie konfiguracji bez realnych korzyści.
- WordPress, PHP, statyczne strony — managed hosting lub prosta konfiguracja VPS jest znacznie prostsza.
- Startup bez DevOps — K8s wymaga stałego zarządzania. Bez osoby znającej K8s w zespole to pułapka.
- Mały ruch (<1000 req/min) — jeden VPS z PM2/Docker Compose obsłuży to bez problemu.
- Baza danych w K8s — stateful aplikacje (PostgreSQL, Redis) są trudne w K8s. Lepiej użyć managed DB (RDS, Cloud SQL) z zewnątrz klastra.