Salve, legioniście! Dotychczas nauczyliśmy się budować obozy legionowe (kontenery Docker) i łączyć je drogami (Docker Compose). Ale Imperium Rzymskie zarządzało dziesiątkami prowincji jednocześnie. Potrzebowało systemu, który automatycznie rozmieszczał legiony, zastępował poległych żołnierzy i skalował siły w odpowiedzi na zagrożenia. W świecie aplikacji, tę rolę pełni Kubernetes (K8s).
Kubernetes to platforma do orkiestracji kontenerów — automatycznie zarządza wdrażaniem, skalowaniem i operowaniem kontenerami na klastrze serwerów. Nazwa pochodzi od greckiego słowa "sternik" — Kubernetes jest sternikiem naszego legionu kontenerów.
1// Analogia: Imperium Rzymskie vs Kubernetes
2interface ImperiumKubernetes {
3 imperator: 'Control Plane'; // Centrum dowodzenia
4 prowincje: 'Nodes (serwery)'; // Maszyny w klastrze
5 legiony: 'Pods'; // Jednostki wdrożeniowe
6 edykty: 'Deployments'; // Deklaracje stanu
7 drogi: 'Services'; // Komunikacja sieciowa
8 bramy: 'Ingress'; // Wejście z zewnątrz
9}
10
11const k8sConcepts = {
12 pod: 'Najmniejsza jednostka — jeden lub więcej kontenerów',
13 deployment: 'Zarządza replikami podów (ile legionów)',
14 service: 'Stały adres sieciowy dla podów',
15 ingress: 'Brama wejściowa z zewnątrz (HTTP/HTTPS)',
16 configMap: 'Konfiguracja bez sekretów (edykty publiczne)',
17 secret: 'Zaszyfrowane dane wrażliwe (tajne depesze)',
18 namespace: 'Izolacja zasobów (prowincje)',
19};Pod to najmniejsza jednostka wdrożeniowa w Kubernetes. Zawiera jeden lub więcej kontenerów, które współdzielą sieć i storage:
1# pod-definition.yaml
2apiVersion: v1
3kind: Pod
4metadata:
5 name: roman-api-pod
6 labels:
7 app: roman-imperium
8 tier: backend
9spec:
10 containers:
11 - name: api
12 image: roman-imperium-api:1.0
13 ports:
14 - containerPort: 4000
15 env:
16 - name: NODE_ENV
17 value: "production"Deployment to deklaracja, jak ma wyglądać nasz stan docelowy. Kubernetes sam dba o to, żeby rzeczywistość odpowiadała deklaracji:
1# deployment.yaml — Wdrożenie API NestJS
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: roman-api
6 labels:
7 app: roman-imperium
8spec:
9 replicas: 3 # 3 legiony (instancje)
10 selector:
11 matchLabels:
12 app: roman-imperium
13 template:
14 metadata:
15 labels:
16 app: roman-imperium
17 spec:
18 containers:
19 - name: api
20 image: roman-imperium-api:1.0
21 ports:
22 - containerPort: 4000
23 resources:
24 requests:
25 memory: "256Mi"
26 cpu: "250m"
27 limits:
28 memory: "512Mi"
29 cpu: "500m"
30 livenessProbe: # Czy legion żyje?
31 httpGet:
32 path: /health
33 port: 4000
34 initialDelaySeconds: 30
35 periodSeconds: 10
36 readinessProbe: # Czy legion gotowy do walki?
37 httpGet:
38 path: /health
39 port: 4000
40 initialDelaySeconds: 5
41 periodSeconds: 5Service zapewnia stały adres sieciowy dla podów, nawet gdy pody są zastępowane:
1# service.yaml — Droga do API
2apiVersion: v1
3kind: Service
4metadata:
5 name: roman-api-service
6spec:
7 selector:
8 app: roman-imperium
9 ports:
10 - protocol: TCP
11 port: 80 # Port zewnętrzny
12 targetPort: 4000 # Port kontenera
13 type: ClusterIP # Dostępny tylko wewnątrz klastraIngress kieruje ruch HTTP/HTTPS z zewnątrz do odpowiednich serwisów:
1# ingress.yaml — Brama Imperium
2apiVersion: networking.k8s.io/v1
3kind: Ingress
4metadata:
5 name: roman-ingress
6 annotations:
7 nginx.ingress.kubernetes.io/rewrite-target: /
8spec:
9 rules:
10 - host: api.roman-imperium.com
11 http:
12 paths:
13 - path: /
14 pathType: Prefix
15 backend:
16 service:
17 name: roman-api-service
18 port:
19 number: 801# configmap.yaml — Publiczna konfiguracja
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: roman-config
6data:
7 NODE_ENV: "production"
8 PORT: "4000"
9 LOG_LEVEL: "warn"
10---
11# secret.yaml — Zaszyfrowane sekrety
12apiVersion: v1
13kind: Secret
14metadata:
15 name: roman-secrets
16type: Opaque
17data:
18 DATABASE: bW9uZ29kYjovL2ltcGVyYXRvcjpyb21hQG1vbmdvZGI6MjcwMTcvaW1wZXJpdW0=
19 JWT_SECRET: c3VwZXItc2VjcmV0LWtleS1jaGFuZ2UtbWU=Horizontal Pod Autoscaler automatycznie skaluje liczbę podów w odpowiedzi na obciążenie:
1# hpa.yaml — Autoskalowanie
2apiVersion: autoscaling/v2
3kind: HorizontalPodAutoscaler
4metadata:
5 name: roman-api-hpa
6spec:
7 scaleTargetRef:
8 apiVersion: apps/v1
9 kind: Deployment
10 name: roman-api
11 minReplicas: 2 # Minimum 2 legiony
12 maxReplicas: 10 # Maksimum 10 legionów
13 metrics:
14 - type: Resource
15 resource:
16 name: cpu
17 target:
18 type: Utilization
19 averageUtilization: 70 # Skaluj przy 70% CPU1# Wdróż zasoby
2kubectl apply -f deployment.yaml
3
4# Sprawdź pody
5kubectl get pods
6
7# Sprawdź deploymenty
8kubectl get deployments
9
10# Logi poda
11kubectl logs roman-api-xxxxx
12
13# Skaluj ręcznie
14kubectl scale deployment roman-api --replicas=5
15
16# Sprawdź status HPA
17kubectl get hpaKubernetes to system zarządzania prowincjami naszego Imperium — automatycznie rozmieszcza legiony, zastępuje poległych i skaluje siły w odpowiedzi na zagrożenia. To fundament nowoczesnej infrastruktury produkcyjnej.