Introducción
Un ConfigMap permite almacenar configuraciones no sensibles por separado de la imagen del contenedor. Esto le permite reutilizar la misma imagen de aplicación con diferentes ajustes, como el modo de desarrollo, el nivel de registro (logging), los indicadores de funciones (feature flags) o los nombres de los puntos finales (endpoints).
En este laboratorio, creará un ConfigMap, inspeccionará sus datos, lo utilizará para configurar un Pod, actualizará el ConfigMap y volverá a crear el Pod para que adopte los nuevos valores. Los laboratorios posteriores profundizarán en la configuración específica de variables de entorno y archivos de configuración montados; este laboratorio se centra en el objeto ConfigMap y en el flujo de trabajo fundamental de configuración de aplicaciones.
Preparar un espacio de nombres para ConfigMap
En este paso, preparará un espacio de nombres (namespace) limpio para practicar con ConfigMaps.
Comience en /home/labex/project. Escribirá un manifiesto de Pod en este directorio.
mkdir -p /home/labex/project
cd /home/labex/project
Compruebe que el servidor de API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y el nodo aún no está listo, espere unos segundos y vuelva a ejecutar el comando.
kubectl get nodes --request-timeout=5s
La salida esperada incluye:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Espere a que el Pod de red del clúster esté listo (Ready) antes de crear objetos de aplicación.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Salida esperada:
pod/calico-node-... condition met
Cree un espacio de nombres llamado ckad-prep-configmaps:
kubectl create namespace ckad-prep-configmaps
Establezca este espacio de nombres como el espacio de nombres del contexto actual:
kubectl config set-context --current --namespace=ckad-prep-configmaps
Confirme el espacio de nombres actual:
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Salida esperada:
ckad-prep-configmaps
Crear e inspeccionar un ConfigMap
En este paso, creará un ConfigMap que contenga ajustes sencillos de la aplicación.
El comando kubectl create configmap puede crear un ConfigMap directamente a partir de pares clave-valor literales. Cada indicador --from-literal añade una entrada bajo el campo data del ConfigMap.
kubectl create configmap app-settings \
--from-literal=APP_MODE=dev \
--from-literal=LOG_LEVEL=debug \
--from-literal=FEATURE_BANNER=enabled
Salida esperada:
configmap/app-settings created
Inspeccione el resumen del ConfigMap:
kubectl get configmap app-settings
Salida esperada:
NAME DATA AGE
app-settings 3 ...
Lea los valores almacenados. jsonpath imprime los campos seleccionados sin mostrar el objeto completo.
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
Salida esperada:
dev debug enabled
También puede ver el ConfigMap en formato YAML para observar dónde residen las claves en el objeto.
kubectl get configmap app-settings -o yaml
La salida esperada incluye:
data:
APP_MODE: dev
FEATURE_BANNER: enabled
LOG_LEVEL: debug
Configurar un Pod a partir del ConfigMap
En este paso, iniciará un Pod que lee los valores del ConfigMap como variables de entorno.
El campo envFrom.configMapRef importa todas las claves de un ConfigMap al entorno del contenedor. Esta es una forma compacta de conectar un pequeño conjunto de ajustes no sensibles a una aplicación.
Cree config-reader-pod.yaml:
cat > config-reader-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: config-reader
labels:
app: config-reader
spec:
terminationGracePeriodSeconds: 0
containers:
- name: reader
image: busybox:1.36
command:
- /bin/sh
- -c
- 'echo mode=${APP_MODE}; echo level=${LOG_LEVEL}; echo banner=${FEATURE_BANNER}; sleep 3600'
envFrom:
- configMapRef:
name: app-settings
EOF
Aplique el manifiesto del Pod:
kubectl apply -f config-reader-pod.yaml
Salida esperada:
pod/config-reader created
Espere a que el Pod esté listo (Ready):
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
Salida esperada:
pod/config-reader condition met
Lea los registros (logs) del Pod. La aplicación imprime los valores que provienen del ConfigMap.
kubectl logs config-reader -c reader
Salida esperada:
mode=dev
level=debug
banner=enabled
Actualizar el ConfigMap y volver a crear el Pod
En este paso, actualizará el ConfigMap y volverá a crear el Pod para que el contenedor reciba los nuevos valores.
Cuando un ConfigMap se utiliza como variables de entorno, el contenedor en ejecución no cambia automáticamente su entorno. Debe iniciarse un nuevo contenedor para leer los valores actualizados. Este es un detalle importante para el CKAD, ya que es posible que necesite actualizar la configuración y luego reiniciar o volver a crear la carga de trabajo.
Aplique un parche (patch) al ConfigMap:
kubectl patch configmap app-settings --type merge --patch '{"data":{"APP_MODE":"prod","LOG_LEVEL":"warn","FEATURE_BANNER":"disabled"}}'
Salida esperada:
configmap/app-settings patched
Confirme los nuevos valores del ConfigMap:
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
Salida esperada:
prod warn disabled
Elimine el Pod antiguo:
kubectl delete pod config-reader
La salida esperada incluye:
pod "config-reader" deleted
Vuelva a crear el Pod a partir del mismo manifiesto y espere a que esté listo:
kubectl apply -f config-reader-pod.yaml
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
Salida esperada:
pod/config-reader created
pod/config-reader condition met
Lea los registros de nuevo. El nuevo Pod ahora ve los valores actualizados del ConfigMap.
kubectl logs config-reader -c reader
Salida esperada:
mode=prod
level=warn
banner=disabled
Resumen
Ha creado un ConfigMap, inspeccionado sus datos, lo ha conectado a un Pod de aplicación, ha actualizado el ConfigMap y ha vuelto a crear el Pod para que el contenedor adoptara los nuevos valores. Esto le proporciona el flujo de trabajo fundamental de ConfigMap antes de avanzar hacia patrones más detallados de variables de entorno y montaje de archivos en laboratorios posteriores.


