En la entrada pasada creamos un pod utilizando la herramienta 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 podvalueFrom.name
: el nombre que le dimos a nuestro objeto Secret (mysecret
)valueFrom.name.key
: la llave que usamos ensecrets.yml
para definir el secret, en este casousername
ypassword
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:/#