Ce este Kubernetes?

Subiect din roadmap-ul Kubernetes · parte din „Introducere”

Kubernetes (cunoscut adesea ca K8s) este un sistem open-source de orchestration a containerelor, conceput inițial de Google și acum menținut de Cloud Native Computing Foundation. În practică, el automatizează deploy-ul, scalarea și managementul aplicațiilor rulează în containere, eliminând necesitatea configurării manuale a serverelor. Pentru un inginer DevOps sau SRE, stăpânirea Kubernetes este esențială deoarece aproape toate mediile de producție moderne îl utilizează pentru a asigura disponibilitatea și reziliența serviciilor critice. Fără el, gestionarea sute de microservicii ar fi imposibil de scalat eficient.

Concepte cheie

  • Pod: Cea mai mică unitate deployabilă în Kubernetes, care poate conține unul sau mai multe containere care partajează resursele de rețea și stocare.
  • Node: Un server fizic sau virtual care face parte din clusterul Kubernetes și găzduiește podurile.
  • Deployment: O resursă care gestionează rularea replicilor unei aplicații, permițând actualizări fărăowntime prin strategii precum Rolling Update.
  • Service: Un mecanism abstract care expune o grupă de poduri ca o singură adresă de rețea stabilă, esențială pentru comunicarea internă.
  • Namespace: O modalitate de a împărți un cluster fizic în mai multe clusteruri virtuale, util pentru izolarea echipelor sau mediilor (dev/staging/prod).
  • ConfigMap & Secret: Resurse separate pentru configurarea aplicațiilor, unde ConfigMap stochează date necriptate, iar Secret date sensibile.
  • Ingress: Un obiect care gestionează accesul extern la servicii din cluster, adesea combinat cu un controller pentru rute bazate pe domenii.

Exemplu practic

Un scenariu real implică rularea unei aplicații web simple. Mai întâi, creezi un Deployment care specifică imaginea Docker și numărul de replicați. Apoi, definești un Service de tip ClusterIP pentru a expune aplicația intern. În final, folosești un Ingress pentru a direcționa traficul de la app.exemplu.ro către acest service. Acest flux asigură că aplicația este accesibilă publicului și se scalează automat la cerere.

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

  1. Ignorarea limitelor de resurse: Lăsarea containerelor să consume toată memoria CPU a nodului poate duce la crasarea altor poduri critice.
  2. Lipsa liveness/readiness probes: Fără aceste verificări, Kubernetes nu știe când un container este mort sau nu este pregătit să primească trafic, trimițând cereri către instanțe nefuncționale.
  3. Hardcodarea configurațiilor: Stocarea variabilelor de mediu direct în imagine sau cod face deploy-ul rigid și dificil de auditat.
  4. Utilizarea namespace-ului default: Toate resursele în namespace-ul default se amestecă, creând riscuri de securitate și confuzie în management.

Întrebări de interviu

Care este diferența dintre un Pod și un Container? Un container este o instanță rulantă a unei imagini Docker, în timp ce un Pod este un grup logic de unul sau mai multe containere care partajează spațiul de adrese IP și volume. Kubernetes operează la nivel de Pod, nu direct la nivel de container.

Ce se întâmplă dacă un Pod moare? Controller-ul Deployment detectează dispariția Pod-ului și creează automat unul nou pentru a menține numărul dorit de replicați, asigurând astfel reziliența aplicației.

Cum funcționează scalarea automată? Horizontal Pod Autoscaler (HPA) monitorizează metrici precum utilizarea CPU sau memoria și ajustează numărul de replicați ai unui Deployment în funcție de trafic, bazându-se pe date furnizate de Metrics Server.

Exercițiu

Instalează minikube sau kind pe mașina ta locală. Creează un fișier YAML pentru un Deployment care rulează 3 replicați de nginx. Adaugă un Service de tip NodePort pentru a expune aplicația pe portul 80. Verifică dacă podurile sunt în stare Running folosind kubectl get pods. Accesează aplicația din browser folosind IP-ul nodului și portul expus. Documentează pașii și identifică orice eroare apărută în logs (kubectl logs).

Resurse gratuite

Alte subiecte din „Introducere”