Introducción
La implementación de una base de datos funcional en un entorno en contenedores puede ser una tarea exigente. La razón radica en el conjunto de desafíos específicos que presentan las bases de datos para mantener su disponibilidad, estado y redundancia. Sin embargo, muchos desarrolladores prefieren tener sus pilas de aplicaciones y capas de datos organizadas con los mismos principios de implementación rápida y automatización que ofrecen plataformas como Kubernetes.
Este artículo le mostrará cómo implementar una instancia de base de datos MySQL en Kubernetes mediante volúmenes persistentes. Esta característica permite que las aplicaciones con estado superen la transitoriedad inherente de los pods K8.
Requisitos previos
- Un clúster de Kubernetes con kubectl instalado
- Acceso administrativo a su sistema
Despliegue de MySQL en Kubernetes
Para implementar correctamente una instancia de MySQL en Kubernetes, cree una serie de archivos YAML que usará para definir los siguientes objetos de Kubernetes:
- Un secreto de Kubernetes para almacenar la contraseña de la base de datos.
- Un volumen persistente (PV) para asignar espacio de almacenamiento para la base de datos.
- Una reclamación de volumen persistente (PVC) que reclamará el PV para la implementación.
- La implementación en sí.
- El servicio de Kubernetes.
Paso 1:crear el secreto de Kubernetes
Utilice un editor de texto como Nano para crear el archivo secreto.
nano mysql-secret.yaml
El archivo define el secreto. Introduzca la contraseña de la cuenta raíz de MySQL en stringData
sección del YAML.
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
password: test1234
Guarda el archivo y cierra. Use kubectl para aplicar los cambios al clúster.
kubectl apply -f mysql-secret.yaml
El sistema confirma la creación exitosa del secreto:
Paso 2:Cree un Volumen Persistente y un Reclamo de Volumen
Cree el archivo de configuración de almacenamiento:
nano mysql-storage.yaml
Este archivo consta de dos partes:
- La primera parte define el volumen persistente. Personaliza la cantidad de almacenamiento asignado en
spec.capacity.storage
. Enspec.hostPath
especifique el punto de montaje del volumen. - La segunda parte del archivo define el PVC.
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Guarda el archivo y cierra.
Luego, aplique la configuración de almacenamiento con kubectl
.
kubectl apply -f mysql-storage.yaml
El sistema confirma la creación del PV y el PVC.
Paso 3:Crear implementación de MySQL
- Cree el archivo de implementación. El archivo de implementación define los recursos que utilizará la implementación de MySQL.
nano mysql-deployment.yaml
2. En spec.template.spec.containers
sección, especifique la imagen de MySQL:
containers:
- image: mysql:5.6
name: mysql
3. Asigne el valor de MYSQL_ROOT_PASSWORD
variable de entorno a la contraseña que especificó en el Secreto del Paso 1 .
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
4. Conecte el PVC del Paso 2 al despliegue.
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
5. En la sección separada del archivo, defina el nombre del servicio y el puerto.
Todo el YAML debería verse como en el siguiente ejemplo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
Guarda el archivo y cierra. Cree la implementación aplicando el archivo con kubectl
:
kubectl apply -f mysql-deployment.yaml
El sistema confirma la creación exitosa tanto de la implementación como del servicio.
Acceda a su instancia de MySQL
Para acceder a la instancia de MySQL, acceda al pod creado por la implementación.
- Lista de los pods:
kubectl get pod
2. Busque el pod de MySQL y copie su nombre seleccionándolo y presionando Ctrl+Shift+C :
3. Obtenga un shell para el pod ejecutando el siguiente comando:
kubectl exec --stdin --tty mysql-694d95668d-w7lv5 -- /bin/bash
El caparazón del módulo reemplaza al caparazón principal:
4. Escriba el siguiente comando para acceder al shell de MySQL:
mysql -p
5. Cuando se le solicite, ingrese la contraseña que definió en el secreto de Kubernetes.
Aparece el shell de MySQL.
Actualice su implementación de MySQL
Edite el archivo YAML correspondiente para actualizar cualquier parte de la implementación. Aplicar los cambios con:
kubectl apply -f [filename]
Sin embargo, tenga en cuenta las siguientes dos limitaciones:
- Esta implementación en particular es para instancia única Implementación de MySQL. Significa que la implementación no se puede escalar; funciona exactamente en un pod.
- Esta implementación no admite actualizaciones continuas. Por lo tanto, el
spec.strategy.type
siempre debe establecerse en Recrear .
Elimine su instancia de MySQL
Si desea eliminar toda la implementación, use kubectl
para eliminar cada uno de los objetos de Kubernetes relacionados con él:
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
kubectl delete secret mysql-secret
Esta serie de comandos elimina la implementación, el servicio, PV, PVC y el secreto que creó. El sistema confirma la eliminación exitosa: