Tecnologia para VMs privadas de curta duração

8

Estou tentando criar um sistema que funcione de curta duração (compilações de CI e teste) de componentes de software; é obrigatório de acordo com meus requisitos que cada um viva em um host privado. Também estou adotando essa definição para incluir opções de paravirtualização , pois parece que isso me poupará muita dor de cabeça.

Estou trabalhando em um Mac, praticamente todas as tecnologias estão disponíveis, libvirt e quemu , etc, simplesmente não funcionam para mim. No entanto, estou planejando implantar no Debian; então tudo o que é executado no Debian está de volta à mesa, desde que eu possa programar o provisionamento da máquina host e de seus domínios convidados.

Minha configuração pretendida era que eu posso usar para inicializar um instalador Debian, que algo deveria significar que, após a inicialização, a máquina é provisionada automaticamente (Chef, Puppet, Babushka, não se importa, realmente) - e parte desse provisionamento deve criar um rootfs de modelo que podem ser usados ​​para inicializar um contêiner. O próprio contêiner também precisa ser provisionado, para que, quando o contêiner for lançado, ele saiba o que o trabalho deve ser feito, possa fazer o trabalho e, em seguida, saia.

Em resumo, aqui está o fluxo de trabalho que eu preciso:

  1. Inicialize uma máquina (virtual ou não) e deixe-a pronta para o trabalho.
  2. O trabalho deve ser realizado por um script instalado pelo chef / fantoche / babushka / etc
  3. Quando o trabalho chegar, uma máquina virtual deve ser iniciada para fazer o trabalho.
  4. A VM deve fazer o trabalho, sair e liberar seus recursos para a máquina pai / host. (é importante que isso seja dimensionado para pelo menos centenas de VMs convidadas em hardware razoável)

Cheguei a um ponto em que tentei o seguinte e os abandonei pelos motivos descritos abaixo:

Para a máquina host

  1. Pré-propaga imagens micro ISO do Debian com Instalinux (suportado por LinuxCOE) ( Ruim: Não funcionou de todo ("Nenhum módulo do kernel encontrado" (porque as imagens do Instalinux estão fora de sincronia com os repositórios FTP), aparentemente esta solução é notoriamente frágil, também não permite muito espaço para pós-instalação, e soltar chaves SSH conhecidas, chaves de host etc. na máquina, parece disparar e esquecer, no final, eu teria uma máquina em execução, mas não teria acesso a ela .)
  2. Pré-propaga o Debian netinst ISO ( Ruim : mesmos problemas, como acima, exceto pelo menos a instalação normalmente é concluída, pois não há disparidade de kernel entre o ISO e o repositório FTP. Escopo ainda limitado para pós-instalação. Bom : Absolutamente confiável e repetível, fácil de jogar em qualquer pilha de tecnologia VM no Mac ou em uma máquina bare metal, funcionaria em qualquer lugar, mas não consigo instalá-lo o suficiente )
  3. Vários métodos de construção de um rootfs, e compilá-lo como uma imagem de disco rígido inicializável ( Bad : O pouco que eu poderia começar a trabalhar era frágil como o inferno, seria difícil de instalar em uma máquina real, e é um processo de construção complexa. Bom: Se Eu poderia fazê-lo funcionar, isso pareceria fornecer o maior escopo para pré-configurar a máquina para uma determinada especificação com chaves ssh, chaves de host, nome de host, software instalado a partir do Git e qualquer outra coisa, mas a questão seria como empacotar para distribuição ou como roteirizar sua recreação. )

Sinceramente, não tenho certeza de qual tecnologia as pessoas devem usar para criar uma VM do nada para um sistema em execução, funcional e útil. Parece três etapas para mim: a) sistema operacional, b) configuração do sistema (usuários, etc.) ec) mudanças no sistema de arquivos.

Para as máquinas convidadas (virtuais):

  1. Muitas coisas, principalmente eu acho que a resposta aqui é um rootfs somente leitura criado com debootstrape uma partição especial no contêiner LXC que contém o trabalho a ser feito para esta instância específica (um manifesto de tarefa). Insira todas as advertências usuais sobre a criação do sistema operacional, a inicialização, a criação de usuários, o check-out do git e o trabalho.

Eu realmente não tenho certeza de quais ferramentas buscar, parece que o problema deve ser bem resolvido. Mas não consigo descobrir onde realmente começar.

A maioria das pessoas parece sugerir para a máquina host que eu deva escolher uma tecnologia de virtualização, inicializar uma máquina em um estado de trabalho e depois capturá-la (a libvirt parece ser a favorita lógica disso). Usando a captura instantânea para abrir as instalações subseqüentes para teste ou produção.

Para as máquinas convidadas, o lxc parece oferecer a opção mais fácil, exceto que o background de um contêiner e a conexão mais tarde ao console são interrompidos em todos os kernels atuais, e a versão mais recente do lxc disponível para o Debian estável tem mais de 18 meses e não possui muitos recursos amplamente úteis.

Normalmente, sou desenvolvedor de aplicativos e muitas vezes não trabalho com tecnologia no nível do servidor (e tenho certeza de que o SF sinalizará essa pergunta como "muito subjetiva"), mas estou realmente incerto de quais ferramentas procurar.

A palavra final é que eu conheço um projeto similarmente empilhado (travis-ci.org) que está usando caixas do Vagrant para isso. Isso parece ser um instrumento bastante contundente, ferramentas grandes, lentas e orientadas para rubi, projetadas para o provisionamento de desktops em pequena escala de VMs de teste usadas para infraestrutura crítica de serviços, mas também conheço alguns desses caras e são mais inteligentes do que eu, então talvez eles tenham desistido.

Qualquer ajuda apreciada.

Lee Hambley
fonte
Verdadeiramente devops ... Isso definitivamente pode ser automatizado. Construir o sistema é fácil. Suponho que você possa criar um script do trabalho ou usar a ferramenta de gerenciamento de configuração de sua escolha. Mais informações sobre o destino ou resultado final desse esforço seriam úteis. Você está certo no limite entre uma solução de nuvem privada ou usar algo como LXC ...
ewwhite
Absolutamente, o objetivo é ser capaz de construir o host de uma maneira que minha equipe e eu (usuários de Mac) possam criar repetidamente um host , dentro do qual possamos desenvolver com os hóspedes LCX, mas construí-lo de uma maneira que também possamos implantar para produção. As ferramentas para nosso aplicativo são todas escritas em Ruby e eu realmente gostaria de usar o LXC para os convidados. A máquina host é naturalmente bastante duradoura, mas como a vida útil típica de um hóspede leva de 2 a 10 minutos, toda a infraestrutura é efêmera. É sobre desenvolvimento versus produção e ter um processo repetível.
Lee Hambley

Respostas:

2

Algumas ideias:

  1. Seu ponto de vista "centenas de VMs em hardware razoável" me faz (sem experiência pessoal) pensar em VMs que inicializam pela rede ou compartilham a maior parte de seu espaço de volume (/ usr) via NFS. Depende de quão semelhantes são suas VMs.
  2. "O pouco que pude trabalhar era frágil como o inferno". Difícil de acreditar. Você pode ser mais preciso qual é o problema?
  3. "seria difícil instalar em uma máquina real" Você quer dizer "difícil" em comparação com o que a solução de um clique desejada para criação de VM? Eu perguntava: quão difícil é isso e com que frequência isso vai acontecer? Qual é a diferença, recriando o initrd para o respectivo hardware?
  4. "no entanto, não consigo pós-instalá-lo o suficiente" O que você precisa / por que isso não funciona? Você pode fazer o download de um script parte do processo de inicialização. A VM obtém seu IP por DHCP (configurado com força para o endereço MAC das VMs) e o Samba entrega diferentes scripts de pós-instalação para as VMs, dependendo do endereço IP do cliente.
Hauke ​​Laging
fonte
+1 para inicialização na rede. Não tenho experiência suficiente para escrever uma resposta completa sobre isso, mas posso dizer que estive em locais que implantam centenas de máquinas, físicas e virtuais, fazendo com que elas inicializassem a partir de um servidor PXE. Isso significa que você não precisará se preocupar com imagens de disco separadas para cada VM.
Moshe Katz
1

Ao ler sua postagem, fiquei pensando que vagrant e jenkins com o plugin vagrant atenderiam às suas necessidades. Qualquer caixa que você possua que possa realmente lidar com o número de VMs de que você está falando nem deve perceber a sobrecarga das ferramentas que mantêm o ambiente.

James Thompson
fonte
0

Usando algo que funciona na apple e no Debian, a única coisa que tentei é a caixa virtual. O que é bom usar o virtualbox aqui é que você pode criar uma VM no seu sistema Mac e copiá-la em um sistema Debian usando a mesma versão do Virtual Box e ela será inicializada.

Ter centenas de vms usando caixa virtual parece que você gastará bastante tempo usando a interface vboxmange para criar o script das informações exclusivas necessárias para cada vm. Como os uuids para discos rígidos, o endereço mac nas interfaces de rede.

Se o sistema básico usar o mesmo software configurado da mesma maneira, você poderá criar um instantâneo do sistema na caixa virtual e congelá-lo. Para que nenhuma alteração feita seja gravada na foto instantânea congelada, ela é gravada na nova área de armazenamento temporário. Em seguida, altere a VM, restaure de volta à captura instantânea e você estará trabalhando em um sistema limpo sem as alterações feitas durante o teste. Tudo isso pode ser script usando o vboxmange .

Usando seu instantâneo, você também pode fazer centenas de cópias dessa imagem da VM. Usando a interface de script vboxmange para fazer as cópias, únicas nas maneiras que importam, como endereços uuids e mac. Em seguida, faça com que um script de inicialização chame o que for alterado, configurações que você precisa aplicar em suas VMs para teste ou execução de vários testes.

nelaaro
fonte