Tutoriales

Administre contenedores en el perímetro con Linux

A menudo escucho la pregunta: «¿Cómo administrar contenedores con RHEL?» Creo que hay una brecha de conocimiento aquí porque muchos usuarios nunca lo han usado. docker run [image] Más allá de las computadoras portátiles y hacia la producción. Esto es algo bueno para muchos entornos, ya que el uso de una plataforma de orquestación como Kubernetes, el estándar de la industria, proporciona una gama casi infinita de características y beneficios.

La realidad de muchos entornos perimetrales es que ser liviano, seguro y confiable es más importante que tener las capacidades integrales que brinda Kubernetes.Pero operativamente, pensar en escalar puede ser complicado docker run a través de una gran cantidad de sistemas. Una respuesta obvia es mantener varios scripts para realizar las operaciones diarias; sin embargo, esto es más o menos lo contrario de hacia dónde se dirige la industria. Afortunadamente, existen formas más eficientes de hacer las cosas usando solo las capacidades básicas de Red Hat Enterprise Linux (RHEL).

Cómo gestiona Linux los contenedores

Si puede asegurarse de que los contenedores deseados con la configuración correcta siempre se ejecutan con una sobrecarga mínima en una variedad de sistemas perimetrales, puede resolver muchos casos de uso. Afortunadamente, RHEL proporciona todo lo necesario para lograr esto mediante una combinación de dos componentes conocidos en el espacio de Linux: Podman y systemd.

[ Get the systemd cheat sheet. ]

TL;RD:

  • Los contenedores que se ejecutan en dispositivos perimetrales no siempre requieren Kubernetes.
  • Podman proporciona una gestión avanzada de contenedores, que incluye:
    • crear vaina
    • Habilitar actualizaciones automáticas
    • Administre aplicaciones en contenedores como servicios con systemd
  • Kubernetes y MicroShift son excelentes herramientas, pero Podman puede ser suficiente para algunos casos de uso.

Primero, definiré el contenedor de administración y estableceré una línea de base, ya que podría ser un complemento. Para simplificar, describiré algunas operaciones comunes que todos los contenedores necesitan en producción: inicio, inicio automático, reinicio automático, comprobaciones de estado en tiempo de ejecución y actualizaciones.

Acerca de Podman, systemd y contenedores

Podman es un potente motor de contenedores que proporciona todo lo que necesita para ejecutar contenedores y pods (grupos de contenedores). Sus raíces provienen del proyecto Docker, que busca la compatibilidad y una arquitectura interna más simple. Podman proporciona una interfaz de línea de comandos (CLI) familiar, una potente API y la capacidad de crear e interpretar archivos YAML de Kubernetes. Además, al usar Podman en RHEL 9, el sistema utilizará de forma predeterminada cgroup2, que es efectivamente la única forma de delegar grupos de control de Linux de forma segura. Esta es una muy buena postura de seguridad lista para usar.

[ Download now: Podman basics cheat sheet. ]

Otro componente del sistema del que hablaré es systemd, que administra el espacio del usuario en los sistemas Linux modernos. El proyecto comenzó como un sistema de inicio de reemplazo, ganó más funcionalidad y se convirtió en un administrador de «sistema». Una de mis cosas favoritas de systemd es que proporciona una abstracción declarativa para describir cómo debe ejecutarse un servicio en Linux. Si pensaste «oye, esto se parece mucho a lo que nos da Kubernetes YAML», ¡tienes razón! Cuando lo piensas de esa manera, es genial.

Esta es la mejor parte de poner contenedores en producción en un host Linux: todas las integraciones y conexiones necesarias entre Podman y systemd están ahí y maduras. También es el método más práctico y ligero para el hardware actual.

La integración entre el tiempo de ejecución del contenedor y systemd fue uno de los factores limitantes que encontraron los administradores en los primeros días del proyecto Docker. Ahora que Podman ha entregado esto, amplía la cantidad de casos de uso que los contenedores pueden ejecutar sin un sistema de orquestación.

[ Getting started with containers? Check out this no-cost course: Deploying containerized applications. ]

Esencialmente, puede usar Podman para la creación de instancias de contenedores y confiar en systemd como árbitro para que todo funcione correctamente. Ambos componentes están haciendo lo que mejor saben hacer, y en el espíritu de la filosofía Unix. Aún mejor, Podman puede generar archivos de unidad systemd para usted, de forma similar a como puede crear Kubernetes YAML. Si alguna vez usó pods estáticos en Kubernetes, encontrará que esto es similar, pero con algunas ventajas.

Ejemplo de contenedor único

Ahora que sabe cuáles son estos componentes, aquí hay un ejemplo de cómo funciona con un solo contenedor.

Primero, ejecute un contenedor simple en el sistema:

# podman run --name app1 --rm \
--label "io.containers.autoupdate=registry" \
--sdnotify=container \
-p 8081:80 \
docker.io/nginx

Hay dos opciones en este comando para ayudar a «administrar» app1:

  • Este --label "io.containers.autoupdate=registry" Opción para monitorear el registro y actualizar automáticamente el contenedor cuando aparece una nueva versión con la misma etiqueta.
  • Este --sdnotify=container La opción utiliza la interfaz nativa para el bus de mensajes de systemd, ya que el objetivo es aprovechar systemd para controlar las operaciones de inicio, detención y reinicio. Esto también mejora la función de actualización automática, por lo que si falla un nuevo contenedor, Podman volverá automáticamente a la copia de trabajo anterior sin la intervención del usuario. ¡increíble!

A continuación, deje que Podman haga el trabajo pesado para crear el archivo de la unidad:

# podman generate systemd --new -n -f --start-timeout 600 app1

Este --new Opción para crear un nuevo contenedor a partir de la imagen en cada inicio. Esto también hace que los archivos de unidad sean totalmente portátiles entre sistemas. Es el único archivo necesario para ejecutar un contenedor en el sistema.Este -n opción utiliza el nombre del contenedor del archivo de la unidad, por ejemplo, container-app1.service. Este -f opción para crear un archivo en lugar de usar la salida estándar.Este --start-timeout 600 opción para agregar un tiempo de arranque más largo, como 10 minutos, para garantizar que el sistema tenga tiempo suficiente para extraer la imagen en el arranque inicial. No siempre necesita cambiar la configuración predeterminada, pero hacerlo puede ayudar a evitar un paso separado para extraer imágenes.

Desde aquí, solo necesitas copiar ./container-app1.service Ingresar /etc/systemd/systemPara usuarios sin privilegios, puede utilizar /etc/systemd/user o $HOME/.config/systemd/userUna vez que el archivo de la unidad esté en su lugar, puede ejecutar systemctl daemon-reload Haga que systemd sea consciente de esto.

Para iniciar y permitir que el contenedor se ejecute al inicio, ejecute systemctl enable --now container-app1.serviceLo único que debe hacer es habilitar podman-auto-update.timerPiense en esto como un programa «cron» en el que el sistema busca actualizaciones para todos los contenedores. io.containers.autoupdate Etiqueta.configurar temporizador del sistema Un horario que se adapta a tu entorno.Si desea que el sistema verifique a la 1 a. m. del sábado, simplemente cambie OnCalendar=daily a OnCalendar=Sat *-*-* 01:00:00Otra opción que vale la pena mencionar es RandomizedDelaySec=900Para entornos con miles (o incluso millones) de dispositivos, es una buena idea registrarse aleatoriamente de esta manera para ayudar a limitar las cargas máximas en la infraestructura de registro.

Ejemplo de un pod de varios contenedores

Los archivos unitarios se pueden usar para contenedores individuales, así como para vainas de contenedores. Administrar pods con systemd proporciona una base más sólida para ejecutar aplicaciones más complejas.Encontré que esta es una buena opción. docker-compose Ejemplo.

Crear un pod simple con genéricos Solicitud de libro de visitas:

# podman pod create --name guestbook -p 8080:80

# podman run -d --rm \
--name guestbook-backend \
--pod guestbook \
--label io.containers.autoupdate=image \
--sdnotify=container \
docker.io/redis:latest

# podman run -d --rm \
--name guestbook-frontend \
--label io.containers.autoupdate=image \
--sdnotify=container \
--pod guestbook \
-e GET_HOSTS_FROM="env" \
-e REDIS_SLAVE_SERVICE_HOST="localhost:6379" \
gcr.io/google_samples/gb-frontend:v6

# podman generate systemd --new -n -f --start-timeout 600 guestbook

The following unit files are created:
./pod-guestbook.service
./container-guestbook-frontend.service
./container-guestbook-backend.service

Ahora copie los tres archivos de unidad a su sistema, pero solo necesita habilitar y arrancar/habilitar pod-guestbook.servicesystemd se encargará del resto.

[ Want to test your sysadmin skills? Take a skills assessment today. ]

Escalado entre sistemas

Hasta ahora, ha visto lo fácil que es definir y ejecutar una aplicación, ya sea que consista en un solo contenedor o en un grupo de contenedores, usando solo componentes simples del sistema operativo. Una cosa que realmente me gusta de este enfoque es que minimiza la cantidad de componentes en la pila. Tampoco tiene que preocuparse por actividades propensas a errores como la regeneración de certificados o el equilibrio de más ciclos de vida de la plataforma en el sitio.

Ahora que comprende cómo encajan las piezas, puede escalar en muchos sistemas. Quizás la forma más fácil es incrustar estos archivos de unidad en la imagen del sistema operativo. De esta manera, cuando se inicia el nodo, primero extrae el contenedor y todo está bien.

Sin embargo, esto no ayudó con los cambios del día siguiente. Aquí, puede aprovechar una variedad de técnicas para adaptarse a su entorno y caso de uso. Ansible es una opción ampliamente implementada para escalar, automatizar y administrar la infraestructura perimetral. Dado que hay tantas cosas para automatizar en un entorno remoto, ¿por qué no escalar la implementación de su aplicación con las mismas técnicas de automatización que ya está utilizando?

[ Get started with IT automation with the Ansible Automation Platform beginner’s guide. ]

Ansible proporciona fácilmente todo lo anterior.uno nuevo Funciones del sistema Linux para Podman (en desarrollo) simplificará aún más dichas implementaciones y facilitará la generación y eliminación de estos archivos de unidad en un conjunto de sistemas. Este rol aún se encuentra en desarrollo ascendente y actualmente no se admite ni se incluye en RHEL. El equipo agradece cualquier comentario al respecto, así que abra un problema con comentarios en el repositorio de GitHub.

Alternativamente, hay algunas opciones convincentes para varios proyectos comunitarios disponibles.Dos que vale la pena probar son Obtener y flotaVarían en alcance y tecnología, pero brindan una excelente experiencia de segundo día para los administradores.

envolver

No importa cómo extienda esta práctica, usar systemd y Podman sigue siendo la forma más ligera de ejecutar contenedores en Linux. Uno de nuestros clientes está haciendo esto hoy con más de 40 aplicaciones por nodo y le encantan los resultados. Si está leyendo esto y pensando: «¿Qué pasa con MicroShift? ¿No es una plataforma de borde liviana?» Sí, tiene razón. Para los sistemas que se benefician de la API de Kubernetes, MicroShift ayudará a llevarlo a dispositivos más pequeños. Al momento de escribir este artículo, se requiere alrededor de 1 GB de memoria para ejecutar la plataforma y la API. Teniendo en cuenta todo lo que implica, es bastante sorprendente.

Digamos que está eligiendo entre MicroShift o solo Linux. Hay dos preguntas que puede hacerse: 1) ¿Necesito ejecutar la API de Kubernetes directamente en estos dispositivos o beneficiarme de ellos? 2) ¿Tengo recursos de hardware? Por supuesto, puede haber otras consideraciones para su entorno, pero esperamos que esto lo ayude a tomar su decisión.

Desde el punto de vista tecnológico, vivimos tiempos increíbles que abren muchas posibilidades para transformar los sistemas Linux estáticos tradicionales en otros más adaptables y valiosos.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba