En la entrada pasada creamos un pod utilizando kind de manera local. En este post veremos como configurar variables de entorno que puedan ser utilizadas por nuestros pods.

ConfigMaps

Un ConfigMap es un objeto que se utiliza para almacenar datos no confidenciales en pares clave-valor. Los pods pueden utilizar ConfigMaps como variables de entorno, argumentos de línea de comandos o como archivos de configuración en un volumen.1

De esta forma no es necesario depender de archivos .env o similares para inyectar variables de entorno a nuestra aplicación.

Dado que los ConfigMaps no proveen ningún tipo de cifrado, no deben ser utilizados para almacenar información sensible como tokens, passwords, etc.

Secrets

Un secreto es un objeto que contiene una pequeña cantidad de datos confidenciales, como una contraseña, un token o una clave. De lo contrario, dicha información podría incluirse en una especificación de pod o en una imagen de contenedor. El uso de un secreto significa que no necesita incluir datos confidenciales en el código de su aplicación.2

Creando un objeto ConfigMap

Para esto, vamos a crear un nuevo archivo configmap.yml para crear nuestro objeto de tipo ConfigMap.

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  APP_NAME: myapp
  APP_ENV: development

Como vemos, a diferencia del yml para crear nuestro pod, usamos la llave data, para definir nuestros valores.

Y procedemos a crear el objeto:

▶ kubectl apply -f configmap.yml
configmap/myconfigmap created

Ahora, para poder usarlo en nuestros pods, debemos hacer referencia a el y recrear el pod.

apiversión: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    envFrom:
    - configMapRef:
        name: myconfigmap

Primero eliminamos el pod existente y posteriormente lo creamos nuevamente:

▶ kubectl delete -f pod.yml
pod "mypod" deleted

▶ kubectl apply -f pod.yml
pod/mypod created

Ahora, podemos entrar a nuestro pod mediante su nombre y verificar que podemos leer las variables de entorno:

▶ kubectl exec -it mypod -- bash
root@mypod:/# echo $APP_NAME
myapp
root@mypod:/# echo $APP_ENV
development
root@mypod:/#

Creando un objeto Secret

Para gestionar secrets es muy parecido, pero son un tipo distinto de objeto, por lo que ahora crearemos un archivo secrets.yml:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4K # admin
  password: cGFzc3dvcmQK # password

Una peculiaridad es que en lugar de ir en texto plano, deben estar en base64.

Ahora modificamos nuestro pod.yml:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    envFrom:
    - configMapRef:
        name: myconfigmap
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password

Agregamos al spec la llave env. Donde por cada secret definimos:

  • name: Con este name podremos acceder al secret como variable de entorno en nuestro pod
  • valueFrom.name: el nombre que le dimos a nuestro objeto Secret (mysecret)
  • valueFrom.name.key: la llave que usamos en secrets.yml para definir el secret, en este caso username y password

Ahora realizamos el mismo proceso, eliminar y crear nuevamente nuestro pod:

▶ kubectl delete -f pod.yml
pod "mypod" deleted

▶ kubectl apply -f pod.yml
pod/mypod created

Finalmente, entramos nuevamente a nuestro pod y podremos acceder a nuestros secrets como variables de entorno:

▶ kubectl exec -it mypod -- bash
root@mypod:/# echo $USERNAME
admin
root@mypod:/# echo $PASSWORD
password
root@mypod:/#

  1. https://kubernetes.io/docs/concepts/configuration/configmap/ ↩︎

  2. https://kubernetes.io/docs/concepts/configuration/secret/ ↩︎