Sobes.tech
Junior

Se păstrează vreo stare atunci când facem deployment?

sobes.tech AI

Răspuns de la AI

Atunci când implementați un Deployment în Kubernetes, starea nu este păstrată în interiorul controller-ului Deployment însuși. Deployment gestionează un ReplicaSet, care, la rândul său, gestionează Pod-urile. Pod-urile sunt, prin natura lor, efemere și pot fi repornite sau eliminate.

Păstrarea stării pentru aplicațiile implementate cu Deployment se realizează de obicei prin alte mecanisme:

  • Persistent Volumes (PV) și Persistent Volume Claims (PVC): Folosite pentru a stoca date care trebuie să rămână accesibile chiar și după ștergerea sau repornirea Pod-urilor. PV oferă stocare, iar PVC o solicită.
  • ConfigMaps și Secrets: Folosite pentru a stoca date de configurare și informații sensibile (parole, chei), separate de imaginea containerului.
  • StatefulSets: Un controller special conceput pentru gestionarea aplicațiilor cu stare. StatefulSets garantează o identificare de rețea stabilă și stocare persistentă pentru fiecare Pod, precum și implementare și scalare ordonată.

Exemplu de solicitare PVC într-un manifest de Pod:

# Definirea unui Pod care utilizează PVC
apiVersion: v1
kind: Pod
metadata:
  name: aplicație-cu-stare
spec:
  containers:
  - name: containerul-meu
    image: imaginea-mea
    volumeMounts:
    - name: volumul-de-date
      mountPath: /date
  volumes:
  - name: volumul-de-date
    persistentVolumeClaim:
      claimName: pvc-ul-meu

Exemplu de definire a StatefulSet:

# Definirea unui StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: "serviciul-meu"
  replicas: 3
  selector:
    matchLabels:
      app: aplicație-cu-stare
  template:
    metadata:
      labels:
        app: aplicație-cu-stare
    spec:
      containers:
      - name: containerul-meu
        image: imaginea-mea
        volumeMounts:
        - name: volumul-meu
          mountPath: /date
  volumeClaimTemplates:
  - metadata:
      name: volumul-meu
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Prin urmare, Deployment-ul în sine nu păstrează starea. Sarcina sa este de a asigura numărul necesar de replici de Pod-uri fără a păstra identitatea sau starea lor între reporniri. Pentru aplicațiile cu stare, se utilizează StatefulSets, PV/PVC, ConfigMaps și Secrets.