Kubernetes (sau K8s) este sistemul open-source standard de facto pentru orchestration-ul containerelor. În practică, el automatizează deploy-ul, scalarea și managementul aplicațiilor distribuite, transformând sute de containere Docker într-un singur cluster coerent. Pentru un inginer DevOps sau Platform Engineer, stăpânirea Kubernetes nu este opțională, ci esențială, deoarece aproape toate mediile de producție moderne rulează pe acest stack. Fără el, gestionarea manuală a instanțelor ar fi imposibilă la scară largă.
Concepte cheie
- Cluster: Ansamblul total de mașini (nodi) care rulează aplicațiile gestionate de Kubernetes, format din noduri master (control plane) și noduri worker.
- Pod: Cea mai mică unitate de calcul, care poate conține unul sau mai multe containere partajând resursele de rețea și stocare.
- Deployment: Obiect care declară starea dorită a aplicației (de exemplu, 3 replica) și se ocupă de actualizările progresive și rollback-uri automate.
- Service: Abstracție care expune o grupă de poduri ca o rețea unică, stabilind load-balancing-ul între ele, indiferent de schimbările IP-ului podurilor.
- Namespace: Mecanism de izolare virtuală în cadrul unui cluster, util pentru separarea mediilor (dev, staging, prod) sau a echipelor.
- ConfigMap & Secret: Resurse pentru decuplarea configurațiilor și datelor sensibile (parole, token-uri) de imaginea containerului.
- Ingress: Reguli de routing HTTP/HTTPS care expun serviciile din cluster către exterior, gestionând adesea TLS și nume de domeniu.
Exemplu practic
Să presupunem că vrei să rulezi o aplicație web simplă. Mai întâi creezi un Deployment care definește câte instanțe (replici) vrei și ce imagine Docker să folosească. Apoi, creezi un Service de tip ClusterIP pentru a le face accesibile intern. În final, configurezi un Ingress pentru a direcționa traficul de la app.exemplu.ro către acel Service. Acest flux declarativ este fundamentul lucrului cu K8s: descrii ce vrei, nu cum să fie realizat pas cu pas.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Greșeli frecvente
- Ignorarea limitelor de resurse: Lăsarea containerelor fără cerințe minime (
requests) și maxime (limits) poate duce la instabilitatea întregului nod sau cluster. - Hardcodarea configurațiilor: Introducerea parametrilor direct în cod sau imagine în loc de a folosi ConfigMaps și Environment Variables, făcând portabilitatea dificilă.
- Lipsa monitorizării: Nu setarea liveness/readiness probes corect poate duce la redirectarea traficului către poduri care nu sunt pregătite sau sunt blocate.
- Abuzul de namespace-uri: Crearea unui singur namespace pentru tot sau, dimpotrivă, a prea multora fără o strategie clară de RBAC și izolare.
Întrebări de interviu
Ce este diferența dintre un Deployment și un StatefulSet? Deployment este pentru aplicații stateless (scalabile orizontal, poduri intercambiabile), în timp ce StatefulSet gestionează aplicații cu stare, asigurând identități stabile și ordinea strictă a pornirii/opririi podurilor (ex: baze de date).
Cum funcționează un Service de tip LoadBalancer? În cloud-uri (AWS, GCP, Azure), Kubernetes cere providerului să provisioneze un load balancer extern public care redirecționează traficul către nodurile worker unde rulează podurile asociate cu acel Service.
Exercițiu
Deschide un cluster local (folosind Minikube, Kind sau Docker Desktop cu K8s activat). Creează un fișier YAML pentru un Deployment care rulează 2 replica de nginx. Aplică configurarea cu kubectl apply. Verifică starea podurilor cu kubectl get pods. Creează apoi un Service de tip NodePort pentru a accesa aplicația din browser folosind IP-ul nodului și portul expus. Documentează pașii și identifică orice eroare apărută la aplicarea manifestelor.