En artículos anteriores, he escrito sobre imágenes de contenedores y tiempos de ejecución. En este artículo, analizo cómo los contenedores son posibles gracias a la base de algunas tecnologías especiales de Linux, incluidos los espacios de nombres y los grupos de control.
Contenedores Linux
- ¿Qué son los contenedores de Linux?
- Una introducción a la terminología de contenedores
- Descargar:Introducción a los contenedores
- Operadores de Kubernetes:automatización de la plataforma de orquestación de contenedores
- eBook:Patrones de Kubernetes para diseñar aplicaciones nativas de la nube
- ¿Qué es Kubernetes?
Las tecnologías de Linux constituyen la base para crear y ejecutar un proceso de contenedor en su sistema. Las tecnologías incluyen:
- Espacios de nombres
- Grupos de control (cgroups)
- Seccomp
- SELinux
Espacios de nombres
Espacios de nombres proporcione una capa de aislamiento para los contenedores dándole al contenedor una vista de lo que parece ser su propio sistema de archivos de Linux. Esto limita lo que puede ver un proceso y, por lo tanto, restringe los recursos disponibles.
Hay varios espacios de nombres en el kernel de Linux que utilizan Docker o Podman y otros al crear un contenedor:
$ docker container run alpine ping 8.8.8.8
$ sudo lsns -p 29413
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --
switched...
4026533105 mnt 1 29413 root ping 8.8.8.8
4026533106 uts 1 29413 root ping 8.8.8.8
4026533105 ipc 1 29413 root ping 8.8.8.8
[...]
Usuario
El espacio de nombres de usuario aísla usuarios y grupos dentro de un contenedor. Esto se hace al permitir que los contenedores tengan una vista diferente de los rangos de UID y GID en comparación con el sistema host. El espacio de nombres de usuario permite que el software se ejecute dentro del contenedor como usuario raíz. Si un intruso ataca el contenedor y luego escapa a la máquina host, se limita a una identidad no raíz.
Menta
El espacio de nombres mnt permite que los contenedores tengan su propia vista de la jerarquía del sistema de archivos del sistema. Puede encontrar los puntos de montaje para cada proceso de contenedor en /proc/
UTS
El espacio de nombres Unix Timesharing System (UTS) permite que los contenedores tengan un nombre de host y un nombre de dominio únicos. Cuando ejecuta un contenedor, se usa una ID aleatoria como nombre de host incluso cuando se usa el — name
etiqueta. Puedes usar el unshare
comando para tener una idea de cómo funciona esto.
$ docker container run -it --name nived alpine sh
/ # hostname
9c9a5edabdd6
/ #
$ sudo unshare -u sh
# hostname isolated.hostname
# hostname
# exit
$ hostname
homelab.redhat.com
IPC
El espacio de nombres de comunicación entre procesos (IPC) permite que diferentes procesos de contenedor se comuniquen accediendo a un rango compartido de memoria o usando una cola de mensajes compartida.
# ipcmk -M 10M
Shared memory id: 0
# ipcmk -M 20M
Shared memory id: 1
# ipcs
---- Message Queues ----
key msqid owner perms used-bytes messages
---- Shared Memory Segments
key shmid owner perms bytes nattch status
0xd1df416a 0 root 644 10485760 0
0xbd487a9d 1 root 644 20971520 0
[...]
PID
El espacio de nombres de ID de proceso (PID) garantiza que los procesos que se ejecutan dentro de un contenedor estén aislados del mundo exterior. Cuando ejecutas un ps
comando dentro de un contenedor, solo verá los procesos que se ejecutan dentro del contenedor y no en la máquina host debido a este espacio de nombres.
Red
El espacio de nombres de red permite que el contenedor tenga su propia vista de la interfaz de red, las direcciones IP, las tablas de enrutamiento, los números de puerto, etc. ¿Cómo logra un contenedor comunicarse con el mundo exterior? Todos los contenedores que crea se conectan a una interfaz de red virtual especial para la comunicación.
Grupos de control (cgroups)
Los Cgroups son bloques fundamentales para hacer un contenedor. Un cgroup asigna y limita recursos como CPU, memoria, E/S de red que utilizan los contenedores. El motor de contenedores crea automáticamente un sistema de archivos cgroup de cada tipo y establece valores para cada contenedor cuando se ejecuta el contenedor.
SECCOMP
Seccomp básicamente significa computación segura . Es una característica de Linux utilizada para restringir el conjunto de llamadas al sistema que una aplicación puede realizar. El perfil seccomp predeterminado para Docker, por ejemplo, deshabilita alrededor de 44 llamadas al sistema (hay más de 300 disponibles).
La idea aquí es proporcionar a los contenedores acceso solo a aquellos recursos que el contenedor pueda necesitar. Por ejemplo, si no necesita el contenedor para cambiar la hora del reloj en su máquina host, probablemente no tenga uso para el clock_adjtime y clock_settime syscalls, y tiene sentido bloquearlas. Del mismo modo, no desea que los contenedores cambien los módulos del kernel, por lo que no es necesario que hagan create_module, delete_module llamadas al sistema.
SELinux
SELinux significa Linux con seguridad mejorada . Si está ejecutando una distribución de Red Hat en sus hosts, entonces SELinux está habilitado de forma predeterminada. SELinux le permite limitar una aplicación para que tenga acceso solo a sus propios archivos y evitar que otros procesos accedan a ellos. Entonces, si una aplicación se ve comprometida, limitaría la cantidad de archivos que puede afectar o controlar. Lo hace configurando contextos para archivos y procesos y definiendo políticas que harían cumplir lo que un proceso puede ver y hacer cambios.
Las políticas de SELinux para contenedores están definidas por container-selinux
paquete. De forma predeterminada, los contenedores se ejecutan con container_t etiqueta y se les permite leer (r) y ejecutar (x) bajo /usr directorio y leer la mayor parte del contenido de /etc directorio. La etiqueta container_var_lib_t es común para archivos relacionados con contenedores.
Resumir
Los contenedores son una parte crítica de la infraestructura de TI actual y también una tecnología bastante interesante. Incluso si su función no implica directamente la creación de contenedores, comprender algunos conceptos y enfoques fundamentales de los contenedores le permite apreciar cómo pueden ayudar a su organización. ¡El hecho de que los contenedores estén basados en tecnologías Linux de código abierto los hace aún mejores!
Este artículo se basa en un artículo techbeatly y se ha adaptado con permiso.