Cómo habilitar la actualización automática de contenedores Podman
Podman es una plataforma de contenedorización compatible con OCI que a menudo se usa en lugar de Docker. Su modelo sin daemon y su amplio conjunto de funciones lo convierten en un buen candidato para su uso tanto en desarrollo como en producción.
En este artículo, le mostraremos cómo usar el sistema de actualización automática de Podman para reiniciar sus contenedores cuando se publiquen nuevas imágenes. Podman se puede configurar para buscar periódicamente actualizaciones, extraer la imagen más reciente y regenerar los contenedores afectados utilizando su configuración actual.
¿Por qué actualizar automáticamente los contenedores?
Los contenedores suelen ser de corta duración, pero aún necesitan un mantenimiento regular. Una vulnerabilidad crítica dentro de una imagen podría dar acceso a los atacantes a su aplicación, que será explotada a las pocas horas de ser descubierta.
La mayoría de las tecnologías de contenedores populares requieren que actualice manualmente sus contenedores. Esto pone en los equipos de operaciones la responsabilidad de suscribirse a los anuncios de lanzamiento y crear herramientas que implementen nuevos cambios.
El sistema de actualización de contenedores incorporado de Podman resuelve este problema y mantiene las cargas de trabajo actualizadas. Los contenedores se pueden actualizar rápidamente después de que se insertan nuevas versiones de imágenes, lo que garantiza que sus implementaciones estén actualizadas con los últimos parches y correcciones de errores.
Habilitar actualizaciones automáticas
Las actualizaciones automáticas se habilitan para un contenedor estableciendo una io.containers.autoupdate
etiqueta cuando se crea.
$ podman run -d -p 8080:80 \
–name nginx-contenedor\
–label io.containers.autoupdate=registro \
docker.io/library/nginx:latest
La etiqueta puede tener dos valores posibles:
registry
– Mientras busca actualizaciones, Podman verificará con el registro de imágenes para ver si hay disponible una nueva versión de la etiqueta utilizada por su contenedor. En este caso, la imagen se extraerá y su contenedor se reiniciará. Las actualizaciones del registro solo funcionan si usa la ruta completa del registro;docker.io/library/nginx:latest
el enlace que se muestra arriba es intencional yanginx:latest
que es demasiado vago.local
– Este método de actualización evita que Podman vea imágenes de contenedores que ya existen en el sistema de archivos de su host. El contenedor se reiniciará si la versión local de la etiqueta de imagen es diferente de la versión en la que se ejecuta el contenedor. Esto puede ser útil cuando se reconstruyen imágenes durante el desarrollo.
La presencia de la etiqueta hace que este contenedor NGINX de muestra sea elegible para actualizaciones automáticas. Sin embargo, se requiere más trabajo antes de que se puedan aplicar las actualizaciones.
Creación de un servicio Systemd
El mecanismo de actualización de Podman requiere que sus contenedores se ejecuten dentro de los servicios systemd. Debido a que Podman no tiene demonios, carece de un controlador central que pueda iniciar y detener sus contenedores. Envolverlos en un servicio systemd brinda capacidades de administración del ciclo de vida y la capacidad de reiniciarse en respuesta a ciertos eventos.
La CLI de Podman incluye un comando que crea una definición de módulo systemd a partir de un contenedor:
$ podman generate systemd --name nginx-container > /etc/systemd/system/nginx-container.service
Los comandos anteriores crean un nuevo contenedor NGINX con un servicio systemd en la ubicación correcta.
Luego, vuelva a cargar systemd para registrar la definición del servicio, luego habilite e inicie el servicio:
$ systemctl daemon-reload
$ systemctl habilitar nginx-container.service
$ systemctl start nginx-container.service
Su contenedor NGINX ahora es un servicio systemd que se inicia automáticamente cuando se inicia su host. Puede usar systemctl
comandos para iniciar y detener un contenedor en lugar de la CLI de Podman:
$ systemctl start nginx-container.service
$ systemctl stop nginx-container.service
Para eliminar el contenedor en el futuro, debe detener, deshabilitar y eliminar el archivo del módulo de servicio. Después de eso, reinicie systemd para aplicar completamente los cambios.
$ systemctl stop nginx-container.service
$ systemctl deshabilitar nginx-container.service
$ rm /etc/systemd/system/nginx-container.servicio
$ systemctl daemon-reload
Realización de una actualización
Ahora todo está configurado para una actualización automática exitosa del contenedor NGINX. Puede ejecutar una verificación de actualización bajo demanda con el comando Podman auto-update
:
$ podman auto-update
Intentando extraer docker.io/library/nginx:latest…
Obtener firmas de origen de imagen
…
POLÍTICA DE IMAGEN DE CONTENEDOR DE UNIDAD ACTUALIZADA
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry true
Esto actualiza los contenedores en los servicios systemd que están disponibles para el usuario que ejecuta el comando. Es posible que deba usar sudo
para seguir el ejemplo anterior; si es así, ejecute auto-update
el comando también como root:
$ sudo podman auto-update
En registry
este ejemplo, se utilizó una estrategia de actualización, por lo que Podman se conecta al registro de imágenes, busca cambios y luego extrae una nueva imagen, si corresponde. El resultado del comando muestra si se ha actualizado cada contenedor de servicios.
Debido a que los contenedores son administrados por systemd, Podman puede determinar si un nuevo contenedor se inició correctamente. Podman retrocederá automáticamente a una versión anterior de la imagen si se detecta un error de actualización. Para que esto funcione de manera confiable, la aplicación dentro del contenedor debe notificar a systemd que se inició correctamente. Esto se puede hacer ejecutando systemd-notify --ready
.
Comprobando actualizaciones
En ocasiones, es posible que desee verificar si hay actualizaciones disponibles para su flota de contenedores sin aplicarlas de inmediato. Use auto-update
el --dry-run
comando flag para obtener una lista de servicios donde se publica la imagen actualizada:
$ podman auto-update --dry-run
…
POLÍTICA DE IMAGEN DE CONTENEDOR DE UNIDAD ACTUALIZADA
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry pending
Los servicios mostrados pending
tienen una actualización disponible.
Aplicar actualizaciones en un horario
Ahora hemos configurado con éxito las actualizaciones de contenedores bajo demanda. No necesita extraer manualmente nuevas imágenes o reiniciar contenedores. El paso final es configurar un programa para que Podman aplique actualizaciones periódicamente sin ejecutar un auto-update
comando.
La mayoría de las distribuciones de Podman incluyen un temporizador de sistema para este propósito. Puedes activar el temporizador usando systemctl
:
$ systemctl enable podman-auto-update.timer
El temporizador está configurado para buscar actualizaciones todos los días. Puede personalizar la programación abriendo el archivo del temporizador usando systemctl edit
y cambiando el valor del OnCalendar
campo :
$ systemctl edit podman-auto-update.timer
[Temporizador]
OnCalendar=Fri *-*-* 18:00
La expresión de tiempo que se muestra arriba ejecutará la verificación de actualización todos los viernes a las 18:00. La sintaxis se describe en el manual de systemd .
Ahora que el temporizador está habilitado, puede comenzar a implementar sus io.containers.autoupdate
contenedores etiquetados. Se actualizarán y reiniciarán periódicamente, automatizando los procedimientos de mantenimiento.
No necesita usar el temporizador del sistema de Podman para programar actualizaciones. Puede ejecutar podman auto-update
dentro de su kit de herramientas existente u otro programador de tareas como cron
.
Resumen
Las actualizaciones automáticas de Podman le permiten mover contenedores a nuevas versiones de imágenes sin reiniciarlos manualmente ni usar herramientas externas. Esto puede ayudarlo a mantener su flota de contenedores a medida que las imágenes publican correcciones de errores y correcciones de seguridad.
Si bien las actualizaciones automáticas son una herramienta útil, no deben usarse sin el debido cuidado. Permitir actualizaciones automáticas puede generar problemas propios si se libera accidentalmente una imagen corrupta. Los contenedores que se reinician solos también pueden causar tiempo de inactividad o interrumpir los servicios dependientes.
Por lo tanto, debe evaluar la idoneidad de su propia aplicación antes de implementar esta solución. Un enfoque intermedio es auto-update --dry-run
ejecutar periódicamente y enviar los resultados al servicio de supervisión. Esto le informa de las actualizaciones disponibles sin ponerlas en riesgo de que se apliquen sin aprobación.
Deja una respuesta