Tecnologia per VM private di breve durata


8

Sto cercando di costruire un sistema che eseguirà componenti software di breve durata (CI e test build), è obbligatorio in base alle mie esigenze che ognuno viva su un host privato. Sto prendendo quella definizione per includere anche le opzioni di paravirtualsation , in quanto sembra che mi farà risparmiare un sacco di mal di testa.

Sto lavorando su un Mac, quindi praticamente tutte le tecnologie non sono disponibili, libvirt e quemu , ecc. Non funzionano per me. Sto tuttavia pianificando di implementare Debian; quindi tutto ciò che gira su Debian è tornato sul tavolo, a condizione che io possa eseguire lo scripting del provisioning della macchina host e dei suoi domini guest.

La mia configurazione prevista era che posso usare per avviare un programma di installazione Debian, che qualcosa dovrebbe significare che all'avvio, il provisioning automatico della macchina (Chef, Puppet, Babushka, non importa, davvero) - e parte di quel provisioning dovrebbe creare un rootfs modello che possono essere utilizzati per l'avvio di un contenitore. È necessario inoltre eseguire il provisioning del contenitore stesso, in modo che quando viene visualizzato il contenitore sia a conoscenza del lavoro da eseguire, possa eseguire il lavoro e quindi uscire.

In breve, ecco il flusso di lavoro di cui ho bisogno:

  1. Avviare una macchina (virtuale o di altro tipo) e averlo pronto per il lavoro.
  2. Il lavoro dovrebbe essere eseguito da uno script installato da chef / burattino / babushka / ecc
  3. Quando arriva il lavoro, una macchina virtuale dovrebbe essere avviata per fare il lavoro.
  4. La VM dovrebbe fare il lavoro, uscire e rilasciare le sue risorse sul computer principale / host. (è importante che sia ridimensionato ad almeno centinaia di VM guest su hardware ragionevole)

Sono arrivato al punto in cui ho provato quanto segue e li ho abbandonati per i motivi indicati di seguito:

Per la macchina host

  1. Pre-seed delle immagini micro ISO Debian con Instalinux (con supporto LinuxCOE) ( Bad: non ha funzionato affatto ("Nessun modulo kernel trovato" (poiché le immagini Instalinux non sono sincronizzate con i repository FTP, apparentemente questa soluzione è notoriamente fragile, inoltre non consente molto spazio per il post-installazione e rilasciare chiavi SSH, chiavi host, ecc. note sulla macchina, sembra fuoco e dimentica, alla fine avrei una macchina in esecuzione, ma nessun accesso ad essa .)
  2. Pre-seed Debian netinst ISO ( Bad : stessi problemi, come sopra, tranne che l'installazione si completa in genere poiché non vi sono disparità del kernel tra ISO e repository FTP. Ancora limitato per post-installazione. Buono : assolutamente affidabile e ripetibile, facile da lanciare su qualsiasi stack di tecnologia VM su Mac o su una macchina bare metal, funzionerebbe ovunque, tuttavia non riesco a post-installarlo abbastanza )
  3. Vari metodi per creare un rootfs e compilarlo come immagine di un disco rigido avviabile ( Bad : quel poco che potrei far funzionare era fragile da morire, sarebbe difficile da installare su una macchina reale, ed è un processo di compilazione complesso. Buono: Se Potrei farlo funzionare, questo sembrerebbe fornire la maggior possibilità di preconfigurare la macchina per una determinata specifica con chiavi ssh, chiavi host, nome host, software installato da Git e quant'altro, ma poi la domanda sarebbe come impacchettare per la distribuzione o come copiarlo è ricreazione. )

Onestamente non sono sicuro di quale tecnologia ci si aspetta che la gente usi per far emergere una VM dal nulla a un sistema funzionante, funzionante e utile. Mi sembrano tre passaggi a) sistema operativo, b) configurazione del sistema (utenti, ecc.) E quindi c) modifiche al filesystem.

Per le macchine guest (virtuali):

  1. Molte cose, principalmente penso che la risposta qui sia un rootfs di sola lettura creato con debootstrap, e una partizione speciale sul contenitore LXC che contiene il lavoro da fare per questa specifica istanza (un manifest di lavoro). Inserisci tutti i soliti avvertimenti sulla costruzione del sistema operativo, l'avvio, la creazione di utenti, il controllo del software da Git e il lavoro.

Sinceramente non sono sicuro di quali strumenti prendere, sembra che il problema dovrebbe essere ben risolto. Ma non riesco proprio a scoprire da dove cominciare davvero.

La maggior parte delle persone sembra suggerire per la macchina host che dovrei scegliere una tecnologia di virtualizzazione, avviare una macchina in uno stato funzionante e quindi istantaneamente (libvirt sembra il favorito logico per questo). Utilizzo dell'istantanea per visualizzare eventuali installazioni successive per i test o in produzione.

Per le macchine guest, lxc sembra fornire l'opzione più semplice, tranne per il fatto che il backgrounding di un contenitore e la connessione successiva in seguito tramite la console sono interrotti in tutti i kernel attuali, e la versione più recente di lxc disponibile per Debian stabile ha più di 18 mesi e manca di molte funzionalità ampiamente utilizzate.

In genere sono uno sviluppatore di applicazioni e spesso non lavoro con la tecnologia a livello di server (e sono certo che SF indicherà questa domanda come "troppo soggettiva") ma sono sinceramente incerto su quali strumenti raggiungere.

L'ultima parola è che conosco un progetto impilato in modo simile (travis-ci.org) che sta usando scatole Vagrant per questo. Sembra uno strumento piuttosto schietto, strumenti grandi, lenti e orientati al rubino, progettati per il provisioning desktop su piccola scala dei VM di test utilizzati per l'infrastruttura di servizi critici, ma conosco anche alcuni di quei ragazzi, e sono più intelligenti di me, quindi forse hanno appena rinunciato.

Qualsiasi aiuto apprezzato.


Davvero devops ... Questo può sicuramente essere automatizzato. Costruire il sistema è facile. Presumo che tu possa scrivere il lavoro o utilizzare lo strumento di gestione della configurazione di tua scelta. Maggiori informazioni sulla destinazione o sul risultato finale di questo sforzo sarebbero utili. Sei al limite tra una soluzione di cloud privato o l'utilizzo di qualcosa come LXC ...
ewwhite

Assolutamente, il punto è di essere in grado di costruire l'host in modo che io e il mio team (utenti Mac) possiamo costruire ripetutamente un host , all'interno del quale possiamo sviluppare con gli ospiti LCX, ma costruirlo in un modo che possiamo anche distribuire alla produzione. Gli strumenti per la nostra applicazione sono tutti scritti in Ruby e mi piacerebbe davvero usare LXC per gli ospiti. La macchina host è naturalmente abbastanza longeva, ma poiché la durata tipica di un ospite è di 2-10 minuti, l'intera infrastruttura è davvero effimera. Si tratta di sviluppo vs. produzione e di avere un processo ripetibile.
Lee Hambley,

Risposte:


2

Qualche idea:

  1. Il tuo punto "centinaia di macchine virtuali su hardware ragionevole" mi fa (senza esperienza personale) pensare alle macchine virtuali che si avviano sulla rete o condividono la maggior parte del loro spazio di volume (/ usr) tramite NFS. Dipende da quanto sono simili le tue VM.
  2. "Quel poco che riuscivo a far funzionare era fragile da morire" Difficile da credere. Puoi essere più preciso qual è il problema?
  3. "sarebbe difficile da installare su una macchina reale" Vuoi dire "difficile" rispetto a cosa, alla soluzione desiderata con 1 clic per la creazione di VM? Vorrei chiedere: quanto è difficile e quanto spesso accadrà? Qual è la differenza, ricreando initrd per il rispettivo hardware?
  4. "tuttavia non riesco a post-installarlo abbastanza" Cosa vuoi / ti serve e perché non funziona? È possibile effettuare il download di uno script come parte del processo di avvio. La VM ottiene il suo IP da DHCP (configurato per l'indirizzo MAC delle VM) e Samba consegna diversi script post-installazione alle VM, a seconda dell'indirizzo IP del client.

+1 per l'avvio di rete. Non ho abbastanza esperienza per scrivere una risposta completa a riguardo, ma posso dirti che sono stato in posti che distribuiscono centinaia di macchine, sia fisiche che virtuali, avviandole da un server PXE. Significa che non dovrai agitarti con immagini disco separate per ogni VM.
Moshe Katz,

1

Durante la lettura del tuo post ho continuato a pensare che vagabondo e jenkins con il plugin vagabondo si adattassero abbastanza bene alle tue esigenze. Qualunque casella tu possa effettivamente gestire il numero di VM di cui stai parlando non dovrebbe nemmeno notare l'overhead degli strumenti che mantengono l'ambiente.


0

Usando qualcosa che funziona su Apple e Debian, l'unica cosa che ho provato è la scatola virtuale. Ciò che è bello usando virtualbox qui è che potresti costruire una VM sul tuo sistema mac e copiarla su un sistema Debian usando la stessa versione di virtual box e si avvierà.

Avere centinaia di vms che usano la scatola virtuale suona come se stessi spendendo un bel po 'di tempo usando l' interfaccia vboxmange per scrivere le informazioni univoche necessarie per ogni vm. Come gli uuidi per i dischi rigidi, l'indirizzo mac sulle interfacce di rete.

Se il sistema di base utilizzerà lo stesso software configurato allo stesso modo, è possibile creare un'istantanea del sistema nella scatola virtuale e congelarlo. In modo che nessuna modifica apportata venga scritta sulla tua istantanea congelata, ma venga invece scritta in una nuova area di archiviazione temporanea. Quindi ridimensiona la VM, ripristina lo snapshot e stai lavorando su un sistema pulito senza modifiche apportate durante il test. Tutto questo può essere scritto tramite vboxmange .

Usando la tua istantanea puoi anche fare centinaia di copie di quell'immagine VM. Utilizzo dell'interfaccia di scripting vboxmange per rendere le copie uniche nei modi che contano, ad esempio uuids e indirizzi mac. Quindi fai eseguire una chiamata di script di avvio su ciò che cambia, le configurazioni che devi applicare alle VM per i test o l'esecuzione di vari test.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.