En el apartado anterior hemos estudiado como podemos definir las variables de entorno de los contenedores que vamos a desplegar. Sin embargo, la solución que presentamos puede tener alguna limitación:
- Los valores de las variables de entorno están escritos directamente en el fichero yaml. Estos ficheros yaml suelen estar en repositorios git y lógicamente no es el sitio más adecuado para ubicarlos.
- Por otro lado, escribiendo los valores de las variables de entorno directamente en los ficheros, hacemos que estos ficheros no sean reutilizables en otros despliegues y que el procedimiento de cambiar las variables sea tedioso y propenso a errores, porque hay que hacerlo en varios sitios.
Para solucionar estas limitaciones, podemos usar un nuevo recurso de Kubernetes llamado ConfigMap.
ConfigMap permite definir un diccionario (clave,valor) para guardar información que se puede utilizar para configurar una aplicación.
Aunque hay distintas formas de indicar el conjunto de claves-valor de nuestro ConfigMap, en este caso vamos a usar literales, por ejemplo:
kubectl create cm mariadb --from-literal=root_password=my-password \
--from-literal=mysql_usuario=usuario \
--from-literal=mysql_password=password-user \
--from-literal=basededatos=test
En el ejemplo anteriore, hemos creado un ConfigMap llamado mariadb
con cuatro pares clave-valor. Para ver los ConfigMap que tenemos
creados, podemos utilizar:
kubectl get cm
Y para ver los detalles del mismo:
kubectl describe cm mariadb
Una vez que creado el ConfigMap se puede crear un despliegue donde las
variables de entorno se inicializan con los valores guardados en
el ConfigMap. Por ejemplo, un despliegue de una base de datos lo
podemos encontrar en el fichero
mariadb-deployment-configmap.yaml
y el fragmento donde definimos las variables de entorno quedaría:
...
spec:
containers:
- name: contenedor-mariadb
image: mariadb
ports:
- containerPort: 3306
name: db-port
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: mariadb
key: root_password
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mariadb
key: mysql_usuario
- name: MYSQL_PASSWORD
valueFrom:
configMapKeyRef:
name: mariadb
key: mysql_password
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mariadb
key: basededatos
Observamos como al indicar las variables de entorno (sección
env
) seguimos indicado el nombre (name
) pero el valor se indica
con una clave de un ConfigMap (valueFrom: - configMapKeyRef:
), para
ello se indica el nombre del ConfigMap (name
) y el valor que tiene
una determinada clave (key
). De esta manera, no guardamos en los
ficheros yaml los valores específicos de las variables de entorno, y
además, estos valores se pueden reutilizar para otros despliegues, por
ejemplo, al desplegar un CMS indicar los mismos valores para las
credenciales de acceso a la base de datos.