En Kubernetes, un ConfigMap es un objeto que almacena datos de configuración en pares clave-valor para que los Pods y contenedores los puedan usar sin necesidad de modificar la imagen del contenedor.
En otras palabras:
- Es como una cajita donde guardas configuraciones (texto, variables, archivos pequeños).
- Separa la configuración del código, para que no tengas que reconstruir imágenes cada vez que cambies un parámetro.
¿Para qué sirve?
Un ConfigMap es útil cuando:
- Tienes variables de entorno que cambian según el entorno (dev, staging, producción).
- Necesitas archivos de configuración (por ejemplo: app.properties, nginx.conf).
- Quieres mantener tu contenedor genérico y pasarle los valores externos al ejecutarlo.
Qué NO es un ConfigMap
- No almacena datos sensibles (para eso existe Secret).
- No es persistente como un volumen; es más como un recurso en memoria gestionado por Kubernetes.
- No es para datos binarios grandes (está pensado para texto o configuraciones pequeñas).
Forma de crear un ConfigMap
1️⃣ Crear un ConfigMap a partir de literales
kubectl create configmap config-from-literal --from-literal=clave=valor --from-literal=ENV=PRODUCCION
Este comando crea un ConfigMap llamado config-from-literal
, con las claves clave
y ENV y sus respectivos valores.
2️⃣ Crear un ConfigMap a partir de un archivo
Primero vamos a crear un directorio llamado 📁 configs
luego creamos el archivo 📃 game.properties
donde colocamos los siguientes datos de tipo clave valor.
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Luego, en el mismo directorio en donde creamos game.properties ejecutamos
kubectl create configmap config-from-file --from-file=game.properties
Respuesta: configmap/config-from-file created
3️⃣ Crear un ConfigMap a partir de un directorio
Usaremos de ejemplo el anterior punto en donde creamos un directorio llamado 📁 configs
, ahora usaremos el archivo 📃 game.properties
y crearemos uno nuevo llamado ui.properties
📃 ui.
properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
Nos deberá quedar algo de la siguiente forma
configs
|_game.properties
|_ui.properties
Luego ejecutamos
kubectl create configmap config-folder --from-file=configs/
Respuesta: configmap/config-folder created
4️⃣ Crear el ConfigMap con YAML
Creamos el archivo 📃 configmap.yaml
y añadimos lo siguiente:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-yaml
data:
APP_MODE: "production"
APP_PORT: "8080"
mensaje.txt: |
Bienvenido a la aplicación
Esto está en un archivo generado por un ConfigMap
Luego ejecutamos
kubectl apply -f configmap.yaml
Respuesta: configmap/config-yaml created
Comandos para gestionar ConfigMaps
1️⃣ Listar ConfigMaps
Podemos listar los configmaps creados con:
kubectl get configmaps
2️⃣ Describir un ConfigMap
kubectl describe configmap <NOMBRE_CONFIGMAP>
3️⃣ Ver contenido de un ConfigMap
kubectl get configmap <NOMBRE_CONFIGMAP> -o json
kubectl get configmap <NOMBRE_CONFIGMAP> -o yaml
4️⃣ Editar un ConfigMap
kubectl edit configmap mi-config
(abre el editor de Kubernetes en consola, generalmente vi o nano)
5️⃣ Actualizar un ConfigMap
Si tienes un archivo YAML:
kubectl apply -f configmap.yaml
Si quieres reemplazar completamente:
kubectl replace -f configmap.yaml
6️⃣ Eliminar un ConfigMap
kubectl delete configmap mi-config
Respuesta: configmap "mi-config" deleted
Ejemplo de uso de ConfigMaps
Escenario, Tendremos:
- Un ConfigMap llamado config-from-yaml en el archivo configmap.yaml que contiene:
- Una variable APP_MODE=production
- Una variable APP_PORT=8080
- Un Pod llamado app-pod en el archivo pod.yaml que:
- Leerá esas variables como variables de entorno.
- Montará también el ConfigMap como un archivo en /config.
Creamos el archivo 📃 configmap.yaml
y añadimos lo siguiente:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-yaml
data:
APP_MODE: "production"
APP_PORT: "8080"
mensaje.txt: |
Bienvenido a la aplicación
Esto está en un archivo generado por un ConfigMap
Crear el Pod con YAML llamado 📃 pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c", "env && echo 'Contenido de /config/mensaje.txt:' && cat /config/mensaje.txt && sleep 3600"]
envFrom:
- configMapRef:
name: config-yaml
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: mi-config
Explicación:
- envFrom: carga todas las claves del ConfigMap como variables de entorno.
- volumeMounts: monta el ConfigMap en /config.
- El contenedor imprime las variables y el contenido del archivo, y luego se queda activo 1 hora para que puedas inspeccionarlo.
Crear el ConfigMap
kubectl apply -f configmap.yaml
Crear el Pod
kubectl apply -f pod.yaml
Verificar que el Pod esté corriendo
kubectl get pods
Respuesta:
NAME READY STATUS RESTARTS AGE
app-pod 1/1 Running 7 (113s ago) 5d21h
Ver logs del Pod (para ver las variables y archivo)
kubectl logs app-pod
Respuesta
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=app-pod
SHLVL=1
HOME=/root
APP_PORT=8080
APP_MODE=production
LOADBALANCER_PORT_3000_TCP_ADDR=10.104.71.25
LOADBALANCER_PORT_3000_TCP_PORT=3000
LOADBALANCER_PORT_3000_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
LOADBALANCER_PORT_3000_TCP=tcp://10.104.71.25:3000
LOADBALANCER_SERVICE_HOST=10.104.71.25
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
mensaje.txt=Bienvenido a la aplicación
Esto está en un archivo generado por un ConfigMap
LOADBALANCER_PORT=tcp://10.104.71.25:3000
LOADBALANCER_SERVICE_PORT=3000
Contenido de /config/mensaje.txt:
Bienvenido a la aplicación
Esto está en un archivo generado por un ConfigMap
💻 Ingresamos al pod a su consola shell
kubectl exec -it app-pod -- sh
Una ves dentro, ejecutamos lo siguiente, buscamos las variables de entrono y como filtro colocamos APP_
env | grep APP_
Respuesta
APP_PORT=8080
APP_MODE=production
Luego procedemos a ver el archivo mesaje.txt en el directorio donde se ha almacenado
cat /config/mensaje.txt
Respuesta
Bienvenido a la aplicación
Esto está en un archivo generado por un ConfigMap
Con esto podemos ver los datos de variables de entorno creadas en el pod que seran usadas por cualquier aplicacion que necesitemos
Por ultimo ejecutamos lo siguiete para borar las pruebas creadas
kubectl delete configmap config-yaml
kubectl delete pod app-pod