Configurar aplicaciones con ConfigMaps

KubernetesBeginner
Practicar Ahora

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.