ConfigMap și Secret în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) apiVersion: v1 / kind: ConfigMap | Secret

Separă configurația și datele sensibile (parole, tokenuri, chei TLS) de imaginea containerului.

Sintaxă comandă
apiVersion: v1 | kind: ConfigMap | kind: Secret | kubectl get cm,secret

Ce face ConfigMap și Secret

O regulă de bază în lucrul cu containere este să nu împachetezi URL-uri de mediu, fișiere de configurare sau parole în interiorul imaginii Docker. Kubernetes oferă două obiecte pereche pentru asta: ConfigMap (pentru date neconfidențiale: host-uri, flag-uri, fișiere nginx.conf) și Secret (pentru parole, chei API, certificate TLS).

Ambele pot fi consumate într-un Pod în două moduri: 1) ca variabile de mediu (toate cheile odată cu envFrom sau câte o cheie cu valueFrom); 2) ca fișiere montate într-un volum (fiecare cheie devine un fișier în directorul montat, actualizat automat de kubelet când modifici ConfigMap-ul, cu excepția montărilor cu subPath).

Atenție: în Secret, câmpul data conține valori codificate în Base64 (sau poți scrie text clar în stringData și API server-ul îl codifică automat). Base64 nu este criptare! Oricine are drept RBAC de get secrets le poate decodifica cu base64 -d. Pentru stocarea în Git folosește SealedSecrets, SOPS sau External Secrets Operator.

Opțiuni și argumente

Opțiune / Parametru Descriere
data (în ConfigMap) Dicționar cheie: valoare în text clar (inclusiv fișiere multi-linie cu |).
data / stringData (în Secret) data așteaptă valori în Base64; stringData acceptă text clar la scriere.
type (în Secret) Opaque (implicit), kubernetes.io/tls, kubernetes.io/dockerconfigjson.
immutable: true Blochează modificările ulterioare și reduce încărcarea pe API server/kubelet (K8s 1.21+).
envFrom / env[].valueFrom Injectează cheile ca variabile de mediu la pornirea containerului.
volumes[].configMap / secret Montează cheile ca fișiere într-un director din container.

Exemple

Exemplul 1: Manifest YAML cu ConfigMap, Secret și montarea lor în Pod

Folosim separatorul YAML --- pentru a pune ambele obiecte în același fișier.

apiVersion: v1
kind: ConfigMap
metadata:
  name: api-config
  namespace: shop
data:
  LOG_LEVEL: "info"
  CACHE_TTL: "300"
  app.toml: |
    [server]
    port = 8080
    timeout = "10s"
---
apiVersion: v1
kind: Secret
metadata:
  name: api-secrets
  namespace: shop
type: Opaque
stringData:
  DATABASE_URL: "postgres://user:parolaSecreta@postgres:5432/shop"

Ieșire în terminal

configmap/api-config created
secret/api-secrets created

Exemplul 2: Decodificarea unei chei dintr-un Secret existent

kubectl get secret api-secrets -n shop -o jsonpath="{.data.DATABASE_URL}" | base64 -d && echo

Ieșire în terminal

postgres://user:parolaSecreta@postgres:5432/shop

Greșeli frecvente

  • Modificarea unui ConfigMap sau Secret folosit prin variabile de mediu (env / envFrom) nu actualizează procesele deja pornite; trebuie să rulezi kubectl rollout restart deployment/NUME.
  • Comiterea în clar în Git a unui fișier YAML cu kind: Secret.

Comenzi înrudite

  • kubectl create: Creează imperativ o resursă nouă din fișier sau direct din argumente în linia de comandă.
  • Obiectul Deployment: Gestionează aplicații stateless replicabile: menține numărul de pod-uri, le înlocuiește când cad și face rolling updates.
  • Obiectul Pod: Cea mai mică unitate de execuție în Kubernetes: unul sau mai multe containere care împart IP-ul și volumele.
  • kubectl rollout: Monitorizează lansarea unei versiuni noi, revine la o revizie anterioară (undo) sau repornește treptat pod-urile.