Contêineres com LXC – parte 3

Imagem da página 2016-01-03 - 18.35.43

Depois da primeira e segunda partes onde se exercitou a “arte” da criação e operação dos contêineres, e um pouco de teoria também, agora é a vez de ajustar o “tamanho” deles, ou seja, a porção do de recursos de hardware do computador hospedeiro que utilizarão e também conhecer algumas facilidades.

Ajuste fino no contêiner

Relembrando que o LXC virtualiza por cima do próprio sistema operacional, ou seja, aquilo que o contêiner enxerga como “hardware” é justamente o próprio hardware do hospedeiro. Para melhor exemplificar uma comparação:

LXC-3_real_container

Na janela da esquerda está o hospedeiro enquanto que o da direita um dos contêineres rodando Debian, o “debian-01”.  Nos dois casos ambos estão “enxergando” a mesma máquina e com 4 processadores, 8 GiB de memória física e 4 GiB de memória virtual para suprir as suas necessidades.

Algo pouco prático quando se pensa em um ambiente com vários contêineres executando diversas aplicações ao mesmo tempo. Mas utilizando as facilidades do cgroups é possível restringir o quanto do hospedeiro cada contêiner terá acesso.

Usarei o mesmo contêiner, o “debian-01”, nos exemplos para depois comparar com a tela inicial.

Processadores

Para limitar o número de processadores usa-se:

# lxc-cgroup -n debian-01 cpuset.cpus 3

Isto não significa a quantidade e sim qual/quais processador/processadores usar.

Em um host com quatro processadores eles são identificados como “0”, “1”, “2” e “3”. Então o que  informo no comando é justamente quais serão usados pelo contêiner, se apenas o processador “0”, se os processadores de “0” até  “2” (0-2), se o “0” e também “3” (0,3) etc. No meu exemplo resolvi indicar que apenas o processador “3” será usado pelo contêiner.

Este comando pode ser executado com o contêiner em execução, útil para dar “mais potência” em caso de uma necessidade momentânea e para tornar a configuração permanente basta editar o arquivo “/var/lib/lxc/debian-01/config” colocando a linha:

lxc.cgroup.cpuset.cpus = 3

Neste caso o contêiner precisará ser reiniciado.

Memória física (RAM)

Para alterar a quantidade de memória RAM o procedimento é parecido:

# lxc-cgroup -n debian-01 memory.limit_in_bytes 512M

Você pode colocar os valores em bytes ou usar os sufixos “M” ou “G” para indicar megabytes ou gigabytes, respectivamente.

Para deixar permanente inclua no arquivo de configuração do contêiner a linha:

lxc.cgroup.memory.limit_in_bytes = 512M

Só relembrando que o ajuste aqui obriga a reiniciar o contêiner para que tenha efeito — tecnicamente você testa usando lxc-cgroup deixa funcionando como desejado e depois altera o arquivo de configuração.

Memória Virtual

O ajuste da quantidade de memória virtual (ou swap) é feito do mesmo modo que os demais mas deve-se atentar que a quantidade de memória virtual a ser definida deve ser maior ou igual a quantidade de memória física já reservada ao contêiner. Caso contrário:

# lxc-cgroup -n debian-01 memory.memsw.limit_in_bytes 256M
lxc-cgroup: cgmanager.c: do_cgm_set: 1053 Error setting cgroup value
memory.memsw.limit_in_bytes for memory:/lxc
lxc-cgroup: cgmanager.c: do_cgm_set: 1054 call to cgmanager_set_value
_sync failed: invalid request
lxc-cgroup: lxc_cgroup.c: main: 103 failed to assign '256M' value to 
'memory.memsw.limit_in_bytes' for 'debian-01'

Pelo que entendi, só é possível ajustar a quantidade de memória virtual logo após ajustar a quantidade da memória física, em sequência:

# lxc-cgroup -n debian-01 memory.limit_in_bytes 256M
# lxc-cgroup -n debian-01 memory.memsw.limit_in_bytes 256M

Talvez seja este o problema que tive de deixar a memória virtual já definida no arquivo de configuração do contêiner… :-/

Configurando o GRUB

Para que o LXC consiga alterar a quantidade da memória virtual dos contêineres pode ser necessário avisar ao Linux que ele pode fazê-lo e isto se faz no GRUB editando o arquivo “/etc/default/grub”:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory
swapaccount=1"

Depois de alterado use  o update-grub para atualizar a configuração e, claro, reinicie.

Quanto de memória virtual mesmo?

Um outro detalhe curioso, o conteúdo em “/proc/meminfo” do hospedeiro e do contêiner informam a mesma quantidade de memória virtual.

LXC-3_swaptotal

Para saber os valores corretos, você precisará consultar o arquivo “/sys/fs/cgroup/memory/lxc/«nome do contêiner»/memory.max_usage_in_bytes”.

Resultado final

Feitos os ajustes  é hora de comparar mais uma vez o que hospedeiro e contêiner “enxergam” agora:

LXC-3_real_container-2

Lembrando que (1) podem ser realizados com o contêiner em execução e (2) que a quantidade real da memória virtual não é percebido corretamente pelo contêiner.

Priorizando a execução

A maneira como os contêineres compartilham o tempo de processador também pode ser ajustada. Por exemplo, pode-se configurar um contêiner para ter ½ (1024÷2=512) do tempo enquanto que os demais ficam apenas com ¼ (1024÷4=256) e por aí vai.

No caso da “debian-01” ele só usará 25% do tempo disponível:

# lxc-cgroup -n debian-01 cpu.shares 256

Para deixar permanente, basta colocar no arquivo de configuração do contêiner:

lxc.cgroup.cpu.shares = 256

Este é dos ajuste menos “visíveis” e acaba fica mais perceptível quando se tem vários contêineres em execução.

Agrupando os contêineres

A ideia de agrupar os contêineres é para poder executar operações simultâneas usando o lxc-autostart . Por exemplo, ligar todos aqueles do grupo “banco de dados”, reiniciar os “servidor web” ou desligar os “CentOS”. Inclusive um contêiner pode pertencer a vários grupos ao mesmo tempo, o que torna tudo mais interessante.

O uso é bem simples, bastando incluir no arquivo de configuração do contêine indicando os grupos que eles pertencem separados por um espaço:

lxc.group=«grupo 1» «grupo 2» ... «grupo n»
lxc.start.auto = 1

e também indicar o contêinerno arquivo de configuração de cada contêiner, daí basta usar os comandos lxc-autostart com o parâmetro “-g” ao invés do “-n”.

Criei dois grupos “debian” e “ubuntu” e associei alguns contêineres a eles:

root@athena:~# lxc-ls -f
NAME       STATE    IPV4  IPV6  GROUPS         AUTOSTART  
--------------------------------------------------------
debian-01  STOPPED  -     -     debian         BY-GROUP   
debian-02  STOPPED  -     -     debian         BY-GROUP   
gentoo-01  STOPPED  -     -     -              NO         
ubuntu-01  STOPPED  -     -     debian,ubuntu  BY-GROUP

Se eu quiser iniciar todos os “debian” basta fazer:

# lxc-autostart -g debian
# lxc-ls -f
NAME       STATE    IPV4        IPV6  GROUPS          AUTOSTART  
---------------------------------------------------------------
debian-01  RUNNING  10.0.3.171  -     debian          BY-GROUP   
debian-02  RUNNING  10.0.3.172  -     debian          BY-GROUP   
gentoo-01  STOPPED  -           -     -               NO         
ubuntu-01  RUNNING  10.0.3.110  -     debian, ubuntu  BY-GROUP

E querendo parar apenas os do grupo “ubuntu”:

# lxc-autostart --shutdown -g ubuntu
# lxc-ls -f
NAME       STATE    IPV4        IPV6  GROUPS          AUTOSTART  
---------------------------------------------------------------
debian-01  RUNNING  10.0.3.171  -     debian          BY-GROUP   
debian-02  RUNNING  10.0.3.172  -     debian          BY-GROUP   
gentoo-01  STOPPED  -           -     -               NO         
ubuntu-01  STOPPED  -           -     debian, ubuntu  BY-GROUP

E apenas como curiosidade, configurei o contêiner “gentoo-01” para iniciar automaticamente (o que o torna visível para o lxc-autostart):

# lxc-ls -f
NAME       STATE    IPV4  IPV6  GROUPS          AUTOSTART  
---------------------------------------------------------
debian-01  STOPPED  -     -     debian          BY-GROUP   
debian-02  STOPPED  -     -     debian          BY-GROUP   
gentoo-01  STOPPED  -     -     -               YES         
ubuntu-01  STOPPED  -     -     debian, ubuntu  BY-GROUP

E então:

# lxc-autostat -g ""
# lxc-ls -f
NAME       STATE    IPV4  IPV6  GROUPS          AUTOSTART  
---------------------------------------------------------
debian-01  STOPPED  -     -     debian          BY-GROUP   
debian-02  STOPPED  -     -     debian          BY-GROUP   
gentoo-01  RUNNING  -     -     -               YES        
ubuntu-01  STOPPED  -     -     debian, ubuntu  BY-GROUP 

Simples, apesar de eu não ter definido explicitamente um grupo para este contêiner ele faz parte do grupo NULL, logo também é possível realizar ações com os contêineres que não fazem parte de grupo algum — mentira eles fazem parte do grupo NULL 😀

Gerenciando via web

O LXC não possui uma ferramenta própria para esta função mas uma que me agradou foi o LXC Web Panel, ela é fácil de instalar e também de usar e inclui o básico do gerenciamento (iniciar, pausar e parar) e configuração dos contêineres.

LXC-3_LWF

Instalá-la é bem simples:

# wget https://lxc-webpanel.github.io/tools/install.sh \
  -O - | bash

O instalador se encarregará do resto, ou seja, instalar Python, PIP, Flask, o programa propriamente dito via git, fará a configuração inicial e o iniciará. O acesso é em http://localhost:5000 e tanto usuário quanto senha são “admin”.

Claro que o LXC Web Panel não é a resposta para todos os problemas, faltam recursos básicos de operação, como criar e gerar instantâneos, ou de configuração, como definir grupos, mas ainda assim é uma ferramenta bastante prática de monitoramento dos contêineres.

O fim (será?)

Ainda falta uma parte — prometo que está acabando — onde finalmente vou falar dos tais contêineres não privilegiados e outros detalhes.

Anúncios

Um comentário sobre “Contêineres com LXC – parte 3

  1. Pingback: Contêineres com LXC – parte 3 - Peguei do

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s