MIGRAÇÃO DE CONTAINERS UTILIZANDO CRIU E LXC

A ideia de container na informática está associada ao que temos na vida real, onde teremos todo o sistema (usuários, arquivos, processos, etc.) visível para o usuário encapsulado no dito container, dessa forma temos a possibilidade de passarmos todo esse sistema do usuário de uma máquina para outra, as justificativas para isso podem ser várias, melhorar o desempenho para o usuário, diminuir gastos com energia, entre outros. A esse processo de transferir o sistema do usuário para uma outra máquina damos o nome de migração.

Para realizar a migração utilizaremos basicamente 3 ferramentas, que são CRIU (v1.6), LXC(1.1.0) e o RSYNC:

CRIU
O CRIU serve para que possamos criar e gerenciar o container, com ele podemos definir qual sistema estará presente no nosso container, definir o nome do container, podemos também realizar checkpoint e restores dos containers, porém não o utilizaremos para realizar as duas últimas operações citadas, vamos a instalação e configuração do criu.

Para começar os processos de instalações vamos primeiro atualizar nossos repositórios com o

sudo apt-get update

Para instalar o CRIU devemos primeiramente fazer o download do projeto para a nossa máquina utilizando o git, com o comando:

git clone https://github.com/xemul/criu

Agora damos uma parada na instalação do CRIU para instalarmos algumas ferramentas necessárias para a sua compilação e instalação.

Para compilar o CRIU devemos instalar o pacote build-essential com o comando:

sudo apt-get install build-essential

Devemos também instalar mais algumas ferramentas necessárias para que possamos compilar o CRIU, podemos instalar todas com o seguinte comando:

sudo apt-get install libprotobuf-dev libprotobuf-c0-dev protobuf-c-compiler protobuf-compiler python-protobuf

Temos também que instalar as bibliotecas de compilação, executando o comando:

sudo apt-get install autoconf curl g++ libtool

E por último instalar mais duas ferramentas, através do comando:

sudo apt-get install asciidoc xmlto

Após os passos anteriores, podemos então voltar para a instalação do CRIU propriamente dita, primeiro passo é entra na pasta do CRIU que clonamos do Github, estando na pasta onde baixamos a pasta do projeto, basta executar o comando:

cd criu/

Depois de entrar na pasta temos agora que compilar o projeto do CRIU, através do comando:

sudo make

E logo depois, dar um make install para instalar o CRIU:

sudo make install

Para verificar se o CRIU foi instalado corretamente pode ser executado o comando:

criu check –ms

LXC
Agora podemos partir para a configuração do LXC, que será a ferramenta utilizada em conjunto com o CRIU para fazermos os chekpoints e restores para que consigamos fazer a migração.
O primeiro passo será criarmos o container usado para o teste, executando o comando:

lxc-create -t ubuntu -n u1 -- -r trusty -a amd64

Com o comando acima estamos criando um container com um sistema Ubuntu e nome u1. Agora devemos fazer algumas configurações no arquivo de configuração do container, que se encontra no caminho /var/lib/lxc/u1/config, com o comando a seguir estamos adicionando algumas configurações ao arquivo config.

sudo vi /var/lib/lxc/u1/config
 
# hax for criu
lxc.console = none
lxc.tty = 0
lxc.cgroup.devices.deny = c 5:1 rwm
lxc.seccomp =

Agora podemos iniciar o container com o commando:

lxc-start -n u1

Depois do container iniciado ele pode ser acessado de duas formas, via shh ou com o comando:

lxc-attach

Ou via ssh:

ssh ubuntu@$(sudo lxc-info -i -H -n u1)

Com o comando anterior nós iremos logar via ssh com o usuário ubuntu e o comando entre parênteses serve para pegar o IP do container, portanto ficaria algo como “ssh ubuntu@10.0.3.2” depois de executado.

Via attach:

lxc-attach -n 1

Agora que já temos o container em execução e temos as opções de checkpoint e restore ativas pelo LXC, podemos partir para a parte da migração.

MIGRAÇÃO
Para realizarmos a migração utilizaremos um script que fará o checkpoint no servidor 1, fará a sincronização entre as pastas do chekpoint do servidor 1 e a pasta de checkpoint do servidor 2 e após a sincronização iniciará o container no servidor 2.
O script que será usado para realizar os passos anteriores já está comentado com explicações do que cada parte faz, segue:

#Créditos do script ao blog http://tycho.ws/

#!/bin/sh

#Apaga conteúdo do diretório checkpoint se ele existir, para evitar erros
if [ -e /tmp/checkpoint/ ]; then
  rm -rf /tmp/checkpoint/*
fi
usage() {
  echo $0 container user@host.to.migrate.to
  exit 1
}

#Verificação de erros e argumentos passados na hora de chamar a execução do script
if [ "$(id -u)" != "0" ]; then
  echo "ERROR: Must run as root."
  usage
fi
if [ "$#" != "2" ]; then
  echo "Bad number of args."
  usage
fi
name=$1
host=$2
checkpoint_dir=/tmp/checkpoint

#Função responsável por sincronizar as pastas onde estão os arquivos dos containers entre os servidores
do_rsync() {
  rsync -aAXHltzh --progress --numeric-ids --devices --rsync-path="sudo rsync" $1 
$host:$1
}

# we assume the same lxcpath on both hosts, that is bad.
LXCPATH=$(lxc-config lxc.lxcpath)

#Ação responsável por criar o checkpoint
lxc-checkpoint -n $name -D $checkpoint_dir –v

#Ação responsável por fazer a sincronização entre os servidores
do_rsync $LXCPATH/$name/
do_rsync $checkpoint_dir/

#Executa um comando via ssh para “levantar” o container no servidor para o qual ele foi migrado
ssh $host "sudo lxc-checkpoint -r -n $name -D $checkpoint_dir -v"
ssh $host "sudo lxc-wait -n $name -s RUNNING"

Para finalizarmos salvamos o script com o nome migrate e damos permissão de execução ao arquivo com o comando:

chmod +x migrate

Podemos executá-lo com o comando:

sudo ./migrate u1 “Usuário da máquina destino (servidor)”@”IP da máquina destino (servidor 2)”

Como exemplo, na minha máquina eu executo o script com o seguinte comando:

sudo ./migrate u1 mininet@10.0.0.2

Para evitarmos interação do usuário inserindo senhas durante o processo de migração, devemos copiar a chave ssh do host em que o container a ser migrado está para o host em que o container será migrado. Para fazermos isso, devemos logar na conta do root, criar a chave ssh e copiá-la para o outro host.

sudo su
cd /root
ssh keygen
ssh-copy-id -i .ssh/id_rsa.pub usuario_maquina_destino@IP_maquina_destino

No nosso exemplo:

ssh-copy-id -i .ssh/id_rsa.pub mininet@10.0.0.2

Com isso concluirmos nossa migração. Espero ter ajudado!

Autores: Carlos César e Mário Gomes.
Editado em 02/12/2015: Demis Gomes e Saulo Marques.

Um comentário em “MIGRAÇÃO DE CONTAINERS UTILIZANDO CRIU E LXC

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 )

Foto do Google

Você está comentando utilizando sua conta Google. 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 )

Conectando a %s