No quieres reconstruir la imagen para cambiar una URL. ConfigMap y Secret existen para separar configuración de código.
Pero hay una diferencia peligrosa entre “funciona” y “está seguro”. Un Secret con minioadmin ya derribó un deploy nuestro — y el guard estaba en lo cierto.
Sello del curso: probado en Kubernetes 1.35.
ConfigMap: configuración no sensible
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
LOG_LEVEL: info
features.json: |
{"novoCheckout": true}
Tres formas de consumir:
# 1) variável individual
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
# 2) todas as chaves como variáveis
envFrom:
- configMapRef:
name: app-config
# 3) arquivo montado
volumes:
- name: config
configMap:
name: app-config
Secret: configuración sensible (con reservas)
kubectl create secret generic app-secret \
--from-literal=DB_PASSWORD='...' \
--from-literal=API_TOKEN='...'
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
Base64 no es cifrado. Cualquier persona con get secret ve el valor. La seguridad de Secret depende de:
- RBAC restrictivo.
- Cifrado del etcd en reposo.
- No versionar secrets en Git.
- Rotación.
ConfigMap/Secret en volumen
Montaje como archivo:
volumes:
- name: secret
secret:
secretName: app-secret
Cada clave se convierte en un archivo. Las actualizaciones en ConfigMap/Secret se propagan al volumen (con retraso), pero no a las variables de entorno ya inyectadas. Si la aplicación lee env en el arranque, necesita reiniciarse.
immutable: true impide alteraciones y reduce la carga en el kubelet; útil para configuraciones versionadas.
El guard de credenciales
Un guard de producción verifica si contraseñas por defecto conocidas están en uso. Ejemplo real:
INF-SEC-01: credenciais default/segredo ausente detetados em produção
(app.storage.s3.accessKey, app.storage.s3.secretKey).
La app se negó a subir porque el secret tenía minioadmin. El guard tenía razón; el cluster estaba equivocado.
Lección práctica: preflight en el pipeline. Antes de cambiar la imagen:
VAL=$(kubectl -n portal get secret portal-secrets \
-o jsonpath='{.data.APP_STORAGE_S3_ACCESSKEY}' | base64 -d)
[ "$VAL" != "minioadmin" ] || { echo "credencial default"; exit 1; }
Rotación sin downtime
- Cree la nueva credencial en el proveedor (MinIO, banco, API).
- Actualice el Secret.
- Reinicie los pods que leen env (rolling update).
- Valide.
- Revoque la antigua.
Para secretos que no pueden coexistir, planee una ventana. Para los que soportan múltiples claves, haga rotación gradual.
Alternativas al Secret nativo
| Herramienta | Idea |
|---|---|
| Sealed Secrets | secret cifrado en Git |
| External Secrets Operator | busca en Vault/AWS/GCP |
| SOPS | cifrado en el repositorio |
| Vault Agent Injector | inyecta secreto en runtime |
El objetivo es el mismo: el valor real no queda en texto claro en Git.
Laboratorio
- Cree ConfigMap y Secret.
- Inyecte como env y como volumen.
- Cambie el ConfigMap y vea el archivo actualizar (y el env no).
- Intente subir un pod con
secretKeyRefpara una clave inexistente — vea el error. - Decodifique el Secret y compruebe que base64 no protege.
Errores comunes
| Síntoma | Causa |
|---|---|
CreateContainerConfigError |
clave del Secret/ConfigMap ausente |
| App no ve cambio | env inyectado en el arranque; necesita restart |
illegal base64 data |
valor inválido en el Secret |
Archivo con \r |
CRLF en el valor |
| Secret en Git | fuga; rote |
| Guard derriba el pod | credencial por defecto en producción |
Checklist
- [ ] Configuración no sensible en ConfigMap.
- [ ] Secretos en Secret con RBAC restringido.
- [ ] etcd con cifrado en reposo.
- [ ] Ningún secret en texto claro en Git.
- [ ] Plan de rotación documentado.
- [ ] Preflight de credenciales en el pipeline.
- [ ] Sé que base64 no es cifrado.
Glosario
- ConfigMap: configuración no sensible.
- Secret: objeto para datos sensibles.
- envFrom: importa todas las claves como env.
- immutable: objeto inmutable.
- External Secrets: operador que sincroniza secretos externos.
- etcd encryption: cifrado del estado en reposo.
Próximo
Ahora que la configuración está bajo control, vamos a observar el cluster: metrics-server, Prometheus, Grafana y las señales que realmente importan.
Próximo: Curso Kubernetes 13 — Observabilidad: metrics-server, Prometheus y Grafana
Seguir leyendo
Lea también
ArmazenamentoManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario