Despliegues Parametrizados: ConfigMaps y Secrets
Resumen de una línea
ConfigMap y Secret permiten parametrizar Deployments sin cambiar imágenes: configuración, credenciales y variables de entorno separadas del código.
Información
- Fuente: Curso Kubernetes - Módulo 7
- URL GitHub: https://github.com/iesgn/curso_kubernetes_cep/tree/main/modulo7
Problema: Configuración Hardcodeada
# Dockerfile
FROM python:3.9
ENV DB_PASSWORD=secret123 ❌ Hardcodeado
ENV DB_HOST=prod-db ❌ HardcodeadoProblemas:
- ❌ Misma imagen para dev/prod
- ❌ Cambios requieren rebuild
- ❌ Secretos en imágenes
Solución: ConfigMaps y Secrets
ConfigMap: Configuración
Definición
ConfigMap almacena datos no sensibles como pares clave-valor:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "postgres.default.svc"
DATABASE_PORT: "5432"
APP_ENV: "production"
LOG_LEVEL: "info"Uso en Deployment
spec:
containers:
- name: app
image: myapp:1.0
envFrom:
- MapRef:
name: app-config
# Inyecta todas las vars del ConfigMapOperaciones
# Crear ConfigMap
kubectl create configmap app-config --from-literal=DB_HOST=localhost
# Ver ConfigMaps
kubectl get configmaps
kubectl describe configmap app-config
# Editar
kubectl edit configmap app-config
# Eliminar
kubectl delete configmap app-configSecret: Datos Sensibles
Definición
Secret almacena datos sensibles (contraseñas, tokens, certificados):
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
password: cGFzc3dvcmQxMjM= # base64 encoded
username: YWRtaW4= # base64 encodedTipos de Secrets
Tipo Uso
Opaque Datos genéricos (default)
kubernetes.io/basic-auth Usuario/contraseña
kubernetes.io/ssh-auth SSH keys
kubernetes.io/tls Certificados TLS
kubernetes.io/dockercfg Docker config
Uso en Deployment
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: passwordOperaciones
# Crear Secret
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123
# Ver Secrets
kubectl get secrets
kubectl describe secret db-secret
# Decodificar (base64)
kubectl get secret db-secret -o jsonpath='{.data.password}' base64 -dComparación
Aspecto ConfigMap Secret
Datos Públicos Sensibles Tamaño Hasta 1MB Hasta 1MB Encoding Plaintext Base64 Caso de uso Config, URLs Credenciales, tokens
Uso de Variables de Entorno
Directa
env:
- name: APP_NAME
value: "myapp"Desde ConfigMap
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DATABASE_HOSTDesde Secret
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: passwordTodas desde ConfigMap
envFrom:
- MapRef:
name: app-configCaso de Uso: WordPress + MariaDB
# ConfigMap para WordPress
apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
data:
WORDPRESS_DB_HOST: "mariadb:3306"
WORDPRESS_DB_NAME: "wordpress"
WORDPRESS_TABLE_PREFIX: "wp_"
# Secret para credenciales
apiVersion: v1
kind: Secret
metadata:
name: wordpress-secret
type: Opaque
data:
WORDPRESS_DB_USER: d29yZHByZXNz # base64(wordpress)
WORDPRESS_DB_PASSWORD: cGFzc3dvcmQ= # base64(password)
WORDPRESS_AUTH_KEY: ...
# Deployment usa ambos
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
template:
spec:
containers:
- name: wordpress
image: wordpress:5.9
envFrom:
- MapRef:
name: wordpress-config
- Ref:
name: wordpress-secretRelaciones
Conecta con
- Deployments: Ciclo de Vida Completo — Usa ConfigMaps/Secrets
- Services: Acceso a Aplicaciones — Acceso a apps configuradas