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
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. |
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. |