Administre contenedores en espacios de nombres usando nsenter

Con contenedores Como estándar de facto para la implementación de aplicaciones, todos debemos comprender cómo garantizar la seguridad, el aislamiento y las restricciones de recursos. Espacios de nombres de Linux juegan un papel fundamental en el aislamiento de los recursos asignados a los contenedores. Este artículo muestra cómo usar nsenter desmitificar lo que sucede en el mundo de los espacios de nombres, ya sea en un entorno tradicional o en contenedores.

Índice

Espacios de nombres: ¿qué son exactamente?

El kernel asigna y restringe recursos para procesos individuales que se ejecutan en el sistema operativo Linux. Los espacios de nombres dentro del kernel dividen estos recursos. Los espacios de nombres asignan recursos a un proceso de tal manera que el proceso solo ve esos recursos específicos. Los espacios de nombres ayudan a aislar el proceso, administrando los recursos del sistema que pueden ver. Esta tecnología se usa ampliamente en entornos de tiempo de ejecución de contenedores para proporcionar una capa de aislamiento entre contenedores que se ejecutan en el mismo host.

Comprender los diferentes espacios de nombres

Los espacios de nombres de Linux existían desde la versión 2.4 del kernel. El desarrollo continuo del kernel ha agregado más espacios de nombres. A partir de la versión 5.6, hay ocho espacios de nombres diferentes.

Para obtener más detalles sobre estos espacios de nombres individuales, consulte man 7 namespaces. el OpenvSwitch (OVS) Complemento de red definida por software (SDN) utilizado en pila abierta y OpenShift utiliza espacios de nombres para proporcionar una verdadera tenencia múltiple en la capa de red.

Contenedores y espacios de nombres de Linux

Para demostrar los espacios de nombres que manejan un contenedor, usaré Podman para crear un contenedor a partir de la UBI8: 8.2 imagen del catálogo de contenedores de Red Hat. El contenedor reside en un host Red Hat Enterprise Linux (RHEL) 8.2. Para los efectos de este artículo, el procps-ng El paquete se instala dentro del contenedor, lo que proporciona top y ps pedidos.

[[email protected] ~]# podman run --name namespace-demo -it registry.access.tipstecnologicos.es/ubi8/ubi /bin/bash

En otra terminal, utilice el runc para determinar el ID de proceso asociado con el nuevo contenedor.

[[email protected] ~]# runc list
ID                                                                 PID         STATUS      BUNDLE                                                                                                                     CREATED                          OWNER
92585ccfd2d20c4bc7f03863d9b0a999eea18c91fb76f6333ef21171138beb83   7172        running     /var/lib/Contenedores/Almacenamiento/overlay-Contenedores/92585ccfd2d20c4bc7f03863d9b0a999eea18c91fb76f6333ef21171138beb83/userdata   2020-06-24T14:56:37.895046979Z   root

El identificador del proceso es 7172.

Utilizar el lsns comando para listar los espacios de nombres asociados con un proceso dado.

[[email protected] ~]# lsns -p 7172
        NS TYPE   NPROCS   PID USER COMMAND
4026531835 cgroup    137     1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 16
4026531837 user      137     1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 16
4026532438 net         1  7172 root /bin/bash
4026532516 mnt         1  7172 root /bin/bash
4026532517 uts         1  7172 root /bin/bash
4026532518 ipc         1  7172 root /bin/bash
4026532519 pid         1  7172 root /bin/bash

Inspeccionar espacios de nombres con nsenter

el nsenter el orden crece en namespace enter. Acepta diferentes opciones para ingresar solo el espacio de nombres especificado.

Ingresemos el espacio de nombres de la red para verificar la dirección IP y la tabla de enrutamiento.

[[email protected] ~]# nsenter -t 7172 -n ip a s

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether ea:95:99:52:13:56 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.88.0.6/16 brd 10.88.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::e895:99ff:fe52:1356/64 scope link
       valid_lft forever preferred_lft forever

Aquí mismo, -t es el identificador del proceso de destino, y -n hace referencia al espacio de nombres de la red.

[[email protected] ~]# nsenter -t 7172 -n ip route

default via 10.88.0.1 dev eth0
10.88.0.0/16 dev eth0 proto kernel scope link src 10.88.0.6

Luego ingreso el espacio de nombres del proceso para verificar los detalles del proceso.

[[email protected] ~]# nsenter -t 7172 -p -r ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:56 pts/0    00:00:00 /bin/bash
root         135       0  0 16:55 ?        00:00:00 ps -ef

el -r La opción establece el directorio raíz en el directorio de nivel superior en el espacio de nombres para que los comandos se ejecuten en el contexto del espacio de nombres.

[[email protected] ~]# nsenter -t 7172 -p -r top

el bash comando, que se ejecuta durante podman run, es el primer proceso dentro del espacio de nombres.

Ingrese el espacio de nombres UTC para verificar el nombre de host.

[[email protected] ~]# nsenter -t 7172 -u hostname
92585ccfd2d2

Cambie el nombre de host en el espacio de nombres y verifique el nuevo nombre.

[[email protected] ~]# nsenter -t 7172 -u hostname namespace.enable.sysadmin

[[email protected] ~]# nsenter -t 7172 -u hostname
namespace.enable.sysadmin

Finalmente, ingrese todos los espacios de nombres usando el -a opción.

[[email protected] ~]# nsenter -t 7172 -a

[[email protected] /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         7.9G  6.3G  1.6G  80% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.9G  1.4M  1.9G   1% /etc/hosts
shm              63M     0   63M   0% /dev/shm
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware
tmpfs           1.9G     0  1.9G   0% /sys/fs/selinux

Resumen

Los contenedores de Linux facilitan la entrega rápida de aplicaciones y el uso de prácticas DevOps. Es fundamental garantizar que estas aplicaciones sean seguras, aisladas y con recursos limitados. el nsenter La herramienta lo ayuda a comprender los detalles de bajo nivel de un contenedor. También ayuda a solucionar problemas de organización e implementación de contenedores.

Artículos de interés

Subir