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

De Docker Compose a Kubernetes con Podman

La herramienta Docker Compose ha sido valiosa para muchas personas que han estado trabajando con contenedores. Según la documentación, Docker Compose se describe a sí mismo como:

... una herramienta para definir y ejecutar aplicaciones multicontenedor. Con Compose, utiliza un archivo YAML para configurar los servicios de su aplicación. Luego, con un solo comando, creas e inicias todos los servicios desde tu configuración.

Un desafío con Docker Compose es que el formato de archivo YAML solo funciona con el motor Docker. Si bien puede dárselo a otros usuarios de Docker para la replicación local, no pueden usarlo con otros entornos de ejecución de contenedores. Es decir, hasta ahora.

[ Tutorial relacionado:Uso de Podman y Docker Compose ]

Con Podman 3.0, Docker Compose funciona con un backend de Podman

El poder real de Podman brilla al convertir fácilmente los contenedores basados ​​en Docker Compose en un archivo YAML de Kubernetes. Al igual que Docker Compose, Podman puede usar el archivo YAML de Kubernetes para replicar los contenedores localmente. Más importante aún, esto le permite a Podman tener un pod y un servicio orquestados que se pueden ejecutar en muchas plataformas, incluidas Kubernetes/OpenShift o minikube.

Este artículo explica el proceso de comenzar con un archivo Compose simple que ejecuta WordPress usando dos contenedores. La fuente de este archivo Compose está publicada en GitHub en el repositorio de composición impresionante de Docker. El uso exitoso de este archivo con Podman hace que la pantalla de configuración inicial de WordPress aparezca en un navegador.

Nota :en el momento de escribir este artículo, solo admitimos docker-compose comando ejecutándose de forma root.

Iniciar el servicio del sistema de Podman

Para usar Compose, el primer paso es asegurarse de que todos los paquetes requeridos estén instalados y luego configurar el servicio del sistema Podman (3.0 o superior) usando systemd . Después de instalar los paquetes, habilite e inicie Podman systemd servicio activado por socket usando el siguiente comando:

$ sudo systemctl enable --now podman.socket

Verifique que el servicio se esté ejecutando presionando el punto final de ping. Este paso debe tener éxito antes de continuar.

$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK

Ahora puede ejecutar Compose con confianza sabiendo que la API RESTful está funcionando.

Ejecutar Redactar

Como se mencionó anteriormente, el ejemplo ejecutará un archivo Compose que consta de dos contenedores para abrir una sesión de WordPress. Un contenedor ejecuta un servicio web Apache y el otro almacena los datos en una base de datos MySQL. Los dos contenedores se comunican a través de TCP/IP a través de una red dedicada a esta instancia de Compose. Para abrir los contenedores, ejecute docker-compose up .

$ sudo docker-compose up -d
Creating network "wordpress-mysql_default" with the default driver
Creating volume "wordpress-mysql_db_data" with default driver
Pulling db (mysql:8.0.19)...
0c27e8e5fcfab7805cfed996b55e5e98f43fd7ee76e1516f20cba139c6a299c5: pulling image () from docker.io/library/mysql:8.0.19  
Pulling wordpress (wordpress:latest)...
0d35c2300ec845fda141ba012f7c6dccde8f0ae106b8f4bb0fcfced69380f851: pulling image () from docker.io/library/wordpress:latest  
Creating wordpress-mysql_db_1        ... done
Creating wordpress-mysql_wordpress_1 ... done

Usa el podman ps Comando para verificar que se hayan creado dos contenedores y que ahora se estén ejecutando. No fue necesario ningún demonio Docker.

$ sudo podman ps
CONTAINER ID  IMAGE                               COMMAND               CREATED         STATUS             PORTS               NAMES
a089a40bb9ae  docker.io/library/mysql:8.0.19      --default-authent...  15 seconds ago  Up 15 seconds ago                      kind_hermann
510c028c273f  docker.io/library/wordpress:latest  apache2-foregroun...  15 seconds ago  Up 15 seconds ago  0.0.0.0:80->80/tcp  competent_kilby
$

Verificar que WordPress se esté ejecutando localmente

Las instrucciones para ejecutar WordPress indican que funciona correctamente y se puede acceder a él mediante el host local y el puerto 80.

Crear el YAML de Kubernetes

Con una instancia de trabajo de WordPress en la máquina local, comience el proceso de replicar estos contenedores en una plataforma Kubernetes. Podman puede generar YAML basado en Kubernetes a partir de contenedores en ejecución.

[ También le gustaría leer: Comience a aprender Kubernetes desde su máquina local]

¿Un pod o varios pods?

Existen dos enfoques para crear el YAML que usará en el entorno de Kubernetes:coloque dos contenedores en un solo pod con un servicio o cree dos pods, con un contenedor en cada uno y un servicio para exponer el front-end de Apache. Determinar cuál es el mejor enfoque puede requerir algo de ensayo y error.

Una consideración que puede dictar qué enfoque utilizar es cómo se comunicarán los contenedores o módulos. Cuando Compose creó estos contenedores, realizó una serie de pasos para garantizar que los dos contenedores pudieran comunicarse entre sí mediante nombres DNS. De hecho, Compose configura alias en los contenedores que se reconocen como nombres DNS al resolver los contenedores por nombre. Al colocar los contenedores dentro del mismo pod, no hay necesidad de resolución de nombres entre ellos porque comparten un espacio de nombres de red. Por lo tanto, simplemente pueden usar localhost para comunicarse entre sí.

Colocar los contenedores en diferentes pods de Kubernetes brinda una mayor flexibilidad, pero los contenedores deberán comunicarse entre sí mediante algún otro mecanismo.

Generar el YAML

Debe conocer los nombres o ID de los contenedores para comenzar a crear el YAML de Kubernetes. Decida si Podman debe generar una descripción de servicio para Kubernetes. En este caso, exponga la interfaz de Apache para que pueda interactuar con WordPress usando el navegador. Usa el podman generate kube comando para crear archivos YAML.

$ sudo podman generate kube -s -f wordpress.yaml a089a40bb9ae 510c028c273f

El -s en el comando anterior significa que Podman generará servicio para este pod. El -f La opción nos permite guardar el YAML generado en un archivo. De lo contrario, la salida se envía a stdout , donde se puede redirigir a un archivo.

$ cat wordpress.yaml
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.0.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-12-03T22:30:07Z"
  labels:
    app: kindhermann
  name: kindhermann
spec:
  containers:
  - command:
    - docker-entrypoint.sh
    - --default-authentication-plugin=mysql_native_password
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   ...
    workingDir: /
  - command:
    - docker-entrypoint.sh
    - apache2-foreground
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  ...
    - name: WORDPRESS_DB_HOST
      value: kindhermann
    - name: WORDPRESS_DB_PASSWORD
      value: db
    - name: APACHE_ENVVARS
      value: /etc/apache2/envvars
 ...
    image: docker.io/library/wordpress:latest
    name: competentkilby
    ports:
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
      privileged: false
      readOnlyRootFilesystem: false
      seLinuxOptions: {}
    workingDir: /var/www/html
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-12-03T22:30:07Z"
  labels:
    app: kindhermann
  name: kindhermann
spec:
  ports:
  - name: "80"
    nodePort: 30579
    port: 80
    protocol: TCP
    targetPort: 0
  selector:
    app: kindhermann
  type: NodePort
status:
  loadBalancer: {}

Para que el contenedor de Apache se comunique con el contenedor de MySQL, el autor del archivo Compose ha optado por utilizar una variable de entorno llamada WORDPRESS_DB_HOST para indicar el nombre de host del contenedor MySQL. Antes de ejecutar esto en un entorno de Kubernetes, cambie el valor de WORDPRESS_DB_HOST al nombre del contenedor MySQL (kindhermann en este ejemplo) o 127.0.0.1 (los contenedores dentro del mismo pod pueden comunicarse entre sí a través de localhost).

...
    - name: WORDPRESS_DB_HOST
      value: kindhermann OR 127.0.0.1
---

Barra lateral:

Cuando Compose realiza una compilación

En muchos ejemplos de Compose, el autor elige construir su imagen de contenedor. Esto generalmente se debe a que requieren paquetes adicionales o desean realizar algún nivel de personalización en la imagen. Cuando esto ocurra, habrá una nueva imagen adicional en el almacén de imágenes de Podman. La elección de ejecutar el YAML de Kubernetes generado podría fallar porque hace referencia a una imagen de contenedor que solo está presente en la tienda local.

Para remediar esto, use podman push para mover estas nuevas imágenes a un registro global como quay.io o a un registro específico de Kubernetes para que Kubernetes pueda extraer estas imágenes. Asegúrese de que el nombre de la imagen en el archivo YAML resultante sea el mismo que el de la imagen enviada.

Kubernetes

El siguiente paso para continuar con este ejemplo y aplicarlo a un entorno de Kubernetes mostrará cómo ejecutar este ejemplo tanto en minikube como en OpenShift. No hay nada específico en YAML que impida que los pods se ejecuten en otro entorno de Kubernetes, por lo que, en teoría, debería funcionar con otras versiones de Kubernetes.

Este artículo asume la existencia de un entorno minikube y/o OpenShift. Está fuera del alcance de este artículo documentar la configuración de un entorno minikube u OpenShift Kubernetes.

minicubo

El primer paso para implementar en minikube es simplemente crear el pod.

$ minikube kubectl -- create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created

Después de esperar unos segundos, verifique el estado de la cápsula y los contenedores. Según la velocidad y el ancho de banda de la red, es posible que el pod ya esté disponible. Verifique el estado del pod usando kubectl get pods .

$ minikube kubectl -- get pods
NAME          READY   STATUS    RESTARTS   AGE
kindhermann   2/2     Running   0          28

Ahora que ambos contenedores están listos, pruebe la disponibilidad de la sesión de WordPress. Primero, obtenga la dirección IP del pod en Kubernetes usando kubectl .

$ minikube kubectl -- describe  pods | grep Node:
Node:         minikube/192.168.39.7

Dirija el navegador de su elección a la dirección IP del pod y vea la pantalla de configuración de WordPress.

Desplazamiento abierto

Para este artículo, un clúster de OpenShift se ejecuta en GCP.

Usa el wordpress.yaml generado para crear el pod y el servicio. Si usa un entorno Kubernetes estándar, reemplace oc con kubectl en los siguientes comandos.

$ oc create -f wordpress.yaml  
pod/kindhermann created
service/kindhermann created

Espere unos segundos hasta que aparezcan el pod y el servicio. El kindhermann pod está en En ejecución estado con ambos contenedores en funcionamiento. El kindhermann El servicio también está disponible con una IP de clúster asignada.

$ oc get pods
NAME          READY   STATUS    RESTARTS   AGE
kindhermann   2/2     Running   0          39s
$ oc get services
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)        AGE
kindhermann   NodePort       172.30.103.100   <none>                                 80:30579/TCP   45s
Kubernetes    ClusterIP      172.30.0.1       <none>                                 443/TCP        44m
openshift     ExternalName   <none>           Kubernetes.default.svc.cluster.local   <none>         36m

Ver el pod y el servicio en la consola.

Para acceder al servicio desde fuera del clúster, expóngalo, lo que creará una ruta.

$ oc expose svc/kindhermann
route.route.openshift.io/kindhermann exposed
$ oc/kubectl get routes
NAME          HOST/PORT                                                                          PATH   SERVICES      PORT   TERMINATION   WILDCARD
kindhermann   kindhermann-default.apps.ci-ln-d3gw292-f76d1.origin-ci-int-gce.dev.openshift.com          kindhermann   80                   None

Exponer el servicio creó la ruta de host/puerto que se muestra arriba y accedió a ese punto final. Vea la página de configuración de la aplicación de WordPress que se ejecuta en el clúster de OpenShift o Kubernetes.

Examine la ruta en la consola y acceda directamente al punto final desde allí también.

[ Obtenga este libro electrónico gratuito:Administrar sus clústeres de Kubernetes para principiantes. ]

Resumir

Como puede ver, mover las configuraciones de la carga de trabajo de los entornos de Docker Compose a Kubernetes es sencillo con Podman 3.0. Podman no solo brinda la flexibilidad de Docker Compose al desarrollar aplicaciones, sino que también facilita el cambio a Kubernetes cuando las aplicaciones están listas para las grandes ligas. Hace todo esto usando el podman generate kube dominio. Pruébelo usted mismo en tres sencillos pasos.


Docker
  1. Cómo instalar Jenkins con Docker

  2. Cómo usar Docker Compose

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

  4. Una guía rápida para usar Docker Compose

  5. Instalar WordPress con Docker Compose, Nginx, Apache con SSL

Alternativas de Kubernetes a los comandos de Docker

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

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

Trabajar con imágenes de Docker desde la línea de comandos

Trabajar con Docker Containers desde la línea de comandos

Instale y use Docker Compose con Docker en Ubuntu 22.04