Maneira correta de lidar com contêineres LXC em btrfs

11

Digamos que temos um servidor com o lxc instalado e um contêiner do lxc usado como img base /var/lib/lxc/ubuntu_base. Para simplificar, vamos esquecer as alterações de configuração depois de copiar o img base.

algumas pessoas sugerem o uso de subvolumes e snapshots para criar novos contêineres, mas é possível facilmente fazer cp --reflink com resultados semelhantes.

Então, qual é o caminho mais adequado (ou melhor) para gerenciar vários contêineres?

  • instantâneos

Dessa maneira, parece melhor, mas comandos como lxc-destroy não funcionarão, pois não poderão excluir o diretório.

btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • cp com reflink

Não tenho certeza se há alguma diferença de desempenho entre este ou instantâneos

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • ou Existe alguma outra maneira melhor de fazer isso que eu não conheço.

editar:

Uma coisa que eu vi com a opção reflink é que você não pode excluir o contêiner base se outros estiverem em execução, porque o /proce /devsão montados e nunca mudam, se a referência for sempre a mesma. Mas desligar todos os contêineres copiados parece ajudar.

zidarsk8
fonte
Eu usei o recurso de captura instantânea btrfs para criar novos contêineres - e funciona bem (provisionamento muito rápido etc.). No entanto, o btrfs possui um cache de páginas por subvolume - portanto, embora o uso de snapshots seja rápido / eficiente em espaço em disco, é provável que você acabe tendo várias cópias do que é efetivamente o mesmo binário na memória.
David Goodwin

Respostas:

2

Estou no Ubuntu LTS 14 e executei o seguinte (pela primeira vez) e funcionou como um encanto:

lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1

O uso de -s com lxc-clone fará uma captura instantânea se o armazenamento de backup for btrfs (no seu caso).

Verifique o novo clone / snapshots com

lxc-ls -f
btrfs subvolume list /var/lib/lxc

Espero que ajude!

dapithor
fonte
1
Observe que hoje em dia você precisa especificar btrfs como repositório de backup quando você executa o lxc-create ou o lxc-clone fornecerá um overlayfs .
Lester Cheung
Para criar apenas um novo contêiner "leve", parece que as duas primeiras linhas são suficientes (lxc-stop e lxc-clone), graças à -sopção, e que as três últimas (lxc_start, lxc_stop, lxc_stop, lxc_snapshot) são apenas uma processo auxiliar para gerenciar futuras evoluções de contêineres. Está correto ?
Lalebarde 30/05
3

se você usará os subvolumes btrfs para lxc, precisará adicionar a opção user_subvol_rm_allowedno seu /etc/fstab. Exemplo extraído de um arquivo fstab:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

a opção permitirá que você remova o subvol sem ser root, apenas usuário normal. Esse recurso é usado pelo lxc quando os instantâneos entram nos subvolumes btrfs

Yonsy Solis
fonte
3

Acho que depende do tamanho da sua imagem de base. Eu provavelmente criaria um novo contêiner para o lxc e usaria Salt / Puppet etc. para provisionar meus contêineres e apenas o clone do lxc para contêineres relativamente maiores (por exemplo, contêineres de desenvolvimento com muitas ferramentas instaladas e configuradas).

Observe que o lxc-clone usará o mesmo armazenamento secundário da fonte. Portanto, para usar o subvolume, você precisará criar seus contêineres com "-B btrfs". Por exemplo:

lxc-create -B btrfs -n mycontainer -t ubuntu

Em seguida, clone-o com:

lxc-clone -s mycontainer mynewcontainer

Caso você esteja usando o zfs para armazenar contêineres, existe uma --zfsrootopção extra para o lxc-create, para que você possa escolher um zpool diferente do "tanque" padrão. Por exemplo:

lxc-create -B zfs --zfsroot=data/lxc

Compartilhe e curta!

Lester Cheung
fonte
Estou no debian wheezy com BTRFS. Parece que a opção -B btrfsé usada por padrão - presumo que meu debian esteja configurado com BTRFS. Na verdade, eu criei meu primeiro container (um debian wheezy de 32 bits) sem essa opção, e um subvolume foi criado para ele.
Lalebarde 30/05
@lalebarde que provavelmente está -B bestem ação, mas é bom saber!
Lester Cheung