📚 Conteúdo do Módulo (67% concluído) ▼
VM vs. container
Aprofunde na comparação técnica detalhada entre Máquinas Virtuais (QEMU/KVM) e Containers (LXC) em termos de performance, segurança e arquitetura.
🎯 Objetivos desta aula
- ✓ Comparar detalhadamente o overhead de recursos de VMs e Containers.
- ✓ Compreender os limites de segurança (isolamento de kernel vs. namespaces/cgroups).
- ✓ Avaliar o comportamento de rede e storage em ambas as tecnologias.
- ✓ Estruturar a estratégia de dimensionamento (oversubscription) no Proxmox VE.
🔑 Pré-requisitos
- › Ter lido as aulas anteriores, especialmente "KVM e LXC".
Análise de Overhead e Desempenho
Na aula 2, abordamos a diferença básica entre Máquinas Virtuais (KVM) e Containers de Sistema (LXC). Agora, vamos aprofundar na mecânica operacional de ambos no Proxmox VE, analisando o impacto real em consumo de recursos, limites de segurança e arquitetura.
Overhead de CPU e Memória RAM
- Máquinas Virtuais (KVM): O hipervisor QEMU precisa emular uma placa-mãe completa, controladoras de disco, adaptadores de rede e firmware (BIOS ou UEFI). A CPU do host executa as instruções da VM diretamente usando aceleração por hardware (Intel VT-x ou AMD-V), mas o gerenciamento de memória exige tabelas de páginas aninhadas (EPT no Intel / NPT no AMD), o que introduz um pequeno overhead de latência de acesso à memória. A RAM alocada para a VM é imediatamente reservada e isolada no host.
- Containers (LXC): Não há emulação de hardware ou hypervisor. Os processos dentro do LXC rodam diretamente no kernel do host, controlados por cgroups (limitação de recursos) e namespaces (isolamento de visão). O consumo de memória RAM do container é dinâmico: se ele usar apenas 100MB, o host físico sentirá o impacto de apenas 100MB, independentemente do limite máximo configurado para o LXC.
Performance de I/O (Disco e Rede)
A performance de disco e rede no LXC é praticamente equivalente ao desempenho nativo do host, uma vez que a escrita e a leitura utilizam diretamente o cache de página do Linux e as pontes de rede conectadas sem emulação intermediária.
Nas VMs, a fim de mitigar o overhead de emulação, são utilizados os drivers VirtIO (rede, bloco, SCSI, ballooning), que servem de atalhos otimizados entre o convidado e o hypervisor. Mesmo com VirtIO, o caminho dos dados passa por mais etapas lógicas do que no LXC.
Modelos de Segurança e Fronteiras de Isolamento
Este é o fator decisivo para a maioria dos arquitetos de infraestrutura ao escolherem entre KVM e LXC.
Fronteira de Segurança do KVM (Isolamento de Hardware):
[VM OS] -> [Drivers VirtIO / QEMU] -> [Virtualização por Hardware (CPU)] -> [Host Kernel]
Fronteira de Segurança do LXC (Compartilhamento de Kernel):
[LXC Processos] -> [Namespaces / Cgroups] -> [Host Kernel]
O Perigo do Acesso Privilegiado no LXC
No Proxmox VE, você pode criar dois tipos de containers LXC:
- Containers Não-Privilegiados (Unprivileged): Recomendados por padrão. O Proxmox VE mapeia o ID do usuário root do container (UID 0) para um UID comum e sem privilégios no host (ex: UID 100000). Caso um invasor consiga escapar dos limites do container, ele será visto pelo kernel do host como um usuário sem privilégios, incapaz de alterar arquivos do sistema ou desligar o host.
- Containers Privilegiados (Privileged): O root do container é mapeado diretamente para o root do host (UID 0). Embora útil para montar storages NFS/Samba específicos ou rodar aplicações que exigem acesso direto a dispositivos de hardware complexos, essa modalidade apresenta um risco de segurança. Em caso de vulnerabilidade no kernel do host, um usuário root dentro do LXC pode comprometer todo o servidor físico.
Segurança em Produção
Nunca utilize containers LXC privilegiados para hospedar serviços expostos diretamente à Internet (ex: servidores web públicos, reverse proxies ou servidores de aplicação). Caso precise de recursos específicos de hardware com isolamento forte, opte por uma VM KVM.
Comparação de Funcionalidades do Ciclo de Vida
A arquitetura das duas soluções afeta as operações do dia a dia da equipe de infraestrutura.
| Funcionalidade | Máquina Virtual (KVM) | Container (LXC) |
|---|---|---|
| Live Migration (Migração ao Vivo) | Sim. Move a memória ativa da VM via rede para outro nó sem downtime perceptível. | Não nativamente em tempo real. Exige suspender ou desligar o container durante o processo. |
| Snapshots e Clones | Suportado em qualquer storage compatível (ex: qcow2, ZFS, Ceph). | Suportado apenas se o storage subjacente oferecer suporte (ex: ZFS, LVM-thin). |
| Acesso a Storages do Host | Requer protocolos de rede (NFS, SMB, iSCSI) ou virtualização de blocos. | Permite montagem direta de pastas do host usando Bind Mounts com performance nativa. |
| Compatibilidade de OS | Alta. Executa qualquer sistema compatível com x86_64/ARM (Windows, BSD, Linux, Unix). | Limitada. Executa apenas distribuições Linux compatíveis com o kernel do host. |
Procedimento de Inspeção
Vamos verificar o status de isolamento e controle de recursos dos nossos convidados a partir da linha de comando do Proxmox VE.
1. Verificar se o container LXC 100 está configurado como unprivileged (saída: unprivileged: 1)
grep “unprivileged” /etc/pve/lxc/100.conf
2. Executar monitoramento de recursos integrado ao systemd-cgroups
Isso mostra os recursos consumidos dinamicamente por cada serviço e convidado
systemd-cgtop -n 10
Validação
Você entendeu a aula se consegue responder:
- Por que o consumo de memória RAM de um container LXC é dinâmico, enquanto na VM KVM ele tende a ser estático?
- Qual a diferença prática de segurança entre um container privilegiado e um unprivileged?
- Se você precisa migrar um serviço em execução entre servidores em tempo real sem qualquer queda de rede, qual tecnologia deve utilizar?
- Como o VirtIO auxilia no desempenho das Máquinas Virtuais?
Boas Práticas
- Use Unprivileged por padrão: Só mude um container para privilegiado se tiver um motivo técnico documentado e com mitigação de risco de rede.
- Redimensione com inteligência: Em ambientes com LXC, você pode fazer “oversubscription” (alocar mais vCPU e RAM do que o host físico possui) de forma mais agressiva devido ao comportamento dinâmico, mas monitore sempre a swap do host para evitar travamentos.
- Instale o QEMU Guest Agent: Sempre instale e habilite o pacote
qemu-guest-agentdentro das suas VMs KVM. Ele envia informações corretas de IP, RAM e permite comandos de shutdown limpos do host para o convidado.