# ConfigMaps

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

<p><p>Un configmap es  un objeto de la API utilizado para almacenar datos no confidenciales en el formato clave-valor. Los <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a> pueden utilizar los ConfigMaps como variables de entorno, argumentos de la linea de comandos o como ficheros de configuración en un <a class='glossary-tooltip' title='Un directorio que contiene datos y que es accesible desde los contenedores corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/storage/volumes/' target='_blank' aria-label='Volumen'>Volumen</a>.</p></p>
<p>Un ConfigMap te permite desacoplar la configuración de un entorno específico de una imagen de contenedor, así las aplicaciones son fácilmente portables.</p>

<div class="alert alert-caution" role="note"><h4 class="alert-heading">Precaución:</h4>ConfigMap no proporciona encriptación.
Si los datos que quieres almacenar son confidenciales, utiliza un
<a class='glossary-tooltip' title='Almacena información sensible, como contraseñas, tokens OAuth o claves ssh.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/configuration/secret/' target='_blank' aria-label='Secret'>Secret</a> en lugar de un ConfigMap,
o utiliza otras herramientas externas para mantener los datos seguros.</div>




<!-- body -->
## Motivo

Utiliza un ConfigMap para crear una configuración separada del código de la aplicación.

Por ejemplo, imagina que estás desarrollando una aplicación que puedes correr en
tu propio equipo (para desarrollo) y en el cloud (para mantener tráfico real).
Escribes el código para configurar una variable llamada `DATABASE_HOST`.
En tu equipo configuras la variable con el valor `localhost`. 
En el cloud, la configuras con referencia a un kubernetes
<a class='glossary-tooltip' title='Un Service, servicio en castellano, es el objeto de la API de Kubernetes que describe cómo se accede a las aplicaciones, tal como un conjunto de Pods, y que puede describir puertos y balanceadores de carga.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/services-networking/service/' target='_blank' aria-label='Service'>Service</a>  que expone el componente
de la base de datos en tu cluster.

Esto permite tener una imagen corriendo en un cloud y
tener el mismo código localmente para checkearlo si es necesario.

## Objeto ConfigMap

Un ConfigMap es un [objeto](/docs/concepts/overview/working-with-objects/kubernetes-objects/) de la API
que permite almacenar la configuración de otros objetos utilizados. Aunque muchos
objetos de kubernetes que tienen un `spec`, un ConfigMap tiene una sección `data` para
almacenar items, identificados por una clave, y sus valores.

El nombre del ConfigMap debe ser un 
[nombre de subdominio DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names) válido.

## ConfigMaps y Pods

Puedes escribir un Pod `spec` y referenciarlo a un ConfigMap y configurar el contenedor(es)
de ese <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> en base a los datos del ConfigMap. El <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> y el ConfigMap deben estar en
el mismo <a class='glossary-tooltip' title='Abstracción utilizada por Kubernetes para soportar múltiples clústeres virtuales en el mismo clúster físico.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/overview/working-with-objects/namespaces/' target='_blank' aria-label='Namespace'>Namespace</a>.

Este es un ejemplo de ConfigMap que tiene algunas claves con un valor simple,
y otras claves donde el valor tiene un formato de un fragmento de configuración.

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # property-like keys; each key maps to a simple value
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"
  #
  # file-like keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
```
Hay cuatro maneras diferentes de usar un ConfigMap para configurar
un contenedor dentro de un <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>:

1. Argumento en la linea de comandos como entrypoint de un contenedor
1. Variable de entorno de un contenedor
1. Como fichero en un volumen de solo lectura, para que lo lea la aplicación
1. Escribir el código para ejecutar dentro de un <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> que utiliza la API para leer el ConfigMap

Estos diferentes mecanismos permiten utilizar diferentes métodos para modelar
los datos que se van a usar.
Para los primeros tres mecanismos, el
<a class='glossary-tooltip' title='Agente que se ejecuta en cada nodo de un clúster. Se asegura de que los contenedores estén corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/generated/kubelet' target='_blank' aria-label='kubelet'>kubelet</a> utiliza la información
del ConfigMap cuando lanza un contenedor (o varios) en un <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>.

Para el cuarto método, tienes que escribir el código para leer el ConfigMap y sus datos.
Sin embargo, como estás utilizando la API de kubernetes directamente, la aplicación puede
suscribirse para obtener actualizaciones cuando el ConfigMap cambie, y reaccionar 
cuando esto ocurra. Accediendo directamente a la API de kubernetes, esta
técnica también permite acceder al ConfigMap en diferentes namespaces.

En el siguiente ejemplo el Pod utiliza los valores de `game-demo` para configurar el contenedor:
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: game.example/demo-game
      env:
        # Define the environment variable
        - name: PLAYER_INITIAL_LIVES # Notice that the case is different here
                                     # from the key name in the ConfigMap.
          valueFrom:
            configMapKeyRef:
              name: game-demo           # The ConfigMap this value comes from.
              key: player_initial_lives # The key to fetch.
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    # You set volumes at the Pod level, then mount them into containers inside that Pod
    - name: config
      configMap:
        # Provide the name of the ConfigMap you want to mount.
        name: game-demo
        # An array of keys from the ConfigMap to create as files
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"
```


Un ConfigMap no diferencia entre las propiedades de una linea individual y
un fichero con múltiples lineas y valores.
Lo importante es como los <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a> y otros objetos consumen estos valores.

Para este ejemplo, definimos un <a class='glossary-tooltip' title='Un directorio que contiene datos y que es accesible desde los contenedores corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/storage/volumes/' target='_blank' aria-label='Volumen'>Volumen</a> y lo montamos dentro del contenedor
`demo` como `/config` creando dos ficheros,
`/config/game.properties` y `/config/user-interface.properties`,
aunque haya cuatro claves en el ConfigMap. Esto es debido a que enla definición
del <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> se especifica el array `items` en la sección `volumes`.
Si quieres omitir el array `items` entero, cada clave del ConfigMap se convierte en
un fichero con el mismo nombre que la clave, y tienes 4 ficheros.

## Usando ConfigMaps

Los ConfigMaps pueden montarse como volúmenes. También pueden ser utilizados por otras
partes del sistema, sin ser expuestos directamente al <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>. Por ejemplo,
los ConfigMaps pueden contener información para que otros elementos del sistema utilicen
para su configuración.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Nota:</h4><p>La manera más común de usar los Configmaps es para configurar
los contenedores que están corriendo en un <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> en el mismo <a class='glossary-tooltip' title='Abstracción utilizada por Kubernetes para soportar múltiples clústeres virtuales en el mismo clúster físico.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/overview/working-with-objects/namespaces/' target='_blank' aria-label='Namespace'>Namespace</a>.
También se pueden usar por separado.</p>
<p>Por ejemplo,
quizá encuentres <a class='glossary-tooltip' title='Son recursos que amplían la funcionalidad de Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/cluster-administration/addons/' target='_blank' aria-label='AddOns'>AddOns</a>
u <a class='glossary-tooltip' title='A specialized controller used to manage a custom resource' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/extend-kubernetes/operator/' target='_blank' aria-label='Operadores'>Operadores</a> que
ajustan su comportamiento en base a un ConfigMap.</p>
</div>


### Usando ConfigMaps como ficheros en un Pod

Para usar un ConfigMap en un volumen en un <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>:

1. Crear un ConfigMap o usar uno que exista. Múltiples <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a> pueden utilizar el mismo ConfigMap.
1. Modifica la configuración del <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> para añadir el volumen en `.spec.volumes[]`. Pon cualquier nombre al <a class='glossary-tooltip' title='Un directorio que contiene datos y que es accesible desde los contenedores corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/storage/volumes/' target='_blank' aria-label='Volumen'>Volumen</a>, y tienes un campo `.spec.volumes[].configMap.name` configurado con referencia al objeto ConfigMap.
1. Añade un `.spec.containers[].volumeMounts[]` a cada contenedor que necesite el ConfigMap. Especifica `.spec.containers[].volumeMounts[].readOnly = true` y `.spec.containers[].volumeMounts[].mountPath` en un directorio sin uso donde quieras que aparezca el ConfigMap.
1. Modifica la imagen o el comando utilizado para que el programa busque los ficheros en el directorio. Cada clave del ConfigMap `data` se convierte en un un fichero en el `mountPath`.

En este ejemplo, el <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> monta un ConfigMap como un <a class='glossary-tooltip' title='Un directorio que contiene datos y que es accesible desde los contenedores corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/storage/volumes/' target='_blank' aria-label='volumen'>volumen</a>:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    configMap:
      name: myconfigmap
```

Cada ConfigMap que quieras utilizar debe estar referenciado en `.spec.volumes`.

Si hay múltiples contenedores en el <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>, cada contenedor tiene su propio 
bloque `volumeMounts`, pero solo un `.spec.volumes` es necesario por cada ConfigMap.

#### ConfigMaps montados son actualizados automáticamente

Cuando un ConfigMap está siendo utilizado en un <a class='glossary-tooltip' title='Un directorio que contiene datos y que es accesible desde los contenedores corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/storage/volumes/' target='_blank' aria-label='volumen'>volumen</a> y es actualizado, las claves son actualizadas también. 
El <a class='glossary-tooltip' title='Agente que se ejecuta en cada nodo de un clúster. Se asegura de que los contenedores estén corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/generated/kubelet' target='_blank' aria-label='kubelet'>kubelet</a> comprueba si el ConfigMap montado está actualizado cada periodo de sincronización.
Sin embargo, el <a class='glossary-tooltip' title='Agente que se ejecuta en cada nodo de un clúster. Se asegura de que los contenedores estén corriendo en un pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/generated/kubelet' target='_blank' aria-label='kubelet'>kubelet</a> utiliza su caché local para obtener el valor actual del ConfigMap.
El tipo de caché es configurable usando el campo `ConfigMapAndSecretChangeDetectionStrategy` en el
[KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/kubelet/config/v1beta1/types.go).
Un ConfigMap puede ser propagado por vista (default), ttl-based, o simplemente redirigiendo
todas las consultas directamente a la API.
Como resultado, el retraso total desde el momento que el ConfigMap es actualizado hasta el momento
que las nuevas claves son proyectadas en el <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a> puede ser tan largo como la sincronización del <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pod'>Pod</a>
+ el retraso de propagación de la caché, donde la propagación de la caché depende del tipo de
caché elegido (es igual al retraso de propagación, ttl de la caché, o cero correspondientemente).








  <div class="feature-state-notice feature-alpha">
      <span class="feature-state-name">ESTADO DE LA RECURSOS:</span>
      <code>Kubernetes v1.18 [alpha]</code>
    </div>
  



La característica alpha de kubernetes _Immutable Secrets and ConfigMaps_ provee una opción para configurar
<a class='glossary-tooltip' title='Almacena información sensible, como contraseñas, tokens OAuth o claves ssh.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/configuration/secret/' target='_blank' aria-label='Secrets'>Secrets</a> individuales y ConfigMaps como inmutables. Para los <a class='glossary-tooltip' title='Un conjunto de máquinas, llamadas nodos, que ejecutan aplicaciones en contenedores administradas por Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/glossary/?all=true#term-cluster' target='_blank' aria-label='Clústeres'>Clústeres</a> que usan ConfigMaps como extensión
(al menos decenas o cientos de un único ConfigMap montado en <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a>), previene cambios en sus 
datos con las siguientes ventajas:

- protección de actualizaciones accidentales (o no deseadas) que pueden causar caídas de aplicaciones
- mejora el rendimiento del  <a class='glossary-tooltip' title='Un conjunto de máquinas, llamadas nodos, que ejecutan aplicaciones en contenedores administradas por Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/glossary/?all=true#term-cluster' target='_blank' aria-label='Clúster'>Clúster</a> significativamente reduciendo la carga del  <a class='glossary-tooltip' title='Componente del plano de control que expone la API de Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/reference/generated/kube-apiserver/' target='_blank' aria-label='kube-apiserver'>kube-apiserver</a>, 
cerrando las vistas para el ConfigMap marcado como inmutable.

Para usar esta característica, habilita el `ImmutableEmphemeralVolumes`
[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) y configura
el campo del <a class='glossary-tooltip' title='Almacena información sensible, como contraseñas, tokens OAuth o claves ssh.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/configuration/secret/' target='_blank' aria-label='Secret'>Secret</a> o ConfigMap `immutable` como `true`. Por ejemplo:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  ...
immutable: true
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Nota:</h4>Una vez que un ConfigMap o un <a class='glossary-tooltip' title='Almacena información sensible, como contraseñas, tokens OAuth o claves ssh.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/configuration/secret/' target='_blank' aria-label='Secret'>Secret</a> es marcado como inmutable, <em>no</em> es posible revertir el cambio
ni cambiar el contenido del campo <code>data</code>.  Solo se puede eliminar y recrear el ConfigMap.
Los <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a> existentes mantiene un punto de montaje del ConfigMap eliminado - es recomendable
recrear los <a class='glossary-tooltip' title='El objeto más pequeño y simple de Kubernetes. Un Pod es la unidad mínima de computación en Kubernetes y representa uno o más contenedores ejecutándose en el clúster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/es/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a>.</div>



## ¿Qué sigue?


* Leer sobre [Secrets](/docs/concepts/configuration/secret/).
* Leer [Configure a Pod to Use a ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/).
* Leer [The Twelve-Factor App](https://12factor.net/) para entender el motivo de separar
  el código de la configuración.
