Estamos aqui novamente falando sobre contêineres. No artigo anterior (https://www.escolalinux.com.br/blog/openvz-o-container-para-administradores-de-sistemas-2) falamos sobre o OpenVz, suas principais características, assim como os comandos de criação e gerenciamento dos contêineres. Até a versão 3.4 o gerenciador de ambientes virtuais Proxmox utilizava o OpenVz como ferramenta gestão dos contêineres, mas isto mudou no Proxmox 4. Nesta versão eles passaram a utilizar o LXC. Acompanhe!
O LXC
O LXC utiliza uma característica implementada no Kernel para criar e gerenciar contêineres. Como esta característica já está implementada no Kernel por padrão, não é necessário que seja aplicado qualquer patch para seu funcionamento. A Canonical estimula bastante seu uso, ele também já serviu de base para o badalado Docker (que atualmente não se utiliza mais do LXC).
Em virtude das características citadas acima, sua instalação é bem simples e conta com pacotes nas principais distribuições.
* Exemplo de instalação no Ubuntu:# sudo apt-get install lxc
Administração básica
Após instalado, partimos para a criação dos contêineres propriamente dito. Eles são criados a partir de templates. Os templates são as distribuições e versões de distribuições Linux disponíveis e podem ser listados no diretório /usr/share/lxc/templates.
* Exemplo de criação de um contêiner Debian com o nome ct-debian.
# lxc-create --template=debian --name=ct-debian
Depois de criado o contêiner, os comandos para administração básica são os seguintes;
* Iniciar um contêiner:
# lxc-start -n meu-container -d* Verificar status e listarcontêineres: # lxc-info -n meu-container# lxc-ls -f* Conectar no Shell do Container # lxc-console -n meu-container* Finalizar um contêiner # lxc-stop -n meu-container* Remover o contêiner: # lxc-destroy -n meu-conteiner
Os arquivos de configuração que devem ser observados são:
-
O arquivo de configuração geral:
# /etc/default/lxc
-
O arquivo de configurações de opções padrões para todos os contêineres:
# /etc/lxc/default.conf
Arquivo de configuração específico para cada maquina virtual:
# /var/lib/lxc/meu-container/config
Gerenciamento de recursos
Uma das grandes vantagens no uso dos contêineres é sua utilização em servidores na nuvem, um EC2 da Amazon ou qualquer outro servidor virtual. Pagamos por uma instância apenas e podemos utilizar vários serviços de forma isolada e independente, sem a necessidade de consumir outras instâncias virtuais. Mas, grandes vantagens também levam a grandes responsabilidades, e neste caso a grande responsabilidade é com o desempenho de vários contêineres executando sobre uma mesma instância virtual. Para divisão adequada dos recursos do hardware ou da instância virtual, o LXC trabalha com o conceito de Cgroups.
O Cgroup aloca recursos. Estes recursos de hardware podem ser divididos, aumentando a eficiência geral. Ele é dividido em Subsistemas ou controladores de recursos. Cada subsistema é responsável por controlar um conjunto de recursos.
No LXC podemos definir de duas maneiras estes limites dos subsistemas:
-
Diretamente no arquivo de configuração do contêiner, onde as alterações entraram em vigor após a reinicialização do mesmo.
Editando o arquivo de configuração e inserindo as linhas de limite de recurso conforme o modelo abaixo:
lxc.cgroup.
-
Por linha de comando, onde as definições de limites são ativadas instantaneamente porém não ficam salvas após o reinicio co contêiner.
Usando o comando lxc-cgroup conforme o modelo abaixo:
# lxc-cgroup -n
No LXC basicamente vamos falar dos seguintes subsistemas e suas respectivas opções;
-
blkio: Este subsistema define limites de acesso de entrada/saída para e a partir de dispositivos de bloco tais como drives físicos (HD, etc)
Opções do blkio:
-
blkio.weight: Especifica a proporção relativa (weight) do acesso do bloco E/S disponível por padrão a um cgroup, na abrangência de 100 a 1000.
-
blkio.weight_device: Especifica a proporção relativa de acesso de E/S (weight) em dispositivos específicos disponíveis a um cgroup, na abrangência de 100 a 1000
Exemplo de uso com o comando lxc-cgroup:
# lxc-cgroup -n Deb7-02 blkio.weight 200
# lxc-cgroup -n Deb7 blkio.weight 900
Ou seja, o contêiner chamado Deb-7 terá uma maior prioridade no acesso ao disco em relação ao contêiner chamado Deb7-02.
-
cpu: este subsistema fornece acesso às tarefas de cgroups para o CPU.
Opções de cpu:
-
shares: Especifica uma parte relativa do tempo disponível da CPU para tarefas em um cgroup.
Onde:
1024 (padrão) = 50% de utilização
1524 = 60% de utilização
2048 = 67% de utilização
512 = 40% de utilização
Exemplo de uso com o comando lxc-cgroup:
# lxc-cgroup -n Deb7 cpu.shares 512
-
cpuset: Este subsistema atribui CPUs individuais, em sistemas multicores, e nós de memória para atribuir em um cgroup.
Opções de cpuset :
-
cpuset.cpus: Especifica as CPUs cujas tarefas deste cgroup possuem acesso. Exemplo 0-2,16, representa CPUs 0, 1, 2 e 16.
-
cpuset.mems: Especifica os nós de memória cujas tarefas neste cgroup possuem acesso. Exemplo: 0-2,16, representa nós de memória 0,1,2 e 16.
Exemplo de uso, adicionando a linha abaixo no arquivo de configuração do contêiner:
lxc.cgroup.cpuset.cpus = 0-3
-
memory: Este subsistema define limites no uso de memória pelas tarefas em um cgroup.
Opções de memory:
-
memory.limit_in_bytes: Define a quantia máxima de memória de sistema.
-
memory.memsw.limit_in_bytes: Define a quantia máxima para a soma de memória e swap.
Exemplo de uso, adicionando as linhas abaixo no arquivo de configuração do contêiner:
lxc.cgroup.memory.limit_in_bytes = 500M
lxc.cgroup.memory.memsw.limit_in_bytes = 1G
Monitorando os recursos
Alguns subsistemas foram criados com a intenção de exibir informações estatísticas de um recurso e podem ser acessados também através do comando lxc-cgroup. Além disso, o lxc-cgroup apontando para um subsistema, sem parâmetros exibe a configuração atual do subsistema.
O comando abaixo exibe a atual configuração usada no contêiner Deb7 para o subsistema cpu.shares
# lxc-cgroup -n Deb7 cpu.shares
Informações de utilização de CPU podem ser vistas com os comandos:
# lxc-cgroup -n meu-container cpuacct.stat
# lxc-cgroup -n meu-container cpuacct.usage
Informações de consumo de memória podem ser vistas com o comando;
# lxc-cgroup -n meu-container memory.stat
Conclusão
Utilizando corretamente os recursos de cgroup, podemos otimizar o uso de instâncias virtuais em um ambiente de nuvem ou mesmo em equipamentos dedicados para isso, rodando uma maior quantidade de contêineres com um melhor controle de performance e estabelecimento de prioridades de uso de recurso conforme o tipo de serviço prestado. Um contêiner de banco de dados terá uma prioridade maior de leitura/escrita de disco que outro contêiner com a função de serviço web por exemplo.
Como falamos no início do texto, o Proxmox 4 trabalha com o LXC e pode ser gerenciado por uma agradável interface web, inclusive nas configurações de recursos dos contêineres, o que pode ser de grande ajuda quando trabalhamos com uma estrutura complexa com vários hosts e um número ainda maior de contêineres.
Fontes:
** Introdução LXC: https://www.flockport.com/lxc-guide/
** Aplicação no LXC: https://www.flockport.com/lxc-advanced-guide/
** cgroup em PT-br: https://access.redhat.com/documentation/pt-BR/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/ch01.html
** Doc de introdução: https://baobabmaster.unige.ch/slurmdoc/cgroups.html
** cgroups por Oracle: https://docs.oracle.com/cd/E37670_01/E37355/html/ol_about_cgroups.html
** Informação dos State Objects: https://access.redhat.com/documentation/pt-BR/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/ch-Subsystems_and_Tunable_Parameters.html
** Informações de métrica: https://blog.docker.com/2013/10/gathering-lxc-docker-containers-metrics/
Gostou do artigo? Confira outros artigos como este em nosso site e fique por dentro do mercado de TI!