Obiectul Deployment în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) apiVersion: apps/v1 / kind: Deployment

Gestionează aplicații stateless replicabile: menține numărul de pod-uri, le înlocuiește când cad și face rolling updates.

Sintaxă comandă
apiVersion: apps/v1 | kind: Deployment | kubectl apply -f deployment.yaml

Ce face Obiectul Deployment

Deployment este cel mai folosit obiect din Kubernetes pentru aplicații web, API-uri, microservicii și workeri fără stare (stateless). În spate, un Deployment creează și controlează un ReplicaSet, care la rândul lui menține în viață numărul dorit de Pod-uri.

Când modifici ceva în spec.template (de exemplu versiunea imaginii), Deployment-ul creează un ReplicaSet nou și mută treptat replicile de pe cel vechi pe cel nou, conform strategiei RollingUpdate (controlată de maxSurge și maxUnavailable). Vechile ReplicaSet-uri sunt păstrate la 0 replici (implicit ultimele 10, prin revisionHistoryLimit) ca să poți face instantaneu kubectl rollout undo.

Legătura critică: toate etichetele din spec.selector.matchLabels trebuie să apară identic în spec.template.metadata.labels, altfel API server-ul va respinge manifestul.

Opțiuni și argumente

Opțiune / Parametru Descriere
spec.replicas Numărul de pod-uri identice care trebuie să ruleze permanent.
spec.selector.matchLabels Selectorul imutabil după care Deployment-ul își recunoaște propriile pod-uri.
spec.strategy.type RollingUpdate (implicit, fără downtime) sau Recreate (oprește toate pod-urile vechi înainte de a le porni pe cele noi).
rollingUpdate.maxSurge / maxUnavailable Câte pod-uri în plus pot fi create și câte pot fi indisponibile în timpul actualizării (număr întreg sau procent, ex. 25%).
spec.template Șablonul complet al Pod-ului (metadata.labels + spec.containers).
spec.revisionHistoryLimit Câte revizii vechi de ReplicaSet sunt păstrate pentru rollback (implicit 10).

Exemple

Exemplul 1: Manifest YAML recomandat pentru un Deployment de producție

Include 3 replici, strategie de rolling update fără scădere de capacitate (maxUnavailable: 0), variabile din ConfigMap/Secret și probe de sănătate.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  namespace: shop
  labels:
    app: api
spec:
  replicas: 3
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: api
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: ghcr.io/exemplu/api:1.4.2
          ports:
            - name: http
              containerPort: 8080
          envFrom:
            - configMapRef:
                name: api-config
            - secretRef:
                name: api-secrets
          resources:
            requests:
              cpu: 200m
              memory: 256Mi
            limits:
              cpu: 1000m
              memory: 512Mi
          readinessProbe:
            httpGet:
              path: /healthz
              port: http
            periodSeconds: 5

Ieșire în terminal

deployment.apps/api created

Greșeli frecvente

  • Modificarea lui spec.selector.matchLabels pe un Deployment existent: câmpul este imutabil; pentru a-l schimba trebuie să ștergi și să recreezi Deployment-ul.
  • Folosirea tag-ului :latest la imagine: nu știi ce versiune rulează în fiecare pod, iar kubectl rollout undo devine inutil.

Comenzi înrudite

  • Obiectul Pod: Cea mai mică unitate de execuție în Kubernetes: unul sau mai multe containere care împart IP-ul și volumele.
  • Obiectul Service: Oferă o adresă IP stabilă, un nume DNS intern și load-balancing către un grup de Pod-uri.
  • kubectl rollout: Monitorizează lansarea unei versiuni noi, revine la o revizie anterioară (undo) sau repornește treptat pod-urile.
  • kubectl scale: Modifică manual numărul de replici al unui Deployment, StatefulSet sau ReplicaSet.
  • kubectl autoscale: Creează un HorizontalPodAutoscaler (HPA) care ajustează automat numărul de replici după consumul de CPU.