1) Introdução
Ganeti é uma ferramenta de clusterização de servidores que permite o gerenciamento de múltiplos servidores (nós) a partir de um único servidor (nó master). A partir deste, é possível instalar máquinas virtuais em outros nós e gerencia-las.
Este é um guia rápido de instalação e configuração de um cluster. Para mais informações, consulte as referências citadas no final deste documento.
É conveniente saber o significado de alguns termos usados em clusterização, tais como: a) nó: é um servidor físico.
b) instância: uma máquina virtual hospedada em algum nó. c) cluster: o conjunto formado por dois ou mais nós.
O tutorial vai abordar um exemplo simples de cluster, composto por dois servidores (nós). O software de virtualização abordado será o KVM. O Ganeti também oferece suporte ao Xen.
2) Pré-requisitos
• Dois computadores ou servidores. Cada um deve conter duas placas de rede. • Versão estável do Debian mais recente instalada em cada nó.
• As interfaces de rede secundárias de cada nó (eth1) devem ser interconectadas por meio de um patch cord. Caso o cluster tenha mais de dois nós ou os nós estejam distantes fisicamente, é preciso interligar as interfaces por meio de um switch.
3) Instalação
3.1) Instalação do SO
Instalar a última versão estável do Debian, de preferência com o CD Netinst.
Ao particionar o disco rígido, crie uma LVM no mesmo e dê um nome para o VG (Volume Group). O nome do VG deve ser o mesmo para todos os nós!
Reserve um espaço mínimo para as partições do sistema e deixe o restante do epaço do VG livre. O Ganeti usará o espaço livre para criação das instâncias.
Instale o sistema mínimo, apenas com suporte a SSH.
3.2) Configuração do sistema
Todos passos a seguir devem ser executados em todos nós do cluster.
apt-get install lvm2 ssh bridge-utils iproute iputils-arping ndisc6 \ python python-pyopenssl openssl python-pyparsing python-simplejson \ python-pyinotify python-pycurl socat make kvm drbd8-utils dump kpartx \ ghc6 libghc6-json-dev libghc6-network-dev libghc6-parallel-dev
libghc6-curl-dev \
python-paramiko qemu-utils
Baixar e instalar a versão mais recente do Ganeti:
wget http://ganeti.googlecode.com/files/ganeti-2.5.1.tar.gz tar xfvz ganeti-2.5.1.tar.gz
cd ganeti-2.5.1
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-os-dir=/srv/ganeti/os \
--enable-htools make
make install
mkdir /srv/ganeti/ /srv/ganeti/os /srv/ganeti/export cp doc/examples/ganeti.initd /etc/init.d/ganeti
chmod +x /etc/init.d/ganeti
update-rc.d ganeti defaults 20 80
ln -s /boot/initrd.img-`uname -r` /boot/initrd.img-2.6-domU ln -s /boot/vmlinuz-`uname -r` /boot/vmlinuz-2.6-domU
4) Configuração dos nós
4.1 /etc/network/interfaces
Neste exemplo, foram atribuídos endereços IP reais da rede da Divisão de Suporte Técnico para as interfaces de rede primárias.
Interfaces do primeiro nó:
auto br0
iface br0 inet static
address 200.137.222.164 netmask 255.255.255.224 network 200.137.222.160 gateway 200.137.222.161 bridge_ports eth0 bridge_stp off bridge_fd 0 auto eth1
iface eth1 inet static address 10.1.1.1
netmask 255.255.255.0
Interfaces do segundo nó:
auto br0
iface br0 inet static
address 200.137.222.166 netmask 255.255.255.224 network 200.137.222.160 gateway 200.137.222.161 bridge_ports eth0 bridge_stp off bridge_fd 0 auto eth1
iface eth1 inet static address 10.1.1.2
netmask 255.255.255.0
4.2) /etc/hosts
Exemplo de configuração do arquivo /etc/hosts:
127.0.0.1 localhost
200.137.222.164 ead1.cercomp.ufg.br node1 200.137.222.166 ead2.cercomp.ufg.br node2
200.137.222.175 cluster01.cercomp.ufg.br cluster01
200.137.222.176 vm1.cercomp.ufg.br vm1 200.137.222.177 vm2.cercomp.ufg.br vm2
Neste exemplo, o nó master (node1) está registrado no DNS como ead1.cercomp.ufg.br e o segundo nó (node2) como ead2.cercomp.ufg.br. O cluster deve ter um nome próprio registrado no DNS e um endereço IP exclusivo (não pode ser o endereço IP do nó master, que será usado para iniciar e gerenciar o cluster). Assim como o cluster e os nós, as máquinas virtuais a serem instaladas tambem devem ser registradas no /etc/ hosts de cada nó. De forma similar, cada VM deve ter um registro próprio no DNS, bem como um endereço IP exclusivo, como consta acima no exemplo.
4.3) /etc/crontab
Para iniciar automaticamente instâncias que falharam ao iniciar, é preciso adicionar uma rotina no cron para executar a cada 5 minutos o processo ganeti-watcher. Acidione a seguinte linha no arquivo /etc/ crontab:
*/5 * * * * root [ -x /usr/local/sbin/ganeti-watcher ] && /usr/local/sbin/ ganeti-watcher
Alternativamente, uma rotina pode ser incluída no /etc/crontab para zerar o contador de trabalhos (rotinas executadas no ganeti).
45 1 * * * root [ -x /usr/local/sbin/ganeti-cleaner ] && /usr/local/sbin/ ganeti-cleaner
No exemplo acima, o comando ganeti-cleaner será executado sempre a 01:45 AM. O horário para execução fica a critério do administrador.
Reiniciar o cron
/etc/init.d/cron restart
4.4) DRBD
O DRBD é uma espécie de RAID via rede, usado pelo Ganeti quando uma máquina virtual é configurada para funcionar no modo de alta disponibilidade. Seguem abaixo as linhas de comando necessárias para configurar o DRBD:
echo drbd minor_count=128 usermode_helper=/bin/true >> /etc/modules depmod -a
modprobe drbd minor_count=128 usermode_helper=/bin/true
4.5) Ganeti Instance Image
Esta é a ferramenta necessária para criar máquinas virtuais. A criação e instalação de VMs será discutida mais adiante. Para instalar o Ganeti Instance Image, siga estes passos:
wget https://code.osuosl.org/attachments/download/2163/ ganeti-instance-image-0.5.1.tar.gz
tar xfvz ganeti-instance-image-0.5.1.tar.gz cd ganeti-instance-image-0.5.1
./configure --prefix=/usr --localstatedir=/var \ --sysconfdir=/etc --with-os-dir=/srv/ganeti/os \ make
make install
5) Configuração do cluster
Nesta estapa da configuração do cluster, é preciso eleger um dos nós para ser o nó master. A partir dele que os comandos de gerenciamento do Ganeti poderão ser executados.
5.1) Inicialização do cluster
Caso não tenha a pasta .ssh no diretório home do usuário root, é preciso cria-la
mkdir /root/.ssh
Uma vez escolhido o nó, executar o seguinte comando:
gnt-cluster init --master-netdev=br0 --vg-name cluster -s 10.1.1.1 --maintain-node-health=yes \
-B vcpus=1,memory=512M \
-H kvm:initrd_path=/boot/initrd.img-2.6-domU,kernel_path=/boot/ vmlinuz-2.6-domU,cdrom_image_path=/root/
debian-6.0.5-amd64-netinst.iso,boot_order=cdrom,vnc_bind_address=0.0.0.0 \ --enabled-hypervisors=kvm -N link=br0 cluster01
O comando acima inicia o cluster a partir do nó master escolhido (neste caso, o node1 foi eleito como nó master), informando que a interface de comunicação entre os nós é a br0, que o volume group da lvm de cada nó de chama "cluster". Informa também o endereço IP da interface de rede secundária. Os parâmentros "vcpus" e "memory" informam o número de cpus virtuais e a quantidade de memória padrão que será alocada a cada instância com o comando "gnt-instance add". A seguir, os parâmetros necessários para a execução do kvm. Note que existe o parâmetro cdrom_image_path, qual informa o diretório onde se encontra alguma imagem iso para instalação de instâncias. Neste caso, o comando informa que existe uma imagem iso debian-6.0.5-amd64-netinst.iso armazenada no diretório /root. Todos os nós devem possuir a mesma imagem armazenada no mesmo diretório informado no comando!
5.2) Inclusão de nós no cluster
gnt-node add -s 10.1.1.2 node2
6) Ganeti Web Manager
O Ganeti Web Manager (GWM), como o próprio diz, é uma interface web de gerenciamento do Ganeti. Ela é útil para instalação/remoção/modificação de instâncias, acesso a instâncias via VNC e para um overview geral do cluster. Porém, a interface é limitada, não permitindo, por exemplo, o failover de instâncias, backup, adição de nós, dentre outras funcionalidades. Entretanto, mesmo com poucas funcionalidades, a ferramenta é um bom auxílio para o administrador do cluster.
6.1) Instalação
O GWM deve ser instalado no nó master. A instalação exige um servidor de banco de dados. Neste exemplo será usado o mysql. Para instalar os pré-requisitos, digite o comando
apt-get install python-pip python-dev python-virtualenv python-django python-django-registration \
python-django-south fabric curl git-core mysql-server python-mysqldb cd /srv/ganeti
git clone git://git.osuosl.org/gitolite/ganeti/ganeti_webmgr cd ganeti_webmgr/
Adicionar as seguintes linhas no arquivo /usr/share/pyshared/fabric/context_managers.py def lcd(path):
"""
Context manager for updating local current working directory.
This context manager is identical to `~fabric.context_managers.cd`, except
that it changes a different env var (`lcwd`, instead of `cwd`) and thus
only affects the invocation of `~fabric.operations.local` and the local
arguments to `~fabric.operations.get`/`~fabric.operations.put`. Relative path arguments are relative to the local user's current working
directory, which will vary depending on where Fabric (or Fabric-using code)
was invoked. You can check what this is with `os.getcwd
<http://docs.python.org/release/2.6/library/os.html#os.getcwd>`_. It may be
useful to pin things relative to the location of the fabfile in use, which
may be found in :ref:`env.real_fabfile <real-fabfile>` .. versionadded:: 1.0
"""
return _change_cwd('lcwd', path) def _change_cwd(which, path):
path = path.replace(' ', '\ ')
if state.env.get(which) and not path.startswith('/'): new_cwd = state.env.get(which) + '/' + path
else:
new_cwd = path
return _setenv(**{which: new_cwd})
Estas linhas adicionais são do arquivo context_managers.py da versão 1.4 do fabric, baixada do git. A versão atual do fabric do repositório do Debian é a 0.9, a qual não possui os métodos abaixo, cruciais para os próximos comandos de configuração do GWM (Por que, então, não instalar a versão 1.4? Porque a versão do git instala apenas a base do fabric, sem o comando fab, disponível na versão do repositório do Debian.) Reiniciar o servidor
reboot
A seguir, digitar o comando fab dev deploy
cp settings.py.dist settings.py
Editar o arquivo settings.py e alterar as seguintes linhas.
ENGINE = 'django.db.backends.servidor_sql' # <-- Substituir a string "servidor_sql" por uma das seguintes opções: 'mysql', 'postgresql', 'postgresql_psycopg2' or 'sqlite3'
NAME = '' # criar banco de dados caso não exista
USER = '' # criar usuário caso não exista
PASSWORD = '' # definir senha de usuário
HOST = '' # endereço IP do servidor, mesmo que o banco de dados seja local
PORT = '' # também não é preciso se o banco de dados for local
No mesmo arquivo, edite as seguintes linhas:
SITE_DOMAIN = 'ip_do_servidor:8000' VNC_PROXY='ip_do_servidor:8888'
Editar o arquivo /etc/mysql/my.cnf e informar o endereço IP real do servidor no parâmetro bind-address. Reiniciar o mysql.
Ainda dentro do diretório do GWM, iniciar o ambiente virtual por meio do comando
source bin/activate
Inicializar o banco de dados local por meio do comando
./manage.py syncdb --migrate
Criar a indexação de pesquisa por meio do comando
./manage.py rebuild_index
6.2) Criação de usuário do Ganeti Remote API (RAPI)
Crie um usuário de acordo com exemplo abaixo:
echo -n 'ganeti:Ganeti Remote API:123456' | openssl md5 #Cria o usuário "ganeti" com senha "123456"
echo ganeti {HA1}41ec1b84b27f257984aaab87c2a81dba write > /var/lib/ganeti/ rapi/users
Na segunda linha de comando, a string 41ec1b84b27f257984aaab87c2a81dba é a saída do primeiro comando.
6.4) Testando a interface
Dentro do diretório do GWM e com o ambiente virtual ativado, conforme explicado no tópico 6.1, execute os seguintes comandos
twistd -n vncap -c tcp:8888:interface=ip_do_servidor ./manage.py runserver ip_do_servidor:8000
O primeiro comando ativa o suporte a VNC para acesso às instâncias por meio do GWM. O segundo comando inicia o servidor. Substitua o endereço IP dos comandos acima pelo endereço do servidor.
Em seguida, acesse pelo browser o endereçohttp://ip_do_servidor:8000
6.5) Configurando o sistema para iniciar o GWM automaticamente
Editar o arquivo /etc/rc.local e adicionar as seguintes linhas antes da linha exit0:
/srv/ganeti/ganeti_webmgr/bin/python /srv/ganeti/ganeti_webmgr/manage.py runserver ip_do_servidor:8000 2> /dev/null &
/srv/ganeti/ganeti_webmgr/bin/python /srv/ganeti/ganeti_webmgr/bin/twistd -n vncap -c tcp:8888:interface=ip_do_servidor 2> /dev/null &
Substituir a string ip_do_servidor das linhas de comando pelo IP do servidor. 6.6) Configuração do Nginx
Em vez de acessar o GWM por meio do IP do servidor e pela porta 8000, é melhor intalar o servidor web Nginx e tratar as requisições da porta 8000.
Para instalar o nginx, digite o comando
apt-get install nginx
Em seguida, crie um arquivo chamado ganeti.conf, no diretório /etc/nginx/sites-available, com o seguinte conteúdo (onde houver a string ip_do_servidor, substitua pelo endereço IP):
server {
root /var/www;
index index.html index.htm; listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6 server_name ganeti; access_log /var/log/nginx/localhost.access.log; location / { proxy_pass http://ip_do_servidor:8000; } }
Crie um link simbólico no diretório /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/ganeti.conf /etc/nginx/sites-enabled/ ganeti.conf Reinicie o nginx /etc/init.d/nginx restart