Kubernetes dla Początkujących - Kompletny Przewodnik
Od podstaw do produkcyjnych deploymentów. Poznaj Kubernetes, naucz się kubectl, zrozum architekturę i zacznij orkiestrować kontenery jak profesjonalista.

Photo by Chanaka from Pexels
Kubernetes to system orkiestracji kontenerów, który zmienił sposób, w jaki budujemy i deployujemy aplikacje. Jeśli słyszałeś o nim, ale nigdy nie miałeś okazji go użyć, ten przewodnik jest dla Ciebie.
W tym artykule nauczysz się Kubernetes od podstaw – bez zbędnej teorii, z praktycznymi przykładami i realnymi case studies. Przejdziemy przez kluczowe koncepcje, zobaczysz jak wygląda praca z kubectl, poznasz najlepsze praktyki i dowiesz się, kiedy Kubernetes jest dobrym wyborem (a kiedy nie).
Po przeczytaniu tego przewodnika będziesz gotowy do stworzenia swojego pierwszego klastra i zdeployowania produkcyjnej aplikacji.
Czym jest Kubernetes i dlaczego jest ważny?
Kubernetes (często skracane do K8s) to open-source platforma do automatyzacji deploymentu, skalowania i zarządzania aplikacjami kontenerowymi. Stworzony przez Google, obecnie zarządzany przez Cloud Native Computing Foundation (CNCF).
Dlaczego Kubernetes jest rewolucją?
Przed Kubernetesem
Masz aplikację w 10 kontenerach Docker. Jeden kontener crashuje – musisz go ręcznie zrestartować. Ruch wzrasta 3x – musisz ręcznie uruchomić więcej instancji. Chcesz zdeployować nową wersję – przestój na kilka minut.
Z Kubernetesem
Definiujesz stan docelowy: "Chcę 10 instancji tego kontenera". Kubernetes automatycznie utrzymuje ten stan – crashujące kontenery są automatycznie restartowane, auto-scaling reaguje na obciążenie, deployment nowej wersji odbywa się bez przestoju.
Kluczowe zalety Kubernetes
Kluczowe koncepcje Kubernetes
Kubernetes używa kilku podstawowych obiektów (tzw. resources). Zrozumienie ich jest kluczem do efektywnej pracy z K8s.
📦 Pod
Pod to najmniejsza jednostka w Kubernetes. To grupa jednego lub więcej kontenerów Docker, które dzielą storage i network. W 99% przypadków: 1 Pod = 1 kontener.
Przykład:
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80🚀 Deployment
Deployment zarządza Podami. Definiujesz ile replik chcesz, a Kubernetes automatycznie tworzy i utrzymuje odpowiednią liczbę Podów. Obsługuje rolling updates, rollback i self-healing.
Przykład: Deployment z 3 replikami
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # 3 kopie aplikacji
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:v1.0
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi🌐 Service
Service to stabilny endpoint dla Podów. Pody mają dynamiczne IP, które zmieniają się przy każdym restarcie. Service zapewnia stały DNS name i load balancing.
Przykład: Service typu LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: LoadBalancer # Publiczny IP
selector:
app: my-app # Kieruje ruch do Podów z tym labelem
ports:
- port: 80 # Port zewnętrzny
targetPort: 8080 # Port w kontenerzeClusterIP (default)
Wewnętrzny IP, dostępny tylko w klastrze. Do komunikacji między serwisami.
NodePort
Publiczny port (30000-32767) na każdym nodzie. Rzadko używany.
LoadBalancer
Publiczny IP z cloud provider (Azure LB, AWS ELB). Do aplikacji webowych.
⚙️ ConfigMap & Secret
ConfigMap
Przechowuje konfigurację (non-sensitive data): API URLs, feature flags, settings.
apiVersion: v1 kind: ConfigMap metadata: name: app-config data: API_URL: "https://api.example.com" LOG_LEVEL: "info"
Secret
Przechowuje dane wrażliwe (base64-encoded): hasła, API keys, certyfikaty.
apiVersion: v1 kind: Secret metadata: name: app-secrets type: Opaque data: DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 API_KEY: c2VjcmV0a2V5NDU2=
Architektura Kubernetes
Kubernetes cluster składa się z Control Plane (mózg klastra) i Worker Nodes (maszyny robocze).
Komponenty Control Plane
kube-apiserver
Frontend Control Plane. Wszystko przechodzi przez API server – kubectl, CI/CD, internal components. RESTful API do zarządzania klastrem.
etcd
Distributed key-value store. Przechowuje cały stan klastra: manifesty, secrets, config. Highly available (HA setup = 3 lub 5 instancji etcd).
kube-scheduler
Decyduje, na którym nodzie uruchomić nowy Pod. Bierze pod uwagę: dostępne zasoby (CPU, RAM), affinity rules, taints/tolerations.
kube-controller-manager
Uruchamia controllers (ReplicaSet, Deployment, StatefulSet, DaemonSet). Każdy controller monitoruje swoje obiekty i utrzymuje desired state.
Komponenty Worker Node
kubelet
Agent działający na każdym nodzie. Komunikuje się z Control Plane, uruchamia Pody, monitoruje health checks (liveness/readiness probes).
kube-proxy
Network proxy działający na każdym nodzie. Obsługuje Service networking – kieruje ruch do odpowiednich Podów (via iptables lub IPVS).
Container Runtime
Uruchamia kontenery. Standardowo: containerd (lightweight, CNCF project). Alternatywy: CRI-O, Docker (deprecated, ale nadal działa).
Jak to działa w praktyce?
- Wysyłasz manifest Deployment via kubectl → kube-apiserver
- etcd zapisuje desired state (3 repliki Poda)
- kube-controller-manager wykrywa, że 0/3 Podów istnieje → tworzy 3 Pody
- kube-scheduler decyduje, na których nodach uruchomić Pody (node A, B, C)
- kubelet na nodach A, B, C otrzymuje instrukcje → uruchamia kontenery
- kube-proxy konfiguruje networking, aby Service kierował ruch do tych Podów
- Jeśli Pod crashuje → kubelet restartuje, jeśli node umiera → scheduler przenosi Pody na żywy node
Managed Kubernetes: AKS vs EKS vs GKE
Możesz zainstalować Kubernetes self-hosted (kubeadm, kops), ale 95% firm używa managed Kubernetes od cloud providera. Control Plane jest zarządzany przez providera – Ty płacisz tylko za worker nodes.
| Feature | Azure AKS | AWS EKS | Google GKE |
|---|---|---|---|
| Control Plane | Free (0$) | $0.10/hour ($73/mo) | Free (1 cluster), potem $0.10/h |
| Setup time | 5-10 min | 15-20 min | 5 min (najszybszy) |
| Upgrade | Auto-upgrade opcjonalny | Manual (via eksctl) | Auto-upgrade domyślnie |
| Monitoring | Azure Monitor + Container Insights | CloudWatch + EKS Observability | Cloud Monitoring (best-in-class) |
| Networking | Azure CNI, Kubenet | VPC CNI, Calico | GKE native (best performance) |
| Auto-scaling | Cluster Autoscaler, KEDA | Cluster Autoscaler, Karpenter | Node Auto-Provisioning (najlepszy) |
| Windows containers | Tak (best support) | Tak | Tak (beta) |
| Best for | .NET apps, Microsoft stack | Największy ekosystem, startupy | Pure Kubernetes experience, AI/ML |
Azure AKS
- ✓Free Control Plane – biggest advantage
- ✓Najlepsza integracja z Azure ecosystem
- ✓Azure AD integration out-of-the-box
- ✓Doskonałe wsparcie dla Windows containers
AWS EKS
- ✓Największy ekosystem (500+ narzędzi)
- ✓Karpenter – advanced auto-scaling
- ✓Fargate integration (serverless K8s)
- ✗Control Plane $73/mo per cluster
Google GKE
- ✓Created by K8s creators (Google)
- ✓Najlepszy auto-scaling (NAP)
- ✓GKE Autopilot – fully managed
- ✓Best-in-class networking performance
Bądźmy szczerzy o kosztach
Wielkie chmury są wygodne, ale NIE są jedyną opcją. Oto rzeczywiste koszty 3-nodowego klastra produkcyjnego miesięcznie:
Zauważyłeś? Hetzner i DigitalOcean są 4-5x tańsze. Dla małych/średnich projektów często lepszy wybór.
Hetzner Cloud Kubernetes – najlepsza cena/wydajność dla UE
Hetzner oferuje managed Kubernetes w niezbitych cenach. Idealny dla klientów z UE (RODO, niskie latency).
- €36/miesiąc za produkcyjny klaster 3-nodowy (vs €150-200 na Azure/AWS/GCP)
- Data center w Niemczech i Finlandii (dane pozostają w UE)
- Szybkie NVMe SSD, 20TB darmowego transferu miesięcznie
- Proste ceny – bez ukrytych kosztów
- Świetny dla: startupy, SME, projekty z ograniczonym budżetem
Chmura vs Serwery dedykowane – prawda, której nikt Ci nie powie
Marketing chmur mówi, że chmura jest zawsze lepsza. To nieprawda.
Chmura ma sens dla:
- Zmienny, nieprzewidywalny ruch
- Szybkie skalowanie (sezonowe szczyty)
- Zarządzane usługi (bazy, AI/ML)
- Globalna obecność (multi-region)
Serwery dedykowane dla:
- Stabilne, przewidywalne obciążenie
- Wysokie stałe użycie (bazy, cache)
- Ograniczony budżet (50-70% taniej)
- Pełna kontrola nad sprzętem
Reality check: Hetzner dedyk (Ryzen 9, 64GB RAM, 2x NVMe) = €40/m. Te same specs na AWS = $300-400/m.
Nasza szczera rekomendacja:
Azure AKS: Jeśli już używasz Azure – FREE Control Plane, Azure Poland region (RODO), doskonała integracja.
AWS EKS: Dojrzały ekosystem, największy wybór usług. $73/m za Control Plane.
Google GKE: Najlepszy Kubernetes experience. Google wymyślił K8s.
Hetzner/DigitalOcean/Civo: Budżet się liczy? 80% wartości za 20% ceny.
Podstawy kubectl – Command Line Interface

Photo by Brett Sayles from Pexels
kubectl to Twoje główne narzędzie do pracy z Kubernetes. Oto najważniejsze komendy, których będziesz używać codziennie.
Podstawowe operacje
Sprawdź status klastra
kubectl cluster-infoLista wszystkich Podów
kubectl get podskubectl get pods -A # wszystkie namespace'ySzczegóły Poda
kubectl describe pod <pod-name>Logi z kontenera
kubectl logs <pod-name>kubectl logs -f <pod-name> # follow (tail -f)Deploy aplikacji
Apply manifest z pliku
kubectl apply -f deployment.yamlkubectl apply -f ./manifests/ # cały folderQuick deploy (bez pliku)
kubectl create deployment my-app --image=nginx:1.25kubectl expose deployment my-app --port=80 --type=LoadBalancerScale deployment
kubectl scale deployment my-app --replicas=5Update i rollback
Update image (rolling update)
kubectl set image deployment/my-app app=my-app:v2.0Status rollout
kubectl rollout status deployment/my-appkubectl rollout history deployment/my-appRollback do poprzedniej wersji
kubectl rollout undo deployment/my-appkubectl rollout undo deployment/my-app --to-revision=2Debugging
Shell do działającego Poda
kubectl exec -it <pod-name> -- /bin/bashPort forward (local testing)
kubectl port-forward pod/my-app 8080:80Teraz: localhost:8080 → Pod port 80
Top resources (CPU/RAM usage)
kubectl top nodeskubectl top podsCleanup
Delete resources
kubectl delete pod <pod-name>kubectl delete deployment my-appkubectl delete -f deployment.yamlDelete wszystko w namespace
kubectl delete all --all -n <namespace>Pro tips dla kubectl
- Alias:
alias k=kubectl→ zamiast kubectl wpisujesz tylko "k" - kubectl cheat sheet: kubernetes.io/docs/reference/kubectl/cheatsheet
- kubectl plugins: krew (plugin manager), kubens/kubectx (switch contexts), stern (multi-pod logs)
- Bash completion:
kubectl completion bash > ~/.kube/completion
Strategie deploymentu
Kubernetes oferuje kilka strategii deploymentu. Wybór zależy od wymagań biznesowych, tolerancji na ryzyko i typu aplikacji.
Rolling Update (default)
Stopniowa wymiana Podów ze starej wersji na nową. Kubernetes usuwa stare Pody i tworzy nowe partiami, utrzymując minimum działających replik.
Zalety
- ✓Zero downtime – aplikacja działa cały czas
- ✓Automatyczny rollback jeśli nowa wersja failuje
- ✓Default strategy – nie wymaga konfiguracji
Wady
- ✗2 wersje aplikacji działają równocześnie (kilka minut)
- ✗Trudne dla breaking changes (DB schema migrations)
Przykład konfiguracji:
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # Max 1 Pod offline
maxSurge: 2 # Max 2 extra Pods podczas updateBlue/Green Deployment
Dwa identyczne środowiska: Blue (current production) i Green (new version). Deploy do Green, testuj, przełącz ruch z Blue na Green (instant switch).
Zalety
- ✓Instant rollback – przełączasz Service label
- ✓Testowanie na pełnym production environment
- ✓Tylko jedna wersja active – brak compatibility issues
Wady
- ✗2x resources (Blue + Green równocześnie)
- ✗Database migrations mogą być problematyczne
Canary Deployment
Nowa wersja najpierw dla małej grupy użytkowników (np. 5%). Jeśli wszystko OK, stopniowo zwiększasz procent (10%, 25%, 50%, 100%).
Zalety
- ✓Minimal risk – limited blast radius
- ✓A/B testing – compare metrics (errors, latency)
- ✓Progressive rollout – stop jeśli coś pójdzie nie tak
Wady
- ✗Wymaga advanced routing (Istio, Linkerd, Flagger)
- ✗Wolniejszy rollout (dni vs minuty)
Którą strategię wybrać?
- Rolling Update: Default dla 90% aplikacji. Wystarczająco bezpieczny, zero downtime, brak extra kosztów.
- Blue/Green: High-risk releases, e-commerce peak seasons, banking apps. Potrzebujesz instant rollback.
- Canary: Major releases, nowe feature'y, A/B testing. Masz czas i monitoring infrastructure.
Skalowanie i auto-scaling
Kubernetes automatycznie skaluje aplikacje w oparciu o metryki. To jedna z największych zalet K8s – płacisz tylko za potrzebne zasoby.
Horizontal Pod Autoscaler (HPA)
HPA automatycznie zmienia liczbę replik (Podów) w zależności od CPU, RAM lub custom metrics.
Przykład: Auto-scaling 2-10 replik, target 70% CPU
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70Jak to działa?
- CPU usage wzrasta do 85% → HPA wykrywa przekroczenie target (70%)
- HPA zwiększa replicas z 2 do 4 (scale-up)
- Po 5 minutach load spada do 50% → HPA czeka cooldown (5 min)
- Jeśli load nadal niski → scale-down z 4 do 2
Vertical Pod Autoscaler (VPA)
VPA automatycznie dostosowuje CPU i RAM requests/limits dla Podów. Zamiast więcej Podów (horizontal), większe Pody (vertical).
Kiedy używać HPA?
- • Stateless aplikacje (web apps, APIs)
- • Load balancing między replikami
- • Szybki scale-up (sekundy)
Kiedy używać VPA?
- • Stateful aplikacje (databases)
- • Mono-replica services
- • Optymalizacja resource requests
Cluster Autoscaler
Cluster Autoscaler automatycznie dodaje/usuwa worker nodes w zależności od potrzeb. Gdy Pody czekają na zasoby (pending), CA dodaje nowe nody. Gdy nody są puste, CA je usuwa.
Przykład: Masz 3 nody (12 CPU total). HPA skaluje aplikację do 15 replik, ale nie ma miejsca. Cluster Autoscaler wykrywa pending Pody i dodaje 2 nowe nody. Aplikacja dostaje zasoby w ~3 minuty.
Real case: Auto-scaling w e-commerce
Sklep internetowy obsługujący normalnie 1,000 req/min, podczas promocji 10,000 req/min:
- Normal load (08:00-20:00): HPA utrzymuje 5 replik, Cluster = 3 nodes
- Night (20:00-08:00): HPA scale-down do 2 replik, Cluster = 2 nodes (oszczędność 33%)
- Promocja (13:00-14:00): HPA scale-up do 25 replik, Cluster auto-adds 5 nodes
- Po promocji (14:30): HPA scale-down do 8 replik → 4 replicas → 5 replik (baseline)
Rezultat: Zero downtime podczas promocji, automatyczne oszczędności 40% w nocy, brak manual intervention.
Networking w Kubernetes
Kubernetes networking może wydawać się skomplikowany, ale w praktyce sprowadza się do kilku podstawowych koncepcji.
Podstawy Kubernetes networking
1. Pod-to-Pod communication
Każdy Pod ma własny IP (internal cluster IP). Pody mogą się komunikować bezpośrednio bez NAT – flat network model.
2. Service networking
Service to stabilny DNS name i IP. Ruch do Service jest load-balanced między Pody.
3. Ingress (HTTP/HTTPS routing)
Ingress to layer 7 load balancer. Routing based on hostname/path.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80CNI (Container Network Interface)
CNI plugin implementuje networking model Kubernetes. Wybór CNI wpływa na performance i features.
Calico (najpopularniejszy)
Network policies, BGP routing, eBPF dataplane. Production-ready.
Cilium (modern)
eBPF-based, high performance, advanced observability, service mesh.
Azure CNI / AWS VPC CNI
Native cloud integration, Pody dostają IPs z VNet/VPC.
Network Policies (firewall rules)
Network Policies to firewall dla Podów. Domyślnie wszystkie Pody mogą się komunikować ze wszystkimi. Network Policy ogranicza komunikację.
Przykład: Frontend może łączyć się z Backend, ale Backend NIE z Database
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # Tylko frontend może łączyć się z backendKiedy używać Kubernetes (a kiedy nie)?
Kubernetes jest potężny, ale nie dla każdego projektu. Oto szczera ocena, kiedy warto, a kiedy lepiej wybrać prostsze rozwiązanie.
Używaj Kubernetes jeśli:
- ✓Microservices architecture: 5+ serwisów, potrzebujesz orchestration, service discovery, inter-service communication (porównaj microservices vs monolit)
- ✓Variable load: Ruch 10x różnica (dzień vs noc, promocje, seasonality). Auto-scaling zwróci się w 2-3 miesiące
- ✓High availability requirements: 99.9%+ SLA, multi-region, disaster recovery, zero-downtime deployments
- ✓Multi-cloud / hybrid cloud: Musisz działać na Azure + AWS + on-premise. K8s abstracts infrastructure
- ✓Team ma doświadczenie: Masz DevOps engineer, team zna Docker, gotowi na learning curve
- ✓Frequent deployments: Deploy 5-10x/dzień, CI/CD, feature flags, canary releases (zobacz GitHub Actions vs Azure DevOps)
NIE używaj Kubernetes jeśli:
- ✗Monolithic app: Pojedyncza aplikacja, stały ruch, brak planów na microservices. Użyj Azure App Service / AWS Elastic Beanstalk
- ✗MVP / prototype: Musisz być live w 2 tygodnie, focus na features, nie infra. Użyj Vercel / Heroku / Render
- ✗Small team bez DevOps: 2 developerów, brak doświadczenia z kontenerami, nikt nie chce zarządzać infrastrukturą
- ✗Stateful legacy apps: Stara aplikacja (monolith .NET Framework, Java EE), state w pamięci, nie containerized. Migracja to 6+ miesięcy
- ✗Tight budget: Managed K8s (AKS) kosztuje minimum $150-200/mo (3 nodes + LB + storage). Shared hosting = $10/mo
- ✗Simple CRUD app: WordPress blog, landing page, simple API. K8s to overkill – użyj serverless (Azure Functions, Vercel)
Prostsze alternatywy dla Kubernetes
Getting Started – Twój pierwszy klaster
Gotowy zacząć? Oto krok po kroku, jak stworzyć swój pierwszy klaster Kubernetes i zdeployować aplikację.
Option 1: Local development (Minikube / kind)
Najszybszy sposób na naukę. Single-node cluster na Twoim laptopie.
1. Instalacja Minikube (Windows/Mac/Linux)
choco install minikube # Windowsbrew install minikube # Mac2. Start cluster
minikube start --driver=docker --cpus=2 --memory=40963. Verify
kubectl cluster-infokubectl get nodes4. Deploy sample app
kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePortminikube service nginx # Opens browserOption 2: Production cluster (Azure AKS)
Managed Kubernetes w Azure. 10 minut setup, production-ready.
1. Install Azure CLI
az login2. Create resource group
az group create --name myAKSGroup --location polandcentral3. Create AKS cluster (3 nodes)
az aks create --resource-group myAKSGroup --name myAKSCluster \
--node-count 3 --node-vm-size Standard_B2s \
--enable-managed-identity --generate-ssh-keys4. Get credentials
az aks get-credentials --resource-group myAKSGroup --name myAKSCluster5. Verify
kubectl get nodesZobaczysz 3 nody w stanie Ready
First deployment: Node.js API
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-api
spec:
replicas: 3
selector:
matchLabels:
app: nodejs-api
template:
metadata:
labels:
app: nodejs-api
spec:
containers:
- name: api
image: your-registry/nodejs-api:v1.0
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: "production"
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: nodejs-api-service
spec:
type: LoadBalancer
selector:
app: nodejs-api
ports:
- port: 80
targetPort: 3000Deploy:
kubectl apply -f deployment.yamlkubectl get pods -w # watch statuskubectl get service nodejs-api-service # get LoadBalancer IPPo 2-3 minutach dostaniesz publiczny IP. Otwórz w przeglądarce – Twoja API działa na Kubernetes!
Przykład z życia wzięty: Wdrożenie Node.js API na Kubernetes

Photo by Pixabay from Pexels
Wdróżmy prawdziwą aplikację: Node.js REST API z bazą danych PostgreSQL, auto-skalowaniem i konfiguracją gotową na produkcję.
Krok 1: Przygotowanie obrazu Docker
Najpierw konteneryzuj swoją aplikację Node.js i wypchnij do rejestru kontenerów (Docker Hub, Azure ACR, AWS ECR).
Dockerfile:
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
Krok 2: Deployment Kubernetes
Utwórz Deployment z 3 replikami, limitami zasobów i health checks.
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-api
spec:
replicas: 3
selector:
matchLabels:
app: nodejs-api
template:
metadata:
labels:
app: nodejs-api
spec:
containers:
- name: api
image: myregistry.azurecr.io/nodejs-api:v1.0
ports:
- containerPort: 3000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
- name: NODE_ENV
value: "production"
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5Krok 3: Service i Ingress
Udostępnij API przez LoadBalancer Service i skonfiguruj Ingress dla HTTPS.
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nodejs-api-service
spec:
type: LoadBalancer
selector:
app: nodejs-api
ports:
- port: 80
targetPort: 3000ingress.yaml (z TLS):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nodejs-api-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- api.example.com
secretName: api-tls-cert
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nodejs-api-service
port:
number: 80Krok 4: Konfiguracja auto-skalowania
hpa.yaml:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nodejs-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nodejs-api
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70Krok 5: Wdrożenie na Kubernetes
# Utwórz namespace kubectl create namespace production # Utwórz secret dla bazy danych kubectl create secret generic db-secret \ --from-literal=url="postgresql://user:pass@db.example.com/mydb" \ -n production # Zastosuj wszystkie manifesty kubectl apply -f deployment.yaml -n production kubectl apply -f service.yaml -n production kubectl apply -f ingress.yaml -n production kubectl apply -f hpa.yaml -n production # Obserwuj wdrożenie kubectl get pods -n production -w # Pobierz IP LoadBalancera kubectl get service nodejs-api-service -n production
Co osiągnęliśmy?
- 3 repliki dla wysokiej dostępności – jeśli jeden Pod padnie, 2 pozostałe obsługują ruch
- Auto-skalowanie od 3 do 10 Podów w oparciu o CPU – automatycznie radzi sobie ze skokami ruchu
- Health checks – Kubernetes automatycznie restartuje niezdrowe Pody
- Limity zasobów – zapobiega sytuacji, gdy jedna aplikacja zużywa wszystkie zasoby węzła
- Zarządzanie sekretami – dane dostępowe do bazy danych przechowywane bezpiecznie
- LoadBalancer Service – publiczny IP dla dostępu z zewnątrz
- Wdrożenie bez przestojów – rolling updates bez przerwy w działaniu usługi
Najlepsze praktyki Kubernetes
Wdrażając aplikacje na Kubernetes, warto stosować sprawdzone praktyki, które zapewnią stabilność, bezpieczeństwo i łatwość utrzymania.
Zarządzanie zasobami
- •Zawsze definiuj resource requests i limits – zapobiega to sytuacji, gdy jedna aplikacja zużywa wszystkie zasoby węzła
- •Używaj LimitRanges w namespaces, aby wymusić minimalne i maksymalne limity zasobów
- •Monitoruj zużycie zasobów regularnie używając
kubectl top
Bezpieczeństwo
- •Używaj external secret managers (Azure Key Vault, AWS Secrets Manager) zamiast przechowywać sekrety w Git
- •Implementuj Network Policies dla kontroli ruchu między Podami (zero-trust networking)
- •Używaj RBAC (Role-Based Access Control) do ograniczenia dostępu do zasobów klastra
- •Skanuj obrazy kontenerów pod kątem podatności (Trivy, Snyk, Azure Defender)
Niezawodność i dostępność
- •Minimum 2 repliki dla production services – zapewnia high availability podczas aktualizacji
- •Definiuj PodDisruptionBudgets – gwarantuje minimalną liczbę działających replik podczas konserwacji
- •Implementuj liveness i readiness probes – automatyczne wykrywanie i restart niezdrow ych Podów
- •Używaj anti-affinity rules – rozprasza repliki po różnych węzłach dla lepszej odporności
Observability i monitoring
- •Setup monitoring od pierwszego dnia – Prometheus, Grafana, lub managed solutions (Azure Monitor, AWS CloudWatch)
- •Centralizuj logi używając ELK Stack, Loki, lub cloud-native logging
- •Implementuj distributed tracing (Jaeger, Zipkin) dla microservices
- •Konfiguruj alerty dla krytycznych metryk (CPU, RAM, błędy, latency)
Zarządzanie konfiguracją
- •Używaj Namespaces do separacji środowisk (dev, staging, prod)
- •Version control dla manifestów – trzymaj wszystkie YAML-e w Git
- •Używaj Helm lub Kustomize dla zarządzania konfiguracją multi-environment
- •Semantic versioning dla images – używaj v1.2.3 zamiast :latest
Najczęstsze błędy w Kubernetes
Kubernetes ma stromą krzywą uczenia. Oto najczęstsze błędy początkujących i jak ich uniknąć.
1. Brak resource limits → OOM kills i downtime
Jeśli nie ustawisz CPU/RAM limits, Pod może zjeść wszystkie zasoby node'a. Kubernetes zabije (OOMKilled) inne Pody, powodując downtime.
Błąd:
containers: - name: app image: my-app:v1 # Brak resources!
Poprawnie:
containers:
- name: app
image: my-app:v1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi2. Secrets w plaintext w Git → security breach
Kubernetes Secrets są base64-encoded, NIE encrypted. Commitowanie Secrets do Git to security risk.
3. Brak health checks → crashujące Pody obsługują ruch
Bez liveness/readiness probes, Kubernetes nie wie, czy Pod jest healthy. Crashujący Pod dalej dostaje traffic → 500 errors dla użytkowników.
livenessProbe: # Restart jeśli endpoint failuje
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe: # Nie kieruj traffic jeśli nie ready
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 10
periodSeconds: 54. :latest image tag → unpredictable deployments
image: my-app:latest może oznaczać różne wersje na różnych nodach. Rollback jest niemożliwy.
image: my-app:v1.2.3 lubimage: my-app:abc12345. Single replica dla critical services → downtime podczas update
replicas: 1 oznacza, że podczas rolling update jest moment, gdy Pod jest offline.
replicas: 2(lub więcej dla high availability). PodDisruptionBudget zapewnia, że minimum 1 replica zawsze działa.6. Brak monitoring → blind deployments
Deploy nowej wersji bez monitoring = nie wiesz, czy działa. Błędy wykrywa dopiero user.
Podsumowanie i kolejne kroki
Kubernetes to rozległy temat. Oto najlepsze zasoby do dalszej nauki.
Oficjalna dokumentacja
- Kubernetes Documentation – Najbardziej aktualna i kompletna dokumentacja
- kubectl Cheat Sheet – Wszystkie najważniejsze komendy w jednym miejscu
- Official Tutorials – Hands-on exercises od podstaw do zaawansowanych
CNCF Resources
- Certified Kubernetes Administrator (CKA) – Oficjalny certyfikat, potwierdzenie umiejętności
- CNCF Landscape – Mapa ekosystemu cloud native (500+ narzędzi)
- CNCF Blog – Case studies, best practices, nowości
Interactive Learning
- Katacoda Kubernetes Scenarios – Interactive browser-based labs
- Killer Coda – Free Kubernetes playground (successor to Katacoda)
- Instruqt Labs – Advanced hands-on labs
Books & Courses
- Kubernetes Up & Running (Brendan Burns, Kelsey Hightower) – Best book dla beginners
- Kubernetes Patterns (Bilgin Ibryam) – Design patterns dla K8s apps
- Kubernetes in Action (Marko Lukša) – Deep dive, 800+ stron
Potrzebujesz pomocy z Kubernetes?
Pomogę Ci wdrożyć Kubernetes w Twojej firmie – od strategii i architektury, przez setup klastra, deployment aplikacji, po training zespołu i long-term support.
Co oferuję?
- ✓ Kubernetes Assessment – czy K8s jest dla Twojej aplikacji?
- ✓ Architecture Design – microservices, networking, storage
- ✓ Cluster Setup – AKS/EKS/GKE, production-ready configuration
- ✓ CI/CD Pipelines – GitHub Actions, GitOps, Helm, ArgoCD
- ✓ Migration – containerization istniejących aplikacji
- ✓ Monitoring & Observability – Prometheus, Grafana, Loki
- ✓ Security – RBAC, Network Policies, Secret Management
- ✓ Training – warsztaty dla zespołu (2-3 dni)
Moje doświadczenie:
- 🚀 30+ produkcyjnych klastrów (AKS, EKS, GKE)
- 📦 200+ zcontainerizowanych aplikacji
- ⚡ Średni czas setup: 1-2 tygodnie (od zero do production)
- 💰 Oszczędności: 30-50% kosztów IT post-migration
- 🎯 Specializacja: microservices, high availability, auto-scaling
- 🇵🇱 Azure Poland region – RODO compliance
- 📈 99.9%+ uptime w projektach produkcyjnych
- 🔒 Security-first approach – zero breaches
📧 Email: hello@wojciechowski.app · Odpowiadam w ciągu 24h
Powiązane artykuły
Źródła
- [1] Microsoft Azure - Oficjalna dokumentacja -https://learn.microsoft.com/en-us/azure/
- [2] Microsoft Learn - Centrum szkoleń Azure -https://learn.microsoft.com/en-us/training/azure/
- [3] Kubernetes - Oficjalna dokumentacja -https://kubernetes.io/docs/
- [4] CNCF Annual Survey 2023 - Stan adopcji Kubernetes -https://www.cncf.io/reports/cncf-annual-survey-2023/
- [5] .NET - Oficjalna dokumentacja Microsoft -https://learn.microsoft.com/en-us/dotnet/
- [6] .NET Blog - Najnowsze informacje i best practices -https://devblogs.microsoft.com/dotnet/
- [7] Next.js - Oficjalna dokumentacja -https://nextjs.org/docs
- [8] React - Dokumentacja -https://react.dev/
- [9] Flexera State of the Cloud Report 2024 -https://www.flexera.com/blog/cloud/cloud-computing-trends-2024-state-of-the-cloud-report/
- [10] FinOps Foundation - Best Practices -https://www.finops.org/
- [11] Gartner - Cloud Computing Research -https://www.gartner.com/en/information-technology/insights/cloud-computing
- [12] AWS - Oficjalna dokumentacja -https://docs.aws.amazon.com/
- [13] Google Cloud - Oficjalna dokumentacja -https://cloud.google.com/docs