GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo implementar pilas de Docker Compose en Kubernetes con Kompose

Docker Compose le permite definir pilas de contenedores que puede administrar de forma colectiva. Es una herramienta relativamente simple que originalmente se centró en las instalaciones locales de Docker.

Kubernetes es un orquestador de contenedores que viene con su propia cadena de herramientas y archivos de manifiesto. Por lo general, se considera más complejo que un flujo de trabajo normal de Docker, pero sus capacidades facilitan las implementaciones de contenedores escalables en producción.

Kompose es una herramienta que le permite tomar archivos de Docker Compose e implementarlos en clústeres de Kubernetes. Está desarrollado como parte del proyecto Kubernetes.

Las versiones actuales de Kompose están limitadas a conversiones de archivos YAML. Debe aplicar los manifiestos de recursos de Kubernetes convertidos a su clúster mediante una herramienta como Kubectl. Las versiones anteriores de Kompose tenían un up incorporado comando que podría implementarse directamente en su clúster sin un paso de conversión intermedio. Esto se eliminó debido a la creciente complejidad técnica.

Cómo empezar

Kompose está disponible para Windows, macOS y las distribuciones de Linux más populares. Los archivos binarios prediseñados están disponibles en su repositorio de GitHub. Descargue la última versión, configure el bit de permiso ejecutable y mueva el binario a un directorio que esté en su camino. También se admiten varios administradores de paquetes.

curl -L https://github.com/kubernetes/kompose/releases/download/v1.23.0/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

Intenta ejecutar kompose en tu terminal. Verá información básica sobre los comandos disponibles. Ejecutando kompose version comprueba la versión de Kompose que está utilizando.

Ahora, asegúrese de tener un docker-compose.yml archivo disponible. Aquí hay un ejemplo básico que configura un servidor web Apache con una base de datos MySQL:

version: "3"

services:
  apache:
    image: httpd:latest
    ports:
      - 80:80
  mysql:
    image: mysql:latest
    expose:
      - 3306
    volumes:
      - mysql:/var/lib/mysql

volumes:
  mysql:

También necesita un clúster de Kubernetes para implementar. Crea un nuevo clúster con un proveedor de nube pública o activa el tuyo propio usando un proyecto como MicroK8s.

Convertir su pila

El kompose convert El comando acepta la ruta a un archivo de Docker Compose y emite manifiestos de recursos de Kubernetes equivalentes. Utiliza el docker-compose.yml en su directorio de trabajo cuando no se proporciona una ruta. Se aceptan varios archivos a través de -f bandera.

kompose convert -f docker-compose.yml -f docker-compose-dev.yml

Verá algunas líneas de salida a medida que Kompose escribe archivos de manifiesto para cada uno de los recursos en su pila de Compose. Se crean archivos individuales para cada componente de su docker-compose.yml . Se colocarán en su directorio de trabajo.

Este es el resultado de convertir docker-compose.yml se muestra arriba:

Se ha creado una implementación y un servicio de Kubernetes para cada uno de los servicios de Compose. Estos recursos definen los pods que se crearán, así como sus reglas de enrutamiento de red.

También existe un PersistentVolumeClaim para el contenedor de MySQL. Esto representa el volumen configurado en docker-compose.yml , proporcionando almacenamiento persistente para la base de datos MySQL que dura más que cualquier Pod individual.

Si inspecciona los archivos YAML, verá que son solo manifiestos de Kubernetes compatibles con Kubectl. Aquí está el apache-deployment.yaml convertido archivo:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.23.0 (bc7d9f4f)
  creationTimestamp: null
  labels:
    io.kompose.service: apache
  name: apache
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: apache
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.23.0 (bc7d9f4f)
      creationTimestamp: null
      labels:
        io.kompose.service: apache
    spec:
      containers:
        - image: httpd:latest
          name: apache
          ports:
            - containerPort: 80
          resources: {}
      restartPolicy: Always
status: {}

La spec de la implementación es bastante similar a la definición del contenedor de Apache en el docker-compose.yml original . En el caso de este servicio simple, se asigna fácilmente a un objeto de Kubernetes. El resto del archivo consiste principalmente en metadatos de configuración, incluidas las anotaciones específicas de Kompose que le permiten identificar los recursos creados con la herramienta.

Implementar en su clúster

Implemente el conjunto de archivos de manifiesto de la forma habitual con kubectl apply . Es una buena idea almacenarlos en un directorio separado de su docker-compose.yml , de modo que kubectl no intenta seleccionar ese archivo incompatible también.

kubectl apply .

Los recursos se aprovisionarán dentro de su clúster. Sus servicios pueden tardar unos minutos en ejecutarse. Inspeccione su implementación con kubectl get deployments . Cuando el AVAILABLE la columna muestra 1 , su carga de trabajo debe ser accesible.

Ahora, puede actualizar su implementación editando los manifiestos generados y volviendo a ejecutar kubectl apply . Si quisiera escalar Apache a tres réplicas, abriría apache-deployment.yaml , cambia las replicas campo a 3 y aplique el manifiesto modificado.

También puede seguir actualizando su archivo Docker Compose. Ejecute kompose convert nuevamente para obtener la interpretación más reciente de Kubernetes de su contenido y luego vuelva a aplicar la salida a su clúster. Tenga en cuenta que esto sobrescribirá cualquier cambio que haya aplicado manualmente desde entonces.

Limitaciones

Kompose generalmente funciona bien con los archivos de Docker Compose utilizando las funciones más comunes y las mejores prácticas. Puede crear contenedores, exponer puertos y proporcionar almacenamiento persistente a través de volúmenes.

Sin embargo, no todas las conversiones serán perfectas. Algunas capacidades de Compose no tienen un equivalente directo en el mundo de Kubernetes, mientras que otras se mapearán de una manera que podría no satisfacer sus necesidades. El uso de implementaciones y servicios en este ejemplo es uno de esos casos:si estuviera implementando directamente en Kubernetes, podría usar una regla de Ingress para exponer su servicio, pero esto no lo crea Kompose. Las decisiones de opinión se resuelven tomando la opción más sencilla.

También se encontrará con problemas relacionados con los volúmenes. Los archivos de Docker Compose pueden vincular archivos y carpetas de montaje desde el host a contenedores. Esto no es posible con Kubernetes, por lo que necesitará una solución alternativa. Además, aunque Kompose puede crear recursos para PersistentVolumeClaims, no creará los PersistentVolumes reales. Deberá tener un volumen ya disponible dentro de su clúster antes de intentar implementar sus manifiestos.

Se ofrece una tabla completa de funciones admitidas y detalles de conversión como parte de la documentación de Kompose. Vale la pena verificar que las funciones de Docker Compose que usa sean compatibles antes de comenzar cualquier esfuerzo de conversión.

Conclusión

Kompose simplifica la migración de Docker Compose a un clúster de Kubernetes. Automatiza pasos que antes eran tediosos, lentos y propensos a errores. Es una buena ayuda de asistencia, aunque no es una herramienta que deba ejecutarse sin cierto grado de supervisión.

Las conversiones de Kompose no se aplican universalmente, por lo que no serán adecuadas para todos los entornos. Siempre vale la pena verificar los manifiestos emitidos antes de aplicarlos a su clúster. En algunos casos, es mejor usar Kompose como referencia:convierta su docker-compose.yml , vea cuál es el resultado y luego utilícelo como punto de partida para construir manifiestos que sean totalmente compatibles con su aplicación y clúster.


Docker
  1. Cómo implementar un servidor DNS dinámico con Docker en Debian 10

  2. Cómo instalar Jenkins con Docker

  3. Cómo implementar un contenedor nginx con Docker en Linode

  4. Cómo proteger datos confidenciales con Docker Compose Secrets

  5. Cómo usar los perfiles de servicio para simplificar las pilas en Docker Compose

Cómo implementar Kubernetes de un solo nodo con Microk8s en Ubuntu 20.04

De Docker Compose a Kubernetes con Podman

Cómo ejecutar Jenkins en Docker usando Docker Compose con Volúmenes

Cómo instalar Docker Compose en Ubuntu

Cómo implementar CouchDB como un clúster con Docker

Cómo implementar una aplicación PHP con Nginx y MySQL usando Docker y Docker Compose