Capítulo 5.1 - ConfigMaps
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué es un ConfigMap y por qué utilizarlo
- Crear ConfigMaps de diferentes maneras
- Usar ConfigMaps en sus Pods
- Separar la configuración del código de la aplicación
- Aplicar buenas prácticas para los ConfigMaps
Introducción
En el desarrollo de aplicaciones, la configuración suele cambiar según el entorno (desarrollo, staging, producción). Incrustar la configuración en el código o en las imágenes Docker no es una buena práctica.
Los ConfigMaps permiten separar la configuración del código de la aplicación.
¿Qué es un ConfigMap?
Un ConfigMap es un objeto de Kubernetes que almacena datos de configuración no sensibles en forma de pares clave-valor. Estos datos pueden ser utilizados por los Pods como variables de entorno, argumentos de comando o archivos de configuración.
¿Por qué Usar ConfigMaps?
Problemas Sin ConfigMaps
Problemas:
- Configuración incrustada en el código
- Necesidad de reconstruir la imagen para cambiar la configuración
- Difícil de gestionar diferentes entornos
- No hay separación de responsabilidades
Ventajas Con ConfigMaps
Ventajas:
- Configuración separada del código
- No es necesario reconstruir la imagen
- Fácil de gestionar múltiples entornos
- Reutilizable entre varios Pods
Creación de ConfigMaps
Método 1: Desde Literales
kubectl create configmap app-config \
--from-literal=database_url=postgresql://localhost:5432/mydb \
--from-literal=log_level=info \
--from-literal=max_connections=100
Método 2: Desde un Archivo
Crear un archivo config.properties:
database_url=postgresql://localhost:5432/mydb
log_level=info
max_connections=100
kubectl create configmap app-config --from-file=config.properties
Método 3: Desde un Archivo YAML
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
database_url: "postgresql://localhost:5432/mydb"
log_level: "info"
max_connections: "100"
# Fichier complet
application.properties: |
server.port=8080
server.host=0.0.0.0
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
Uso en los Pods
Método 1: Variables de Entorno (Una Clave)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database_url
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
Método 2: Todas las Claves (envFrom)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- configMapRef:
name: app-config
Resultado: Todas las claves del ConfigMap se convierten en variables de entorno.
Método 3: Como Volumen (Archivos)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: config
configMap:
name: app-config
Resultado: Cada clave se convierte en un archivo en /etc/config/ con el valor como contenido.
Ejemplo Completo
Paso 1: Crear el ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: webapp-config
data:
# Variables simples
APP_NAME: "My Web Application"
APP_VERSION: "1.0.0"
ENVIRONMENT: "production"
# Archivo de configuración
nginx.conf: |
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
index index.html;
}
Paso 2: Usar en un Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:1.20
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: webapp-config
key: APP_NAME
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: webapp-config
key: ENVIRONMENT
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: nginx-config
configMap:
name: webapp-config
items:
- key: nginx.conf
path: default.conf
Casos de Uso
1. Configuración de Aplicaciones
apiVersion: v1
kind: ConfigMap
metadata:
name: app-settings
data:
database_host: "db.example.com"
database_port: "5432"
cache_ttl: "3600"
feature_flags: "feature1,feature2"
2. Archivos de Configuración
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
}
3. Scripts
apiVersion: v1
kind: ConfigMap
metadata:
name: init-scripts
data:
init.sh: |
#!/bin/bash
echo "Initializing application..."
/app/setup.sh
exec /app/start.sh
Buenas Prácticas
1. Organización por Entorno
Crear ConfigMaps separados para cada entorno:
# Desarrollo
kubectl create configmap app-config-dev --from-file=config-dev.properties
# Producción
kubectl create configmap app-config-prod --from-file=config-prod.properties
2. Versionado
Utilizar labels para versionar:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
labels:
version: v1
environment: production
data:
# ...
3. No Almacenar Datos Sensibles
Nunca ponga en un ConfigMap:
- Contraseñas
- Tokens de API
- Claves privadas
- Certificados
Utilice Secrets en su lugar.
Comandos Útiles
Ver un ConfigMap
kubectl get configmap app-config
kubectl describe configmap app-config
kubectl get configmap app-config -o yaml
Modificar un ConfigMap
kubectl edit configmap app-config
Nota: Los Pods existentes no verán los cambios inmediatamente. Es necesario reiniciarlos.
Eliminar un ConfigMap
kubectl delete configmap app-config
Limitaciones
Tamaño Máximo
- 1 MiB por entrada en un ConfigMap
- Total limitado por etcd (generalmente ~1.5 MiB por objeto)
Actualización
- Variables de entorno: No cambian sin reiniciar el Pod
- Volúmenes: Se actualizan periódicamente (retraso de algunos segundos)
Resumen
En este capítulo, usted ha aprendido:
ConfigMap: Objeto de Kubernetes para almacenar configuración no sensible
Creación: kubectl create, YAML, desde archivos
Uso: Variables de entorno (env/envFrom) o volúmenes
Ventajas: Separación config/código, flexibilidad, reutilización
Buenas prácticas: Organización por entorno, versionado, no almacenar secretos
Limitaciones: Tamaño máximo, actualización requiere reinicio para variables de entorno
Próximos Pasos
Capítulo 5.2: Secrets - Gestión de datos sensibles
Lab 5.1: Creación y Uso de ConfigMaps
Capítulo creado el: Diciembre 2024