GNU/Linux >> Tutoriales Linux >  >> Linux

Introducción a la gestión de contenedores de Linux

Los contenedores de Linux han existido durante algún tiempo, pero estuvieron ampliamente disponibles cuando se introdujeron en el kernel de Linux en 2008. Los contenedores son componentes de aplicaciones ejecutables y livianos que combinan el código fuente de la aplicación con las bibliotecas del sistema operativo y las dependencias necesarias para ejecutar el código en cualquier entorno. Además, ofrecen tecnologías de empaquetado y entrega de aplicaciones mientras aprovechan el aislamiento de aplicaciones con la flexibilidad de los métodos de implementación basados ​​en imágenes.

Los contenedores de Linux utilizan grupos de control para la gestión de recursos, espacios de nombres para el aislamiento de procesos del sistema, SELinux Security para habilitar la tenencia segura y reducir las amenazas o vulnerabilidades de seguridad. Estas tecnologías proporcionan un entorno para producir, ejecutar, administrar y orquestar contenedores.

El artículo es una guía introductoria a los elementos principales de la arquitectura de contenedores de Linux, cómo se comparan los contenedores con la virtualización KVM, los contenedores basados ​​en imágenes, los contenedores docker y las herramientas de orquestación de contenedores.

Arquitectura de contenedores

Un contenedor de Linux utiliza elementos clave del kernel de Linux, como cgroups, SELinux y espacios de nombres. Los espacios de nombres aseguran el aislamiento de los procesos del sistema, mientras que los cgroups (grupos de control), como sugiere el nombre, se utilizan para controlar los recursos del sistema Linux. SELinux se utiliza para asegurar la separación entre el host y los contenedores y entre contenedores individuales. Puede emplear SELinux para habilitar la tenencia múltiple segura y reducir el potencial de amenazas y vulnerabilidades de seguridad. Después del kernel, tenemos la interfaz de administración que interactúa con otros componentes para desarrollar, administrar y orquestar contenedores.

SELinux

La seguridad es un componente crítico de cualquier sistema o arquitectura Linux. SELinux debería ser la primera línea de defensa para un entorno de contenedores seguro. SELinux es una arquitectura de seguridad para sistemas Linux que brinda a los administradores de sistemas más control sobre el acceso a la arquitectura de su contenedor. Puede aislar los contenedores del sistema host y otros contenedores entre sí.

Un entorno de contenedores confiable requiere un administrador de sistemas para crear políticas de seguridad personalizadas. Los sistemas Linux proporcionan diferentes herramientas como podman o udica para generar políticas de contenedores de SELinux. Algunas políticas de contenedores controlan cómo los contenedores acceden a los recursos del host, como unidades de almacenamiento, dispositivos y herramientas de red. Dicha política fortalecerá el entorno de su contenedor frente a las amenazas de seguridad y creará un entorno que mantenga el cumplimiento normativo.

La arquitectura crea una separación segura que evita que los procesos raíz dentro del contenedor interfieran con otros servicios que se ejecutan fuera del contenedor. Por ejemplo, un sistema asigna automáticamente a un contenedor Docker un contexto SELinux especificado en la política SELinux. Como resultado, SELinux siempre parece estar deshabilitado dentro de un contenedor a pesar de que se está ejecutando en modo obligatorio en el sistema operativo o sistema host.
Nota:Deshabilitar o ejecutar SELinux en modo permisivo en una máquina host no separará los contenedores de forma segura. .

Espacios de nombres

Los espacios de nombres del kernel proporcionan aislamiento de procesos para los contenedores de Linux. Permiten la creación de abstracción de los recursos del sistema donde cada uno aparece como una instancia separada para los procesos dentro de un espacio de nombres. En esencia, los contenedores pueden usar los recursos del sistema simultáneamente sin crear conflictos. Los espacios de nombres incluyen red, montaje, espacios de nombres UTS, espacios de nombres IPC, espacios de nombres PID.

  • Los espacios de nombres de montaje aíslan los puntos de montaje del sistema de archivos disponibles para un grupo de procesos. Otros servicios en un espacio de nombres de montaje diferente pueden tener vistas alternativas de la jerarquía del sistema de archivos. Por ejemplo, cada contenedor de su entorno puede tener su propio directorio /var.
  • Espacio de nombres UTS:aísle el nombre del nodo y los identificadores del sistema de nombres de dominio. Permite que cada contenedor tenga un nombre de host único y un nombre de dominio NIS.
  • Los espacios de nombres de red crean aislamiento de controladores de red, cortafuegos y tablas de IP de enrutamiento. En esencia, puede diseñar un entorno de contenedor para usar pilas de redes virtuales separadas con dispositivos virtuales o físicos e incluso asignarles direcciones IP únicas o reglas de iptable.
  • Los espacios de nombres PID permiten que los procesos del sistema en diferentes contenedores usen el mismo PID. En esencia, cada contenedor puede tener un proceso de inicio único para administrar el ciclo de vida del contenedor o inicializar las tareas del sistema. Cada contenedor tendrá su propio directorio /proc único para monitorear los procesos que se ejecutan dentro del contenedor. Tenga en cuenta que un contenedor solo conoce sus procesos/servicios y no puede ver otros procesos ejecutándose en diferentes partes del sistema Linux. Sin embargo, un sistema operativo host es consciente de los procesos que se ejecutan dentro de un contenedor.
  • Espacios de nombres IPC:aísle los recursos de comunicación entre procesos del sistema (System V, objetos IPC, colas de mensajes POSIX) para permitir que diferentes contenedores creen segmentos de memoria compartida con el mismo nombre. Sin embargo, no pueden interactuar con los segmentos de memoria de otros contenedores o con la memoria compartida.
  • Espacios de nombres de usuario:permite que un administrador de sistemas especifique UID de host dedicados a un contenedor. Por ejemplo, un proceso del sistema puede tener privilegios de raíz dentro de un contenedor pero, de manera similar, no tener privilegios para operaciones fuera del contenedor.

Grupos de control

Kernel cgroups permite la gestión de recursos del sistema entre diferentes grupos de procesos. Los Cgroups asignan tiempo de CPU, ancho de banda de red o memoria del sistema entre tareas definidas por el usuario.

Contenedores VS Virtualización KVM

Tanto los contenedores como las tecnologías de virtualización KVM tienen ventajas y desventajas que guían el caso de uso o el entorno a implementar. Para empezar, las máquinas virtuales KVM requieren un kernel propio, mientras que los contenedores comparten el kernel del host. Por lo tanto, una ventaja clave de los contenedores es lanzar más contenedores que máquinas virtuales utilizando los mismos recursos de hardware.

Contenedores Linux

Áreas de aplicación:

  •  Arquitectura de la aplicación que requiere escalar ampliamente.
  • Arquitectura de microservicios.
  • Desarrollo de aplicaciones locales.

Virtualización KVM

Ventajas Desventajas
Diseñado para gestionar el aislamiento de aplicaciones en contenedores. El aislamiento del contenedor no está al mismo nivel que la virtualización KVM.
Las configuraciones o los cambios de host de todo el sistema son visibles en cada contenedor. Mayor complejidad en la gestión de contenedores.
Los contenedores son livianos y ofrecen una escalabilidad más rápida de su arquitectura. Requiere amplias habilidades de administrador de sistemas en la gestión de registros, datos persistentes con el permiso de lectura y escritura correcto.
Permite la creación y distribución rápida de aplicaciones.
Facilita un menor costo operativo y de almacenamiento en lo que respecta al desarrollo y adquisición de imágenes de contenedores.

Áreas de aplicación:

  • Entornos de sistemas que requieren una clara dedicación de recursos.
  • Sistemas que requieren un kernel de ejecución independiente.

Contenedor basado en imágenes

Los contenedores basados ​​en imágenes empaquetan aplicaciones con pilas de tiempo de ejecución individuales, lo que hace que los contenedores aprovisionados sean independientes del sistema operativo host. Básicamente, puede ejecutar varias instancias de una aplicación, cada una en una plataforma diferente. Para hacer posible una arquitectura de este tipo, debe implementar y ejecutar el contenedor y el tiempo de ejecución de la aplicación como una imagen.

Una arquitectura de sistema hecha de contenedores basados ​​en imágenes le permite alojar múltiples instancias de una aplicación con una sobrecarga y flexibilidad mínimas. Permite la portabilidad de contenedores que no dependen de configuraciones específicas del host. Las imágenes pueden existir sin contenedores. Sin embargo, un contenedor necesita ejecutar una imagen para existir. En esencia, los contenedores dependen de las imágenes para crear un entorno de tiempo de ejecución para ejecutar una aplicación.

Contenedor

Se crea un contenedor basado en una imagen que contiene los datos de configuración necesarios para crear un componente activo que se ejecuta como una aplicación. Al iniciar un contenedor, se crea una capa de escritura sobre la imagen especificada para almacenar los cambios de configuración.

Imagen

Una imagen es una instantánea estática de los datos de configuración de un contenedor en un momento específico. Es una capa de solo lectura donde puede definir todos los cambios de configuración en la capa de escritura superior. Solo puede guardarlo creando una nueva imagen. Cada imagen depende de una o más imágenes principales.

Imagen-plataforma

Una imagen de plataforma no tiene padre. En su lugar, puede usarlo para definir el entorno de tiempo de ejecución, los paquetes y las utilidades necesarias para que se inicie y ejecute una aplicación en contenedor. Por ejemplo, para trabajar con contenedores Docker, extrae una imagen de plataforma de solo lectura. Cualquier cambio definido se refleja en las imágenes copiadas apiladas sobre la imagen Docker inicial. A continuación, crea una capa de aplicación que contiene bibliotecas y dependencias adicionales para la aplicación en contenedor.

Un contenedor puede ser muy grande o pequeño según la cantidad de paquetes y dependencias incluidos en la capa de la aplicación. Además, es posible realizar más capas de la imagen con dependencias y software de terceros independientes. Así, desde un punto de vista operativo, puede haber muchas capas detrás de una Imagen. Sin embargo, las capas solo aparecen como un contenedor para un usuario.

Contenedores Docker

Docker es un entorno virtual en contenedores para desarrollar, mantener, implementar y orquestar aplicaciones y servicios. Los contenedores Docker ofrecen menos gastos generales en la configuración o instalación de entornos virtuales. Los contenedores no tienen un kernel separado y se ejecutan directamente desde el sistema operativo host. Utiliza espacios de nombres y grupos de control para usar los recursos del sistema operativo host de manera eficiente.

Una instancia de un contenedor ejecuta un proceso de forma aislada sin afectar a otras aplicaciones. En esencia, cada aplicación en contenedores tiene archivos de configuración únicos.

Un demonio de Docker permite que los contenedores hagan ping y asigna recursos a una aplicación en contenedores dependiendo de cuánto necesita ejecutar. A diferencia de un contenedor de Linux (LXC), un contenedor docker se especializa en implementar aplicaciones en contenedores individuales. Se ejecuta de forma nativa en Linux pero también es compatible con otros sistemas operativos como macOS y Windows.

Beneficios clave de los contenedores docker

  • Portabilidad:puede implementar una aplicación en contenedores en cualquier otro sistema donde se esté ejecutando Docker Engine, y su aplicación funcionará exactamente como cuando la probó en su entorno de desarrollo. Como desarrollador, puede compartir con confianza una aplicación acoplable sin tener que instalar paquetes o software adicionales, independientemente del sistema operativo que utilicen sus equipos. Docker va de la mano con el control de versiones y puede compartir aplicaciones en contenedores fácilmente sin descifrar el código.
  • Los contenedores pueden ejecutarse en cualquier lugar y en cualquier sistema operativo compatible, como Windows, VM, macOS, Linux, local y en la nube pública. La gran popularidad de las imágenes de Docker ha llevado a una amplia adopción por parte de los proveedores de la nube, como Amazon Web Services (AWS), Google Compute Platform (GCP) y Microsoft Azure.
  • Rendimiento:– Los contenedores no contienen un sistema operativo, lo que crea una huella mucho más pequeña que las máquinas virtuales y, en general, son más rápidos de crear e iniciar.
  • Agilidad:el rendimiento y la portabilidad de los contenedores permiten a un equipo crear un proceso de desarrollo ágil que mejora las estrategias de integración continua y entrega continua (CI/CD) para entregar el software adecuado en el momento adecuado.
  • Aislamiento:– Un contenedor Docker con una aplicación también incluye las versiones relevantes de cualquier dependencia y software que requiera su aplicación. Los contenedores de Docker son independientes entre sí, y otros contenedores/aplicaciones que requieren diferentes versiones de las dependencias de software especificadas pueden existir en la misma arquitectura sin ningún problema. Por ejemplo, garantiza que una aplicación como Docker MariaDB solo use sus recursos para mantener un rendimiento constante del sistema.
  • Escalabilidad:– Docker le permite crear nuevos contenedores y aplicaciones bajo demanda.
  • Colaboración:– El proceso de contenedorización en Docker le permite segmentar un proceso de desarrollo de aplicaciones. Permite a los desarrolladores compartir, colaborar y resolver cualquier problema potencial rápidamente sin necesidad de una revisión masiva, creando un proceso de desarrollo rentable y que ahorra tiempo.

Orquestación de contenedores

La orquestación de contenedores es el proceso de automatización de la implementación, el aprovisionamiento, la gestión, el escalado, la seguridad, el ciclo de vida, el equilibrio de carga y la creación de redes de servicios y cargas de trabajo en contenedores. El principal beneficio de la orquestación es la automatización. La orquestación admite un proceso de desarrollo ágil o DevOps que permite a los equipos desarrollar e implementar en ciclos iterativos y lanzar nuevas funciones más rápido. Las herramientas de orquestación populares incluyen Kubernetes, Amazon ECR Docker Swarm y Apache Mesos.

La orquestación de contenedores implica esencialmente un proceso de tres pasos en el que un desarrollador escribe un archivo de configuración (YAML o JSON) que define un estado de configuración. Luego, la herramienta de orquestación ejecuta el archivo para lograr el estado del sistema deseado. El archivo YAML o JSON normalmente define los siguientes componentes:

  • Las imágenes contenedoras que componen una aplicación y el registro de imágenes.
  • Aprovisiona un contenedor con recursos como almacenamiento.
  • Tercero, define configuraciones de red entre contenedores.
  • Especifica el control de versiones de la imagen.

La herramienta de orquestación programa la implementación de contenedores o réplicas de contenedores en el host en función de la capacidad de CPU disponible, la memoria u otras restricciones especificadas en el archivo de configuración. Una vez que implementa contenedores, la herramienta de orquestación administra el ciclo de vida de una aplicación en función de un archivo de definición de contenedor (Dockerfile). Por ejemplo, puede usar un Dockerfile para administrar los siguientes aspectos:

  • Gestione la escalabilidad hacia arriba o hacia abajo, la asignación de recursos, el equilibrio de carga.
  • Mantener la disponibilidad y el rendimiento de los contenedores en caso de interrupción o escasez de recursos del sistema.
  • Recopilar y almacenar datos de registro para supervisar el estado y el rendimiento de las aplicaciones en contenedores.

Kubernetes

Kubernetes es una de las plataformas de orquestación de contenedores más populares que se utiliza para definir la arquitectura y las operaciones de las aplicaciones nativas de la nube para que los desarrolladores puedan centrarse en el desarrollo, la codificación y la innovación de productos. Kubernetes le permite crear aplicaciones que abarcan varios contenedores, programarlas en un clúster, escalarlas y administrar su estado y rendimiento a lo largo del tiempo. En esencia, elimina los procesos manuales involucrados en la implementación y escalado de aplicaciones en contenedores.

Componentes clave de Kubernetes

  • Cluster:un plano de control con una o más máquinas/nodos informáticos.
  • Plano de control:una colección de procesos que controla diferentes nodos.
  • Kubelet:se ejecuta en nodos y garantiza que los contenedores puedan iniciarse y ejecutarse de manera efectiva.
  • Pod:un grupo de contenedores implementados en un solo nodo. Todos los contenedores en un pod comparten una dirección IP, nombre de host, IPC y otros recursos.

Kubernetes se ha convertido en el estándar de la industria en la orquestación de contenedores. Proporciona amplias capacidades de contenedor, cuenta con una comunidad de contribuyentes dinámica, es altamente extensible y portátil. Puede ejecutarlo en una amplia variedad de entornos, como locales, públicos o en la nube, y usarlo de manera eficaz con otras tecnologías de contenedores.

Conclusión

Los contenedores son componentes de aplicación ligeros y ejecutables que consisten en código fuente, bibliotecas de SO y dependencias necesarias para ejecutar el código en cualquier entorno. Los contenedores estuvieron ampliamente disponibles en 2013 cuando se creó la plataforma Docker. Como resultado, a menudo encontrará usuarios en la comunidad de Linux que usan contenedores Docker y contenedores indistintamente para referirse a lo mismo.

Existen varias ventajas al usar contenedores Docker. Sin embargo, no todas las aplicaciones son adecuadas para ejecutarse en contenedores. Como regla general, las aplicaciones con una interfaz gráfica de usuario no son adecuadas para su uso con Docker. Por lo tanto, los microservicios en contenedores o las arquitecturas sin servidor son esenciales para las aplicaciones nativas de la nube.

El artículo le ha brindado una guía introductoria a los contenedores en Linux, las imágenes de Docker y las herramientas de orquestación de contenedores como Kubernetes. Esta guía se basará en el trabajo con contenedores, Docker Engine y Kubernetes, donde un desarrollador puede aprender a desarrollar y compartir aplicaciones en contenedores.


Linux
  1. Una introducción a Udev:el subsistema de Linux para administrar eventos de dispositivos

  2. Una historia de tiempos de ejecución de contenedores de Linux de bajo nivel

  3. Permisos de Linux:una introducción a chmod

  4. Cómo crear, enumerar y eliminar contenedores Docker en Linux

  5. Una introducción a Docker

Introducción al sistema de archivos de Linux

Una introducción al navegador Vivaldi en Linux

La introducción de un administrador de sistemas de Linux a cgroups

Una introducción al registro de contenedores de Quay

Primeros pasos con Buildah para administrar contenedores de Linux

Cómo gestionar contenedores Docker

    Ventajas Desventajas
    KVM permite el arranque completo de sistemas operativos como Linux, Unix, macOS y Windows. Requiere una administración exhaustiva de todo el entorno virtual
    Una máquina virtual invitada está aislada de los cambios del host y las configuraciones del sistema. Puede ejecutar diferentes versiones de una aplicación en el host y la máquina virtual. Puede llevar más tiempo configurar un nuevo entorno virtual, incluso con herramientas de automatización.
    La ejecución de kernels independientes proporciona mayor seguridad y separación. Costos operativos más altos asociados con la máquina virtual, la administración y el desarrollo de aplicaciones
    Asignación clara de recursos.