Gestión de la configuración de MySQL en Kubernetes con ConfigMaps

Al desplegar servicios de MySQL en Kubernetes, es crucial gestionar tanto los datos persistentes como los archivos de configuración. Mientras que los datos se pueden persistir utilizando PVCs (Persistent Volume Claims), la gestión desacoplada de los archivos de configuración se puede lograr eficientemente mediante ConfigMaps.

Introducción a ConfigMaps

Funcionalidad y Casos de Uso

Los ConfigMaps son recursos de Kubernetes diseñados para almacenar datos de configuración en forma de pares clave-valor. Permiten inyectar estos datos en los Pods de diversas maneras, promoviendo el desacoplamiento entre las imágenes de contenedor y sus configuraciones. Esto mejora la portabilidad y la reutilización de las imágenes.

  • Configuración de variables de entorno.
  • Provisión de archivos de configuración dentro de volúmenes montados en Pods.

Creación de ConfigMaps

Existen varias formas de crear ConfigMaps:

1. Creación con valores literales

Utilizando el comando kubectl create configmap con la opción --from-literal:

kubectl create configmap mi-configuracion --from-literal=clave1=valor1 --from-literal=clave2=valor2

Para verificar, puedes inspeccionar el ConfigMap creado:

apiVersion: v1
data:
  clave1: "valor1"
  clave2: "valor2"
kind: ConfigMap
metadata:
  name: mi-configuracion
  namespace: default

2. Creación a partir de archivos

Puedes crear un ConfigMap a partir del contenido de uno o varios archiovs. Por ejemplo, si teines un archivo llamado archivo-config.txt:

echo "parametro=valor" > archivo-config.txt
kubectl create configmap config-desde-archivo --from-file=archivo-config.txt

El contenido del archivo se almacenará bajo una clave con el mismo nombre que el archivo:

apiVersion: v1
data:
  archivo-config.txt: |
    parametro=valor
kind: ConfigMap
metadata:
  name: config-desde-archivo
  namespace: default

3. Creación a partir de directorios

Si tienes un directorio que contiene múltiples archivos de configuración, puedes crearlo como un ConfigMap:

mkdir dir-config
echo "otro_param=otro_valor" > dir-config/config2.conf
kubectl create configmap config-desde-dir --from-file=dir-config

Cada archivo dentro del directorio se convertirá en una entrada clave-valor en el ConfigMap:

apiVersion: v1
data:
  config2.conf: |
    otro_param=otro_valor
kind: ConfigMap
metadata:
  name: config-desde-dir
  namespace: default

4. Creación mediante un archivo YAML

La forma más declarativa es definir el ConfigMap en un archivo YAML. Esto es especialmente útil para configuraciones complejas o para su inclusión en sistemas de control de versiones.

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-configuracion
  namespace: base-de-datos
data:
  my.cnf: |
    [mysqld]
    datadir = /var/lib/mysql
    port = 3306
    server-id = 1
    log-error = /var/log/mysql/error.log
    pid-file = /var/run/mysqld/mysqld.pid
    socket = /var/run/mysqld/mysqld.sock
    # Ajustes adicionales de configuración
    max_connections = 200
    innodb_buffer_pool_size = 128M
  custom-init.sql: |
    -- Script SQL de inicialización
    CREATE DATABASE IF NOT EXISTS mi_app_db;
    USE mi_app_db;
    CREATE TABLE IF NOT EXISTS usuarios (
        id INT AUTO_INCREMENT PRIMARY KEY,
        nombre VARCHAR(100) NOT NULL
    );

Para aplicar este archivo:

kubectl apply -f nombre-del-archivo.yaml

Uso de ConfigMaps en Pods

1. Como variables de entorno

Los valores de un ConfigMap pueden ser inyectados directamente como variables de entorno en los contenedores de un Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-mysql
  template:
    metadata:
      labels:
        app: app-mysql
    spec:
      containers:
      - name: mysql-container
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: credenciales-mysql
              key: root_password
        - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
              name: db-params
              key: database_name
        - name: MYSQL_USER
          valueFrom:
            configMapKeyRef:
              name: db-params
              key: db_user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: credenciales-mysql
              key: user_password
        ports:
        - containerPort: 3306
          name: mysql

Aquí, database_name y db_user se obtienen del ConfigMap db-params.

2. Como argumentos de línea de comandos

Aunque menos común para configuraciones extensas, los valores de un ConfigMap pueden usarse en los comandos de inicio de un contenedor:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-utilidades
spec:
  template:
    spec:
      containers:
      - name: utilidades-container
        image: busybox
        command: ["/bin/sh", "-c", "echo 'Valor de la configuración: $MI_CONFIG_VALUE' && sleep 3600"]
        env:
        - name: MI_CONFIG_VALUE
          valueFrom:
            configMapKeyRef:
              name: config-test
              key: alguna_clave

3. Como volúmenes montados

Esta es una forma muy común y flexible de usar ConfigMaps, especialmente para archivos de configuración que una aplicación lee directamente. El ConfigMap se monta como un volumen, y cada clave dentro del ConfigMap se convierte en un archivo en el directorio montado.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-server-deployment
spec:
  template:
    spec:
      containers:
      - name: mysql-server
        image: mysql:5.7
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: config-mysql-volumen
          mountPath: /etc/mysql/conf.d  # Directorio donde MySQL espera leer configuraciones adicionales
        - name: init-scripts-volumen
          mountPath: /docker-entrypoint-initdb.d # Directorio para scripts de inicialización en imágenes oficiales de MySQL
      volumes:
      - name: config-mysql-volumen
        configMap:
          name: mysql-configuracion # Nombre del ConfigMap que contiene el archivo my.cnf
      - name: init-scripts-volumen
        configMap:
          name: mysql-configuracion # Nombre del ConfigMap que contiene custom-init.sql

En este ejemplo, el ConfigMap mysql-configuracion tiene dos claves: my.cnf y custom-init.sql. Al montarse en /etc/mysql/conf.d y /docker-entrypoint-initdb.d respectivamente, el proceso de MySQL leerá estos archivos de configuración y ejecutará los scripts de inicialización.

Etiquetas: Kubernetes MySQL configmap YAML contenedores

Publicado el 6-14 23:31