Przejdź do treści głównej

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.

KubernetesDockerkubectlDevOpsCloud Native
Autor: Michał Wojciechowski··23 min czytania
Kubernetes - Container Orchestration Platform

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.

Manualne zarządzanie, przestoje, brak auto-scalingu, chaos przy wysokim obciążeniu.

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.

Automatyzacja, self-healing, zero-downtime deployment, auto-scaling out-of-the-box.

Kluczowe zalety Kubernetes

Auto-scaling: Automatyczne skalowanie w górę/dół w zależności od CPU, RAM lub custom metrics
Self-healing: Automatyczne restarty crashujących kontenerów i przenoszenie na zdrowe nody
Zero-downtime deployment: Rolling updates, blue/green i canary deployment strategies
Service discovery: Automatyczne DNS i load balancing między kontenerami
Declarative configuration: Opisujesz CO chcesz, nie JAK to osiągnąć
Multi-cloud portability: Ten sam manifest działa na AKS, EKS, GKE i on-premise

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
Ważne: Pody są ephemeral (tymczasowe). Mogą być usunięte i odtworzone w każdej chwili. Nigdy nie deployuj Podów bezpośrednio – używaj Deployments!

🚀 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
Automatyczne odtwarzanie crashujących Podów
Rolling update bez przestoju (stopniowa wymiana Podów)
Rollback do poprzedniej wersji jednym poleceniem
History revisions – pełna historia zmian

🌐 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 kontenerze

ClusterIP (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=
Security tip: Używaj external secret managers (Azure Key Vault, AWS Secrets Manager) zamiast przechowywać Secrets w Git. Integracja via CSI driver lub External Secrets Operator.

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?

  1. Wysyłasz manifest Deployment via kubectl → kube-apiserver
  2. etcd zapisuje desired state (3 repliki Poda)
  3. kube-controller-manager wykrywa, że 0/3 Podów istnieje → tworzy 3 Pody
  4. kube-scheduler decyduje, na których nodach uruchomić Pody (node A, B, C)
  5. kubelet na nodach A, B, C otrzymuje instrukcje → uruchamia kontenery
  6. kube-proxy konfiguruje networking, aby Service kierował ruch do tych Podów
  7. 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.

FeatureAzure AKSAWS EKSGoogle GKE
Control PlaneFree (0$)$0.10/hour ($73/mo)Free (1 cluster), potem $0.10/h
Setup time5-10 min15-20 min5 min (najszybszy)
UpgradeAuto-upgrade opcjonalnyManual (via eksctl)Auto-upgrade domyślnie
MonitoringAzure Monitor + Container InsightsCloudWatch + EKS ObservabilityCloud Monitoring (best-in-class)
NetworkingAzure CNI, KubenetVPC CNI, CalicoGKE native (best performance)
Auto-scalingCluster Autoscaler, KEDACluster Autoscaler, KarpenterNode Auto-Provisioning (najlepszy)
Windows containersTak (best support)TakTak (beta)
Best for.NET apps, Microsoft stackNajwiększy ekosystem, startupyPure 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

→ Zobacz pełny przewodnik po AKS w produkcji

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:

Hetzner Cloud: 3x CPX21 (3vCPU, 4GB RAM każdy)~€36/miesiąc
DigitalOcean Kubernetes: 3x 4GB nodes~$36/miesiąc
Civo: Mały klaster (3 nody)~£20/miesiąc
Azure AKS: FREE control plane + 3x Standard_D2s_v3~€150/miesiąc
AWS EKS: $73/m control plane + 3x t3.medium~$200/miesiąc
Google GKE: FREE control plane + 3x e2-medium~€150/miesiąc

Zauważyłeś? Hetzner i DigitalOcean są 4-5x tańsze. Dla małych/średnich projektów często lepszy wybór.

→ Zobacz jak zoptymalizować koszty Azure o 40-60%

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

→ Sprawdź ceny Hetzner Cloud Kubernetes

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

Cloud Infrastructure and Data Centers

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-info

Lista wszystkich Podów

kubectl get pods
kubectl get pods -A # wszystkie namespace'y

Szczegół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.yaml
kubectl apply -f ./manifests/ # cały folder

Quick deploy (bez pliku)

kubectl create deployment my-app --image=nginx:1.25
kubectl expose deployment my-app --port=80 --type=LoadBalancer

Scale deployment

kubectl scale deployment my-app --replicas=5

Update i rollback

Update image (rolling update)

kubectl set image deployment/my-app app=my-app:v2.0

Status rollout

kubectl rollout status deployment/my-app
kubectl rollout history deployment/my-app

Rollback do poprzedniej wersji

kubectl rollout undo deployment/my-app
kubectl rollout undo deployment/my-app --to-revision=2

Debugging

Shell do działającego Poda

kubectl exec -it <pod-name> -- /bin/bash

Port forward (local testing)

kubectl port-forward pod/my-app 8080:80

Teraz: localhost:8080 → Pod port 80

Top resources (CPU/RAM usage)

kubectl top nodes
kubectl top pods

Cleanup

Delete resources

kubectl delete pod <pod-name>
kubectl delete deployment my-app
kubectl delete -f deployment.yaml

Delete 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 update

Blue/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
Use case: E-commerce podczas Black Friday. Deploy nowej wersji do Green, test na internal traffic, przełącz wszystkich użytkowników w 1 sekundę.

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)
Use case: Major feature release w aplikacji bankowej. 5% użytkowników → 24h monitoring → 25% → kolejne 24h → 100%. Jeśli błędy wzrosną – instant rollback.

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: 70

Jak to działa?

  1. CPU usage wzrasta do 85% → HPA wykrywa przekroczenie target (70%)
  2. HPA zwiększa replicas z 2 do 4 (scale-up)
  3. Po 5 minutach load spada do 50% → HPA czeka cooldown (5 min)
  4. 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.

Pod A (10.244.1.5) → Pod B (10.244.2.8) bezpośrednio, nawet jeśli są na różnych nodach

2. Service networking

Service to stabilny DNS name i IP. Ruch do Service jest load-balanced między Pody.

my-app-service.default.svc.cluster.local → round-robin między 3 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: 80

CNI (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 backend

Kiedy 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

Azure App Service / AWS Elastic Beanstalk:PaaS dla monolitów. Deploy via git push, auto-scaling, managed infrastructure. 10x prostsze niż K8s.
Docker Compose + VMs:Dla 2-5 serwisów. Docker Compose definiuje stack, deploy na 1-3 VMs. Brak orchestration, ale wystarczające.
Serverless (Azure Functions / AWS Lambda):Event-driven workloads, APIs, background jobs. Zero infrastructure management, pay per execution.
Platform-as-a-Service (Vercel, Netlify, Render):Frontend + backend w 5 minut. Git push = deploy. Doskonałe dla startupów i MVP.

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 # Windows
brew install minikube # Mac

2. Start cluster

minikube start --driver=docker --cpus=2 --memory=4096

3. Verify

kubectl cluster-info
kubectl get nodes

4. Deploy sample app

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
minikube service nginx # Opens browser

Option 2: Production cluster (Azure AKS)

Managed Kubernetes w Azure. 10 minut setup, production-ready.

1. Install Azure CLI

az login

2. Create resource group

az group create --name myAKSGroup --location polandcentral

3. 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-keys

4. Get credentials

az aks get-credentials --resource-group myAKSGroup --name myAKSCluster

5. Verify

kubectl get nodes

Zobaczysz 3 nody w stanie Ready

Cost: Standard_B2s (2 vCPU, 4GB RAM) = ~$30/node/mo = $90/mo dla 3 nodes + LoadBalancer ~$20/mo = $110/mo total

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: 3000

Deploy:

kubectl apply -f deployment.yaml
kubectl get pods -w # watch status
kubectl get service nodejs-api-service # get LoadBalancer IP

Po 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

Container Shipping - Kubernetes Orchestration Concept

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: 5

Krok 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: 3000

ingress.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: 80

Krok 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: 70

Krok 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: 512Mi

2. Secrets w plaintext w Git → security breach

Kubernetes Secrets są base64-encoded, NIE encrypted. Commitowanie Secrets do Git to security risk.

Best practice: Użyj external secret manager (Azure Key Vault, AWS Secrets Manager) + External Secrets Operator. Secrets są fetchowane runtime, nigdy nie w Git.

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: 5

4. :latest image tag → unpredictable deployments

image: my-app:latest może oznaczać różne wersje na różnych nodach. Rollback jest niemożliwy.

Best practice: Używaj semantic versioning lub commit SHA:image: my-app:v1.2.3 lubimage: my-app:abc1234

5. Single replica dla critical services → downtime podczas update

replicas: 1 oznacza, że podczas rolling update jest moment, gdy Pod jest offline.

Best practice: Minimum 2 repliki dla production: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.

Best practice: Setup observability stack od dnia 1: Prometheus (metrics), Grafana (dashboards), Loki (logs), Jaeger (tracing). Azure Monitor / AWS CloudWatch jeśli managed Kubernetes.

Podsumowanie i kolejne kroki

Kubernetes to rozległy temat. Oto najlepsze zasoby do dalszej nauki.

Oficjalna dokumentacja

CNCF Resources

Interactive Learning

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. [1] Microsoft Azure - Oficjalna dokumentacja -https://learn.microsoft.com/en-us/azure/
  2. [2] Microsoft Learn - Centrum szkoleń Azure -https://learn.microsoft.com/en-us/training/azure/
  3. [3] Kubernetes - Oficjalna dokumentacja -https://kubernetes.io/docs/
  4. [4] CNCF Annual Survey 2023 - Stan adopcji Kubernetes -https://www.cncf.io/reports/cncf-annual-survey-2023/
  5. [5] .NET - Oficjalna dokumentacja Microsoft -https://learn.microsoft.com/en-us/dotnet/
  6. [6] .NET Blog - Najnowsze informacje i best practices -https://devblogs.microsoft.com/dotnet/
  7. [7] Next.js - Oficjalna dokumentacja -https://nextjs.org/docs
  8. [8] React - Dokumentacja -https://react.dev/
  9. [9] Flexera State of the Cloud Report 2024 -https://www.flexera.com/blog/cloud/cloud-computing-trends-2024-state-of-the-cloud-report/
  10. [10] FinOps Foundation - Best Practices -https://www.finops.org/
  11. [11] Gartner - Cloud Computing Research -https://www.gartner.com/en/information-technology/insights/cloud-computing
  12. [12] AWS - Oficjalna dokumentacja -https://docs.aws.amazon.com/
  13. [13] Google Cloud - Oficjalna dokumentacja -https://cloud.google.com/docs

© 2025 Michał Wojciechowski · wojciechowski.app

Kubernetes dla Początkujących - Kompletny Przewodnik 2025 | Wojciechowski.app | Wojciechowski.app