ConfigMaps: configuración desacoplada del código
Un ConfigMap es un recurso de Kubernetes que almacena datos no sensibles en pares clave-valor. Separa la configuración de la imagen del contenedor, permitiendo usar el mismo contenedor en distintos entornos (dev, staging, prod) simplemente cambiando el ConfigMap.
Se pueden crear desde literales, archivos, directorios completos o incluso YAML declarativos.
# Crear ConfigMap con literales
kubectl create configmap app-config --from-literal=DB_HOST=localhost \
--from-literal=DB_PORT=3306 --from-literal=APP_ENV=production
# Crear desde archivo
kubectl create configmap nginx-conf --from-file=nginx.conf
# Ver ConfigMaps
kubectl get configmaps
kubectl describe configmap app-config
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "localhost"
DB_PORT: "3306"
APP_ENV: "production"
nginx.conf: |
server {
listen 80;
server_name itfrontech.com;
root /usr/share/nginx/html;
}
Secrets: datos sensibles cifrados
Los Secrets son similares a los ConfigMaps pero están diseñados para datos sensibles como contraseñas, tokens y claves SSH. En Kubernetes, los valores se almacenan codificados en base64 (no cifrados por defecto, ojo — en producción usa encryptación en etcd).
# Crear Secret con literales
kubectl create secret generic db-credentials \
--from-literal=DB_USER=admin \
--from-literal=DB_PASSWORD=s3cr3tP@ss
# El valor se almacena en base64
kubectl get secret db-credentials -o yaml
# apiVersion: v1
# kind: Secret
# data:
# DB_USER: YWRtaW4=
# DB_PASSWORD: czNjcjN0UEBzcw==
# Crear desde archivo
kubectl create secret generic tls-cert \
--from-file=tls.crt=server.crt \
--from-file=tls.key=server.key
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-backend
spec:
template:
spec:
containers:
- name: backend
image: myapp:1.0
env:
# ConfigMap como variables de entorno
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
# Secret como variable de entorno
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_PASSWORD
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
readOnly: true
- name: tls
mountPath: /etc/nginx/tls
readOnly: true
volumes:
- name: nginx-config
configMap:
name: nginx-conf
- name: tls
secret:
secretName: tls-cert
Un patrón muy común es montar ConfigMaps como volúmenes para archivos de configuración largos (nginx.conf, php.ini) y Secrets para certificados TLS o credenciales de base de datos. Cuando actualizas el ConfigMap o Secret, los pods existentes no lo ven automáticamente a menos que uses un controlador como Reloader o hagas un rollout manual.