|
| 1 | +--- |
| 2 | +title: ConfigMaps |
| 3 | +content_type: concept |
| 4 | +weight: 20 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +{{< glossary_definition term_id="configmap" prepend="Un configmap es " length="all" >}} |
| 10 | + |
| 11 | +{{< caution >}} |
| 12 | +ConfigMap no proporciona encriptación. |
| 13 | +Si los datos que quieres almacenar son confidenciales, utiliza un |
| 14 | +{{< glossary_tooltip text="Secret" term_id="secret" >}} en lugar de un ConfigMap, |
| 15 | +o utiliza otras herramientas externas para mantener los datos seguros. |
| 16 | +{{< /caution >}} |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | +<!-- body --> |
| 21 | +## Motivo |
| 22 | + |
| 23 | +Utiliza un ConfigMap para crear una configuración separada del código de la aplicación. |
| 24 | + |
| 25 | +Por ejemplo, imagina que estás desarrollando una aplicación que puedes correr en |
| 26 | +tu propio equipo (para desarrollo) y en el cloud (para mantener tráfico real). |
| 27 | +Escribes el código para configurar una variable llamada `DATABASE_HOST`. |
| 28 | +En tu equipo configuras la variable con el valor `localhost`. |
| 29 | +En el cloud, la configuras con referencia a un kubernetes |
| 30 | +{{< glossary_tooltip text="Service" term_id="service" >}} que expone el componente |
| 31 | +de la base de datos en tu cluster. |
| 32 | + |
| 33 | +Esto permite tener una imagen corriendo en un cloud y |
| 34 | +tener el mismo código localmente para checkearlo si es necesario. |
| 35 | + |
| 36 | +## Objeto ConfigMap |
| 37 | + |
| 38 | +Un ConfigMap es un [objeto](/docs/concepts/overview/working-with-objects/kubernetes-objects/) de la API |
| 39 | +que permite almacenar la configuración de otros objetos utilizados. Aunque muchos |
| 40 | +objetos de kubernetes que tienen un `spec`, un ConfigMap tiene una sección `data` para |
| 41 | +almacenar items, identificados por una clave, y sus valores. |
| 42 | + |
| 43 | +El nombre del ConfigMap debe ser un |
| 44 | +[nombre de subdominio DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names) válido. |
| 45 | + |
| 46 | +## ConfigMaps y Pods |
| 47 | + |
| 48 | +Puedes escribir un Pod `spec` y referenciarlo a un ConfigMap y configurar el contenedor(es) |
| 49 | +de ese {{< glossary_tooltip text="Pod" term_id="pod" >}} en base a los datos del ConfigMap. El {{< glossary_tooltip text="Pod" term_id="pod" >}} y el ConfigMap deben estar en |
| 50 | +el mismo {{< glossary_tooltip text="Namespace" term_id="namespace" >}}. |
| 51 | + |
| 52 | +Este es un ejemplo de ConfigMap que tiene algunas claves con un valor simple, |
| 53 | +y otras claves donde el valor tiene un formato de un fragmento de configuración. |
| 54 | + |
| 55 | +```yaml |
| 56 | +apiVersion: v1 |
| 57 | +kind: ConfigMap |
| 58 | +metadata: |
| 59 | + name: game-demo |
| 60 | +data: |
| 61 | + # property-like keys; each key maps to a simple value |
| 62 | + player_initial_lives: "3" |
| 63 | + ui_properties_file_name: "user-interface.properties" |
| 64 | + # |
| 65 | + # file-like keys |
| 66 | + game.properties: | |
| 67 | + enemy.types=aliens,monsters |
| 68 | + player.maximum-lives=5 |
| 69 | + user-interface.properties: | |
| 70 | + color.good=purple |
| 71 | + color.bad=yellow |
| 72 | + allow.textmode=true |
| 73 | +``` |
| 74 | +Hay cuatro maneras diferentes de usar un ConfigMap para configurar |
| 75 | +un contenedor dentro de un {{< glossary_tooltip text="Pod" term_id="pod" >}}: |
| 76 | +
|
| 77 | +1. Argumento en la linea de comandos como entrypoint de un contenedor |
| 78 | +1. Variable de enorno de un contenedor |
| 79 | +1. Como fichero en un volumen de solo lectura, para que lo lea la aplicación |
| 80 | +1. Escribir el código para ejecutar dentro de un {{< glossary_tooltip text="Pod" term_id="pod" >}} que utiliza la API para leer el ConfigMap |
| 81 | +
|
| 82 | +Estos diferentes mecanismos permiten utilizar diferentes métodos para modelar |
| 83 | +los datos que se van a usar. |
| 84 | +Para los primeros tres mecanismos, el |
| 85 | +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}} utiliza la información |
| 86 | +del ConfigMap cuando lanza un contenedor (o varios) en un {{< glossary_tooltip text="Pod" term_id="pod" >}}. |
| 87 | +
|
| 88 | +Para el cuarto método, tienes que escribir el código para leer el ConfigMap y sus datos. |
| 89 | +Sin embargo, como estás utilizando la API de kubernetes directamente, la aplicación puede |
| 90 | +suscribirse para obtener actualizaciones cuando el ConfigMap cambie, y reaccionar |
| 91 | +cuando esto ocurra. Accediendo directamente a la API de kubernetes, esta |
| 92 | +técnica también permite acceder al ConfigMap en diferentes namespaces. |
| 93 | +
|
| 94 | +En el siguiente ejemplo el Pod utiliza los valores de `game-demo` para configurar el contenedor: |
| 95 | +```yaml |
| 96 | +apiVersion: v1 |
| 97 | +kind: Pod |
| 98 | +metadata: |
| 99 | + name: configmap-demo-pod |
| 100 | +spec: |
| 101 | + containers: |
| 102 | + - name: demo |
| 103 | + image: game.example/demo-game |
| 104 | + env: |
| 105 | + # Define the environment variable |
| 106 | + - name: PLAYER_INITIAL_LIVES # Notice that the case is different here |
| 107 | + # from the key name in the ConfigMap. |
| 108 | + valueFrom: |
| 109 | + configMapKeyRef: |
| 110 | + name: game-demo # The ConfigMap this value comes from. |
| 111 | + key: player_initial_lives # The key to fetch. |
| 112 | + - name: UI_PROPERTIES_FILE_NAME |
| 113 | + valueFrom: |
| 114 | + configMapKeyRef: |
| 115 | + name: game-demo |
| 116 | + key: ui_properties_file_name |
| 117 | + volumeMounts: |
| 118 | + - name: config |
| 119 | + mountPath: "/config" |
| 120 | + readOnly: true |
| 121 | + volumes: |
| 122 | + # You set volumes at the Pod level, then mount them into containers inside that Pod |
| 123 | + - name: config |
| 124 | + configMap: |
| 125 | + # Provide the name of the ConfigMap you want to mount. |
| 126 | + name: game-demo |
| 127 | + # An array of keys from the ConfigMap to create as files |
| 128 | + items: |
| 129 | + - key: "game.properties" |
| 130 | + path: "game.properties" |
| 131 | + - key: "user-interface.properties" |
| 132 | + path: "user-interface.properties" |
| 133 | +``` |
| 134 | + |
| 135 | + |
| 136 | +Un ConfigMap no diferencia entre las propiedades de una linea individual y |
| 137 | +un fichero con múltiples lineas y valores. |
| 138 | +Lo importante es como los {{< glossary_tooltip text="Pods" term_id="pod" >}} y otros objetos consumen estos valores. |
| 139 | + |
| 140 | +Para este ejemplo, definimos un {{< glossary_tooltip text="Volumen" term_id="volume" >}} y lo montamos dentro del contenedor |
| 141 | +`demo` como `/config` creando dos ficheros, |
| 142 | +`/config/game.properties` y `/config/user-interface.properties`, |
| 143 | +aunque haya cuatro claves en el ConfigMap. Esto es debido a que enla definición |
| 144 | +del {{< glossary_tooltip text="Pod" term_id="pod" >}} se especifica el array `items` en la sección `volumes`. |
| 145 | +Si quieres omitir el array `items` entero, cada clave del ConfigMap se convierte en |
| 146 | +un fichero con el mismo nombre que la clave, y tienes 4 ficheros. |
| 147 | + |
| 148 | +## Usando ConfigMaps |
| 149 | + |
| 150 | +Los ConfigMaps pueden montarse como volúmenes. También pueden ser utilizados por otras |
| 151 | +partes del sistema, sin ser expuestos directamente al {{< glossary_tooltip text="Pod" term_id="pod" >}}. Por ejemplo, |
| 152 | +los ConfigMaps pueden contener información para que otros elementos del sistema utilicen |
| 153 | +para su configuración. |
| 154 | + |
| 155 | +{{< note >}} |
| 156 | +La manera más común de usar los Configmaps es para configurar |
| 157 | +los contenedores que están corriendo en un {{< glossary_tooltip text="Pod" term_id="pod" >}} en el mismo {{< glossary_tooltip text="Namespace" term_id="namespace" >}}. |
| 158 | +También se pueden usar por separado. |
| 159 | + |
| 160 | +Por ejemplo, |
| 161 | +quizá encuentres {{< glossary_tooltip text="AddOns" term_id="addons" >}} |
| 162 | +u {{< glossary_tooltip text="Operadores" term_id="operator-pattern" >}} que |
| 163 | +ajustan su comportamiento en base a un ConfigMap. |
| 164 | +{{< /note >}} |
| 165 | + |
| 166 | +### Usando ConfigMaps como ficheros en un Pod |
| 167 | + |
| 168 | +Para usar un ConfigMap en un volumen en un {{< glossary_tooltip text="Pod" term_id="pod" >}}: |
| 169 | + |
| 170 | +1. Crear un ConfigMap o usar uno que exista. Múltiples {{< glossary_tooltip text="Pods" term_id="pod" >}} pueden utilizar el mismo ConfigMap. |
| 171 | +1. Modifica la configuración del {{< glossary_tooltip text="Pod" term_id="pod" >}} para añadir el volumen en `.spec.volumes[]`. Pon cualquier nombre al {{< glossary_tooltip text="Volumen" term_id="volume" >}}, y tienes un campo `.spec.volumes[].configMap.name` configurado con referencia al objeto ConfigMap. |
| 172 | +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. |
| 173 | +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`. |
| 174 | + |
| 175 | +En este ejemplo, el {{< glossary_tooltip text="Pod" term_id="pod" >}} monta un ConfigMap como un {{< glossary_tooltip text="volumen" term_id="volume" >}}: |
| 176 | + |
| 177 | +```yaml |
| 178 | +apiVersion: v1 |
| 179 | +kind: Pod |
| 180 | +metadata: |
| 181 | + name: mypod |
| 182 | +spec: |
| 183 | + containers: |
| 184 | + - name: mypod |
| 185 | + image: redis |
| 186 | + volumeMounts: |
| 187 | + - name: foo |
| 188 | + mountPath: "/etc/foo" |
| 189 | + readOnly: true |
| 190 | + volumes: |
| 191 | + - name: foo |
| 192 | + configMap: |
| 193 | + name: myconfigmap |
| 194 | +``` |
| 195 | + |
| 196 | +Cada ConfigMap que quieras utilizar debe estar referenciado en `.spec.volumes`. |
| 197 | + |
| 198 | +Si hay múltiples contenedores en el {{< glossary_tooltip text="Pod" term_id="pod" >}}, cada contenedor tiene su propio |
| 199 | +bloque `volumeMounts`, pero solo un `.spec.volumes` es necesario por cada ConfigMap. |
| 200 | + |
| 201 | +#### ConfigMaps montados son actualizados automáticamente |
| 202 | + |
| 203 | +Cuando un ConfigMap está siendo utilizado en un {{< glossary_tooltip text="volumen" term_id="volume" >}} y es actualizado, las claves son actualizadas también. |
| 204 | +El {{< glossary_tooltip text="kubelet" term_id="kubelet" >}} comprueba si el ConfigMap montado está actualizado cada periodo de sincronización. |
| 205 | +Sin embargo, el {{< glossary_tooltip text="kubelet" term_id="kubelet" >}} utiliza su caché local para obtener el valor actual del ConfigMap. |
| 206 | +El tipo de caché es configurable usando el campo `ConfigMapAndSecretChangeDetectionStrategy` en el |
| 207 | +[KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/staging/src/k8s.io/kubelet/config/v1beta1/types.go). |
| 208 | +Un ConfigMap puede ser propagado por vista (default), ttl-based, o simplemente redirigiendo |
| 209 | +todas las consultas directamente a la API. |
| 210 | +Como resultado, el retraso total desde el momento que el ConfigMap es actualizado hasta el momento |
| 211 | +que las nuevas claves son proyectadas en el {{< glossary_tooltip text="Pod" term_id="pod" >}} puede ser tan largo como la sincronización del {{< glossary_tooltip text="Pod" term_id="pod" >}} |
| 212 | ++ el retraso de propagación de la caché, donde la propagación de la caché depende del tipo de |
| 213 | +caché elegido (es igual al retraso de propagación, ttl de la caché, o cero correspondientemente). |
| 214 | + |
| 215 | +{{< feature-state for_k8s_version="v1.18" state="alpha" >}} |
| 216 | + |
| 217 | +La característica alpha de kubernetes _Immutable Secrets and ConfigMaps_ provee una opción para configurar |
| 218 | +{{< glossary_tooltip text="Secrets" term_id="secret" >}} individuales y ConfigMaps como inmutables. Para los {{< glossary_tooltip text="Clústeres" term_id="cluster" >}} que usan ConfigMaps como extensión |
| 219 | +(al menos decenas o cientos de un único ConfigMap montado en {{< glossary_tooltip text="Pods" term_id="pod" >}}), previene cambios en sus |
| 220 | +datos con las siguientes ventajas: |
| 221 | + |
| 222 | +- protección de actualizaciones accidentales (o no deseadas) que pueden causar caídas de aplicaciones |
| 223 | +- mejora el rendimiento del {{< glossary_tooltip text="Clúster" term_id="cluster" >}} significativamente reduciendo la carga del {{< glossary_tooltip text="kube-apiserver" term_id="kube-apiserver" >}}, |
| 224 | +cerrando las vistas para el ConfigMap marcado como inmutable. |
| 225 | + |
| 226 | +Para usar esta característica, habilita el `ImmutableEmphemeralVolumes` |
| 227 | +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) y configura |
| 228 | +el campo del {{< glossary_tooltip text="Secret" term_id="secret" >}} o ConfigMap `immutable` como `true`. Por ejemplo: |
| 229 | +```yaml |
| 230 | +apiVersion: v1 |
| 231 | +kind: ConfigMap |
| 232 | +metadata: |
| 233 | + ... |
| 234 | +data: |
| 235 | + ... |
| 236 | +immutable: true |
| 237 | +``` |
| 238 | + |
| 239 | +{{< note >}} |
| 240 | +Una vez que un ConfigMap o un {{< glossary_tooltip text="Secret" term_id="secret" >}} es marcado como inmutable, _no_ es posible revertir el cambio |
| 241 | +ni cambiar el contenido del campo `data`. Solo se puede eliminar y recrear el ConfigMap. |
| 242 | +Los {{< glossary_tooltip text="Pods" term_id="pod" >}} existentes mantiene un punto de montaje del ConfigMap eliminado - es recomendable |
| 243 | +recrear los {{< glossary_tooltip text="Pods" term_id="pod" >}}. |
| 244 | +{{< /note >}} |
| 245 | + |
| 246 | + |
| 247 | +## {{% heading "whatsnext" %}} |
| 248 | + |
| 249 | + |
| 250 | +* Leer sobre [Secrets](/docs/concepts/configuration/secret/). |
| 251 | +* Leer [Configure a Pod to Use a ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/). |
| 252 | +* Leer [The Twelve-Factor App](https://12factor.net/) para entender el motivo de separar |
| 253 | + el código de la configuración. |
0 commit comments