Hoy vamos a aprender con un ejemplo, cómo podemos migrar un Docker Compose (https://www.docker.com/) a Kubernetes (https://kubernetes.io/es).
Primero voy a explicar que son las dos tecnologías mencionadas:
Docker Compose:
Docker Compose es una herramienta que permite definir y ejecutar aplicaciones Docker de manera multi-contenedor. Con Docker Compose, puedes describir toda la configuración de tus servicios, redes y volúmenes en un archivo YAML (docker-compose.yaml
). Este archivo puede contener información sobre imágenes de contenedores, puertos expuestos, variables de entorno, volúmenes compartidos y más. Al utilizar docker-compose up
, puedes iniciar y desplegar fácilmente una aplicación multi-contenedor en tu entorno local.
Un ejemplo de docker-compose.yaml
para una aplicación web y una base de datos MySQL podría verse así:
version: '3' services: webapp: image: tu-imagen-webapp:latest ports: - "8080:80" database: image: tu-imagen-mysql:latest environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: mydatabase MYSQL_USER: user MYSQL_PASSWORD: password
Kubernetes:
Kubernetes es una plataforma de orquestación de contenedores de código abierto que automatiza el despliegue, escalado y operación de aplicaciones en contenedores. Permite administrar y orquestar contenedores en clústeres, facilitando la implementación y gestión de aplicaciones distribuidas y escalables.
En Kubernetes, defines los recursos de la aplicación, como Pods (instancias de contenedores), Deployments (conjuntos de Pods), Services (puntos de entrada a la aplicación), ConfigMaps (configuraciones) y más, mediante archivos de configuración YAML o JSON.
Diferencias y Uso conjunto:
- Docker Compose es para desarrollo local: Docker Compose es excelente para entornos de desarrollo local, donde puedes definir y probar fácilmente tus aplicaciones multi-contenedor. Puedes utilizarlo para crear entornos consistentes entre desarrolladores y desplegar rápidamente aplicaciones en un solo host.
- Kubernetes es para orquestación en producción: Kubernetes es ideal para entornos de producción y escenarios en los que necesitas gestionar aplicaciones en clústeres de servidores. Proporciona características avanzadas como el escalado automático, la autoreparación, el despliegue de versiones sin tiempo de inactividad y la administración de recursos.
- Uso conjunto: A menudo, se utiliza Docker Compose para desarrollar y probar aplicaciones localmente, y luego se migra a Kubernetes para la implementación en entornos de producción. Herramientas como
kompose
pueden ayudar en la conversión de archivos de Docker Compose a configuraciones de Kubernetes, facilitando así la transición entre entornos de desarrollo y producción.
Ahora vamos a poner un ejemplo para ver cómo podemos pasar nuestro Docker Compose a una configuración de Kubernetes:
Supongamos que tienes una aplicación compuesta por dos servicios en tu Docker Compose: un servicio web llamado «webapp» y una base de datos llamada «database». Aquí está el Docker Compose original:
version: '3' services: webapp: image: tu-imagen-webapp:latest ports: - "8080:80" database: image: tu-imagen-database:latest environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: mydatabase MYSQL_USER: user MYSQL_PASSWORD: password
*Sí, es el código del primer ejemplo.
Paso 1: Preparación
Antes de comenzar, asegúrate de tener instalado Kubernetes en tu entorno local. Puedes usar herramientas como Minikube o Docker Desktop con soporte para Kubernetes (https://devcodelight.com/instalar-docker-y-docker-compose-en-oracle-linux/). También necesitarás kubectl
, la herramienta de línea de comandos de Kubernetes.
Paso 2: Convertir Docker Compose a Kubernetes
2.1 Convertir docker-compose.yaml
a Recursos de Kubernetes
Divide tu archivo docker-compose.yaml
en varios archivos de configuración de Kubernetes: uno para cada servicio. Puedes crear archivos separados para Deployment y Service.
Recuerda que para que se pueda pasar a Kubernetes, deberás tener tu imagen docker creada y hospedada o utilizar una ya hospedada (https://devcodelight.com/desplegar-un-servidor-de-imagenes-docker-en-un-docker-compose-docker-registry/)
Por ejemplo, para un servicio llamado «webapp»:
webapp-deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: webapp spec: replicas: 1 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: tu-imagen-webapp:latest ports: - containerPort: 80
webapp-service.yaml:
apiVersion: v1 kind: Service metadata: name: webapp spec: selector: app: webapp ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
database-deploiment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: database spec: replicas: 1 selector: matchLabels: app: database template: metadata: labels: app: database spec: containers: - name: database image: tu-imagen-database:latest env: - name: MYSQL_ROOT_PASSWORD value: rootpass - name: MYSQL_DATABASE value: mydatabase - name: MYSQL_USER value: user - name: MYSQL_PASSWORD value: password
database-service.yaml
apiVersion: v1 kind: Service metadata: name: database spec: selector: app: database ports: - protocol: TCP port: 3306 targetPort: 3306
Ahora aplicamos estos archivos a cluster de Kubernetes:
kubectl apply -f webapp-deployment.yaml kubectl apply -f webapp-service.yaml kubectl apply -f database-deployment.yaml kubectl apply -f database-service.yaml
2.2 Convertir Variables de Entorno
Si tu Docker Compose utiliza variables de entorno, asegúrate de convertirlas a configuraciones equivalentes en Kubernetes. En el ejemplo anterior, las variables de entorno para el servicio de base de datos se convirtieron así:
database-deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: database spec: replicas: 1 selector: matchLabels: app: database template: metadata: labels: app: database spec: containers: - name: database image: tu-imagen-database:latest env: - name: MYSQL_ROOT_PASSWORD value: rootpass - name: MYSQL_DATABASE value: mydatabase - name: MYSQL_USER value: user - name: MYSQL_PASSWORD value: password
Paso 3: Aplicar Configuraciones en Kubernetes
Aplica las configuraciones convertidas en tu clúster Kubernetes utilizando kubectl
.
kubectl apply -f webapp-deployment.yaml kubectl apply -f webapp-service.yaml kubectl apply -f database-deployment.yaml kubectl apply -f database-service.yaml
Paso 4: Verificar el Estado
Usa los siguientes comandos para verificar que tus recursos se hayan desplegado correctamente:
kubectl get pods kubectl get services kubectl get deployments
¡Listo!
¡Has migrado con éxito tu sistema de Docker Compose a Kubernetes! Puedes acceder a tu aplicación a través de la dirección IP o nombre de servicio proporcionado por Kubernetes para el servicio «webapp». Recuerda ajustar estos pasos según las necesidades específicas de tu aplicación.
Nota: Como detener los pods creados.
Para detener (o más precisamente, eliminar) pods en Kubernetes, puedes utilizar el comando kubectl delete pod
. Aquí tienes algunas formas de hacerlo:
Detener un Solo Pod:
kubectl delete pod NOMBRE_DEL_POD
Reemplaza NOMBRE_DEL_POD
con el nombre del pod que deseas detener.
Detener Todos los Pods en un Namespace Específico:
kubectl delete pods --all -n NOMBRE_DEL_NAMESPACE
Reemplaza NOMBRE_DEL_NAMESPACE
con el nombre del namespace en el que deseas detener todos los pods.
Detener Todos los Pods en Todos los Namespaces:
kubectl delete pods --all --all-namespaces
Este comando eliminará todos los pods en todos los namespaces.
Ten en cuenta que al eliminar un pod, Kubernetes intentará crear un nuevo pod para mantener el estado deseado. Si deseas detener un pod y evitar que se reemplace, puedes escalar el número de replicas del deployment o replicaset a cero, pero ten cuidado al hacer esto en entornos de producción.
Escalar Replicas a Cero para Detener un Deployment:
kubectl scale deployment NOMBRE_DEL_DEPLOYMENT --replicas=0 -n NOMBRE_DEL_NAMESPACE
Reemplaza NOMBRE_DEL_DEPLOYMENT
y NOMBRE_DEL_NAMESPACE
con los nombres adecuados.
Ten en cuenta que estas operaciones eliminarán los pods, y si tienes configurado un controlador de replicación, se crearán nuevos pods para mantener el número deseado. Si deseas detener completamente una aplicación, podrías necesitar desmontar o eliminar los recursos relacionados, como servicios y despliegues.
Otra opción es modificar el número de replicas dentro del pod y ponerlas a 0:
metadata: name: webapp spec: replicas: 0
Y después aplicarlo:
kubectl apply -f webapp-deployment.yaml
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.