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ă rulezikubectl 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.