Actualice el contenedor Docker sin tiempo de inactividad

Digamos que tengo un contenedor Docker con un servidor web (como Apache 2). Ahora quiero actualizar el sistema operativo debajo de él. Esta respuesta de SF dice que la mejor manera es reconstruir la imagen base y mi imagen de Apache. Pero implementar la imagen significa tiempo de inactividad porque tengo que eliminar el contenedor antiguo antes de poder crear el nuevo, por lo que solo hay un contenedor que se vincula al puerto 80/443.

Pero, ¿cómo puedo implementar esta actualización sin tiempo de inactividad? ¿Debo usar un equilibrador de carga y usar la comunicación entre contenedores? ¿Y cómo actualizo el equilibrador de carga?

El escenario objetivo ideal

Sí, debe usar un equilibrador de carga y actualizar una instancia a la vez. No estoy seguro de dónde entra la comunicación entre contenedores.

Como ejemplo, imagine que tiene un equilibrador de carga que sirve a su sitio A. Los usuarios solo se conectan a él como y solo lo conocen como "A". El equilibrador de carga sabe que hay dos o más backends (B, C, etc.), y si son máquinas virtuales o contenedores no importa.

Luego, desea actualizar los backends, que en este caso son instancias de Apache.

  1. tomar B de los motores para el equilibrador de carga para no aceptar tráfico.
  2. espere a que se atiendan las solicitudes actualmente activas y se cierren las conexiones existentes.
  3. actualice el contenedor o la máquina virtual subyacente que sirve a B
  4. reinicie B, espere a que se cargue y comience a funcionar
  5. prueba B para asegurarte de que está atendiendo correctamente las nuevas solicitudes
  6. agregue B de nuevo al grupo de backend del equilibrador de carga para volver a habilitar el tráfico

Luego, haga el mismo proceso para C, D, etc.

Tenga en cuenta que hay un abrir solicitud de actualizaciones in situ de contenedores Docker, de noviembre de 2013, pero no parece tener mucho progreso, por lo que la solución anterior es lo que debe hacer mientras tanto.

Qué hacer con un sitio en vivo existente

Presumiblemente, está preguntando esto porque ya está ejecutando un sitio en vivo en este modelo y le gustaría actualizarlo sin tiempo de inactividad. Por lo tanto, necesitamos llegar al estado objetivo ideal anterior, pero de forma incremental.

Supongamos que:

  • tiene un nombre DNS que apunta a su contenedor
  • su contenedor se ejecuta en alguna dirección IP
  • sus usuarios no conocen la dirección IP del contenedor y no está codificada en ningún lugar

Si estas suposiciones son falsas, primero debe solucionarlo de manera que sea correcto.

A continuación, siga estos pasos:

  1. cree un equilibrador de carga en una nueva IP y apúntelo al contenedor existente como su único backend
  2. cambie DNS para que apunte al equilibrador de carga en lugar de a la IP del contenedor directamente
  3. agregue un backend de Apache idéntico con la misma configuración de VM + contenedor
  4. ahora tiene un equilibrador de carga con dos backends B y C, así que siga las instrucciones de la sección "escenario de destino ideal" para actualizarlos uno a la vez

Cómo actualizar un equilibrador de carga

La forma fácil (alojada)

La opción más fácil es no ejecutar su propio equilibrador. Por ejemplo, si está utilizando una plataforma en la nube que proporciona equilibrio de carga como servicio, considere usarla y, a continuación, el mantenimiento y la actualización del equilibrador de carga no son un problema.

La forma manual

Si está ejecutando su propio equilibrador de carga, agregar otra capa de indirección (es decir, DNS) ayudará. Supongamos lo siguiente:

  • que tenemos un nombre de host que se resuelve en la IP de nuestro equilibrador de carga A que nos gustaría actualizar
  • nuestro balanceador de carga tiene un grupo de backend de P1, P2, etc.

Procedemos de la siguiente manera:

  • cree un nuevo balanceador de carga B con la nueva versión de software
  • agregue todas las instancias de grupo de backend P1, P2, etc. a nuestro nuevo balanceador de carga B como backends
  • agregue la dirección IP de B a la resolución DNS junto con A

    • ahora estamos usando DNS de manera efectiva como un equilibrador de carga
    • si las entradas para A y B no están ponderadas, son efectivamente 50-50
    • ahora observe cómo funciona B, si hay errores, etc.
    • si hay algún problema con B, deshágalo de la siguiente manera:

      1. eliminar B de la configuración de DNS
      2. espere a que la entrada B en el DNS desaparezca (es decir, espere a que TTL expirar)
      3. baja B
  • suponga que ha realizado la prueba de "quemado" para B y que todo está bien
  • actualice el prioridad y peso para B en DNS.
  • eliminar A de DNS por completo
  • espere a que caduque el TTL de DNS; A ya no debería recibir ninguna solicitud
  • baja una

y has terminado.

Detalles, diagramas y herramientas

Vea estos artículos y herramientas que pueden ayudarlo a automatizar el proceso, pero la idea general es la misma:

moral

"Todos los problemas de la informática se pueden resolver con otro nivel de indirección, excepto, por supuesto, el problema de demasiadas indirectas."David Wheeler