Namespaces é um recurso do Linux que proporciona isolamento para os processos, permitindo que eles executem como se estivessem em uma instância separada do sistema. Este recurso é fundamental para a implementação de contêineres, como os gerenciados pelo Docker ou Kubernetes, permitindo que cada contêiner tenha seu próprio conjunto de recursos (como sistemas de arquivos, IDs de processo, redes, etc.) isolados dos demais contêineres e do host.
Existem vários tipos de namespaces no Linux, cada um isolando um conjunto específico de recursos do sistema:
Isola a visibilidade e a gestão dos IDs de processo. Processos em diferentes PID namespaces podem ter o mesmo PID, o que é essencial para a criação de ambientes isolados.
Isola os recursos de rede, incluindo interfaces de rede, tabelas de roteamento e políticas de firewall. Permite que cada contêiner tenha sua própria rede virtual, isolada das demais.
Isola o sistema de arquivos, permitindo que cada namespace tenha uma visão diferente da hierarquia de arquivos do sistema. Isso evita que processos em diferentes contêineres interfiram uns com os outros através do sistema de arquivos.
Isola a comunicação entre processos (IPC), garantindo que os mecanismos de IPC, como filas de mensagens, semáforos e memória compartilhada, não sejam compartilhados entre namespaces.
Isola identificadores de sistema como o nome do host e o nome de domínio, permitindo que cada contêiner tenha seu próprio nome de host e nome de domínio.
Isola os IDs de usuário e grupo, permitindo que um processo tenha um ID de usuário dentro do namespace que é diferente do seu ID de usuário no sistema host. Isso facilita a gestão de permissões e segurança.
Namespaces no Linux são fundamentais para isolar recursos do sistema, permitindo que processos rodem em um ambiente separado. Aqui estão alguns exemplos básicos de como criar e trabalhar com diferentes tipos de namespaces.
Para criar um namespace de rede e listar todos os namespaces de rede disponíveis:
# Cria um novo namespace de rede chamado "meu-netns"
sudo ip netns add meu-netns
# Lista todos os namespaces de rede
sudo ip netns list
Verifique se o namespace foi criado com sucesso:
ip netns list
Crie um par de interfaces virtuais e mova uma delas para o namespace:
sudo ip link add veth0 type veth peer name veth1
sudo ip link set veth1 netns meu_ns
Configure a interface de rede dentro do namespace:
sudo ip netns exec meu_ns ip link set lo up
veth1
com um endereço IP e ative-a:sudo ip netns exec meu_ns ip addr add 192.168.1.1/24 dev veth1
sudo ip netns exec meu_ns ip link set veth1 up
Use o comando ping
de dentro do namespace:
sudo ip netns exec meu_ns ping 192.168.1.2
O uso de namespaces é uma parte fundamental da tecnologia de contêineres, permitindo a criação de ambientes isolados que são leves, seguros e eficientes. Facilita o desenvolvimento, a implementação e a escala de aplicações, oferecendo um isolamento robusto entre os contêineres e entre estes e o host.