Actualice el contenedor Docker sin tiempo de inactividad

17

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 la implementación de la imagen significa tiempo de inactividad porque tengo que eliminar el contenedor anterior antes de poder crear el nuevo, por lo que solo hay un contenedor que está vinculado al puerto 80/443.

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

das_j
fuente

Respuestas:

18

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 y solo lo conocen como "A". El equilibrador de carga sabe que hay dos o más backends (B, C, etc.), y no importa si son máquinas virtuales o contenedores.

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

  1. saque B de los backends elegibles para el equilibrador de carga para que ya no acepte ningún tráfico.
  2. espere a que se atiendan las solicitudes actualmente en vivo y se cierren las conexiones existentes.
  3. actualizar el contenedor o la VM subyacente que sirve B
  4. reinicie B, espere a que se cargue y comience a funcionar
  5. prueba B para asegurarse de que atiende solicitudes nuevas correctamente
  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 una solicitud abierta para actualizaciones en el lugar de los contenedores Docker , desde 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 para 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. Entonces, necesitamos llegar al estado objetivo ideal arriba, pero de manera incremental.

Asumamos que:

  • tienes un nombre DNS que apunta a tu 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 ninguna parte

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

Luego, sigue estos pasos:

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

Cómo actualizar un equilibrador de carga

La manera 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 un servicio, considere usarla y luego el mantenimiento y la actualización del equilibrador de carga no es un problema.

La forma manual

Si está ejecutando su propio equilibrador de carga, será útil agregar otra capa de indirección (es decir, DNS). Asumamos 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 equilibrador de carga tiene un grupo de back-end de P1, P2, etc.

Procedemos de la siguiente manera:

  • crear un nuevo equilibrador de carga B con la nueva versión del software
  • agregue todas las instancias de grupo de back-end P1, P2, etc. a nuestro nuevo equilibrador de carga B como backends
  • agregue la dirección IP de B a la resolución DNS junto con A

    • ahora estamos usando DNS efectivamente como balanceador de carga
    • Si las entradas para A y B no están ponderadas, son efectivamente 50-50
    • ahora mire para ver cómo funciona B, si hay algún error, etc.
    • Si algo está mal con B, deshaga de la siguiente manera:

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

y tu estas listo.

Detalles, diagramas y herramientas.

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

La moral

"Todos los problemas en informática pueden resolverse mediante otro nivel de indirección, excepto, por supuesto, el problema de demasiadas indirecciones". - David Wheeler

Misha Brukman
fuente
Pero cuando el equilibrador de carga también está en un contenedor (cuando uso CoreOS), ¿cómo actualizo este contenedor?
das_j
@das_j Edité la respuesta para agregar también cómo actualizar un equilibrador de carga. Sugerencia: se trata de otro nivel de indirección. :-)
Misha Brukman
1
En general, esto suena como cómo se actualizarían los servidores físicos y los equilibradores de carga físicos también.
Stefan Lasiewski
@StefanLasiewski tienes toda la razón y he eliminado la nota de "contenedores" en uno de los encabezados. Para un usuario externo, si una aplicación o un equilibrador de carga se están ejecutando en metal desnudo, contenedor o VM, es en gran medida invisible.
Misha Brukman