ConfigMaps
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.
Configuración de aplicaciones usando ConfigMaps
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:
oc create cm mysql --from-literal=root_password=my-password \
--from-literal=mysql_usuario=usuario \
--from-literal=mysql_password=password-user \
--from-literal=basededatos=test
En el ejemplo anterior, hemos creado un ConfigMap llamado mysql
con cuatro pares clave-valor. Para ver los ConfigMaps que tenemos
creados, podemos utilizar:
oc get cm
Y para ver los detalles del mismo:
oc describe cm mysql
Si queremos crear un fichero YAML para declarar el objeto ConfigMap, podemos ejecutar:
oc create cm mysql --from-literal=root_password=my-password \
--from-literal=mysql_usuario=usuario \
--from-literal=mysql_password=password-user \
--from-literal=basededatos=test \
-o yaml --dry-run=client > configmap.yaml
Con la opción --dry-run=client
, oc
va a simular la creación del recurso, pero no se llega a ejecutar, sin embargo con la opción -o yaml
generamos el fichero YAML con la definición del recurso.
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 mysql-deployment-configmap.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-configmap
labels:
app: mysql2
spec:
replicas: 1
selector:
matchLabels:
app: mysql2
template:
metadata:
labels:
app: mysql2
spec:
containers:
- name: contenedor-mysql
image: bitnami/mysql
ports:
- containerPort: 3306
name: db-port
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql
key: root_password
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mysql
key: mysql_usuario
- name: MYSQL_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql
key: mysql_password
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql
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.
Creamos el despliegue, comprobamos que las variables se han creado y accedemos a la base de datos con el usuario que hemos creado:
oc apply -f mysql-deployment-configmap.yaml
oc exec -it deploy/mysql-configmap -- env
...
MYSQL_ROOT_PASSWORD=my-password
MYSQL_USER=usuario
MYSQL_PASSWORD=password-user
MYSQL_DATABASE=test
oc exec -it deployment.apps/mysql-configmap -- bash -c "mysql -u usuario -p -h 127.0.0.1"
Enter password:
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| test |
+--------------------+