UNIVERSIDADE FEDERAL FLUMINENSE INSTITUTO DE COMPUTAÇÃO DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO ALUNOS: Larissa de Medeiros Torres Santos Thiago Ferreira Bello MATRICULA. 306.31.104-7 MATRICULA. 203.31.110-5 DISCIPLINA. Arquitetura de Computadores III (OPTATIVA) Relatório Final 1 Sumário 1. Resumo da Disciplina.......................................................................................................................3 2. Experiência em computação nas nuvens desenvolvida....................................................................4 2.1 Introdução..................................................................................................................................4 2.1.1 Sistema base de gerência do cloud Eucalyptus: ................................................................4 2.1.2 Arquitetura do Eucalyptus .................................................................................................5 2.1.3 Estrutura física utilizada para instação:.............................................................................5 2.1.4 Configuração Sistema (distribuição dos componentes).....................................................5 2.1.5 Processo de instalação........................................................................................................6 3. Referências ....................................................................................................................................13 2 1. Resumo da Disciplina A proposta da disciplina foi estudar os conceitos que envolve computação em grades (ou nas nuvens), estudar as arquiteturas de computação distribuída, tentar montar e operar uma nuvem, e executar aplicações paralelas em uma grade real. A fim de atingir tais objetivos, alguns materiais foram analisados: − Notas de Aula do Jack Dongarra: http://www.cs.utk.edu/~dongarra/WEB-PAGES/cs594-2009.htm − Artigo Ian Foster, Carl Kesselman e Steven Tnecke: "Above the clouds" − Tutorial BOINC: boinc.berkeley.edu − Outros Cloud Testbeds: https://opencirrus.org/ http://www.eucalyptus.com/ http://workspace.globus.org/ http://www.opennebula.org/ Foram analisadas também as formas de virtualização (Full e Para), e quais as vantagens e desvantagens de cada uma para o projeto da disciplina. Discutiu-se também sobre a importância de paralelizar programas (Lei de Amdahl, 1967), as diferenças entre “Distributed Supercomputing”, “Utility/Service/Cloud/Internet Computing”, “Colaborative Computing”, “Grid Computing” e “Opportunistic Computing”. Para chegar a uma conclusão sobre o que realmente a turma deveria fazer como projeto, foram levantadas as necessidades de cada usuário em uma nuvem: → bom desempenho, → facilidade de uso, → baixo custo, → lucro gerado, → confiabilidade. Associando tudo isso ao projeto da disciplina, as seguintes ideias foram fixadas: → Nossa Nuvem: conjunto de máquinas virtuais (um ambiente virtualizado) formando uma espécie de cluster. → Nosso Objetivo: formar um cluster de máquinas virtuais usando máquinas físicas com poder computacional disponível. → Desenvolver uma estrutura de cloud em que qualquer usuário pudesse ingressar Definido o projeto, algumas necessidades que surgiram: → como autenticar novo usuário na nuvem, → como fornecer IP, → como gerenciar/monitorar máquinas físicas e virtuais da nuvem, → como garantir a comunicação entre processos em execução na nuvem, → como permitir que aplicações executassem na nuvem (primeiro seria necessário definir os tipos permitidos, paralelas ou distribuídas?), 3 → quais serviços fornecer. Com o objetivo de estudar a possibilidade de construção de uma espécie IaaS cloud que tivesse um perfil menos comercial, tínhamos o desafio de produzir uma solução que pudesse ser implantada no meio acadêmico, e fornecesse, de forma democrática, a possibilidade de participação da comunidade acadêmica. Com estas preocupações em mente, foram levantadas e discutidas algumas possibilidades para construção da infra-estruturara que tem como peças-chave o S.O, hypervisor e o sistema gerenciador de cloud. Vale ressaltar que alguns pontos como o escalonamento das máquinas virtuais entre os diversos nodes, decisão de qual node deve receber trabalho a ser executado, como gerenciar que nó tem mais recursos disponíveis para subir uma nova máquina virtual, entre outros questionamentos, ainda ficaram em aberto devido ao tempo limitado dos testes. Foram selecionadas duas infra-estruturas de software código aberto para serem testadas pela turma como base para a construção da nuvem: OpenNebula e Eucalyptus. Conclusão: como não houve tempo suficiente, os testes não foram 100% concluídos. Porém, os testes no laboratório permitiram mostrar que é possível criar a “nuvem de máquinas virtuais” e que alguns pontos ainda precisam ser bastante trabalhados, como, por exemplo, melhorar o suporte à gerência do cloud, através do desenvolvimento de uma interface web (isso facilitaria a gerência tanto local como remota), e melhorar também o suporte ao escalonamento e políticas para gerenciamento das máquinas virtuais. 2. Experiência em computação nas nuvens desenvolvida 2.1 Introdução A seguir, é apresentado um pequeno tutorial de como instalar e manipular o cloud o software de gerência Eucalyptus. Os testes foram então realizados usando o Eucalyptus como gerenciador. 2.1.1 Sistema base de gerência do cloud Eucalyptus: O Eucalyptus é uma infraestrutura de software open-source que fornece as ferramentas necessárias para implementar “computação nas nuvens” em clusters ou em um conjunto de estações de trabalho. Ele possui interface compatível com as interfaces da Amazon EC2, S3 e EBS, e tem uma infraestrutura concebida de tal maneira que permite ser extendida e modificada de forma a ser compatível com outras interfaces. Ele tem por principal objetivo formentar as pesquisas e o desenvolvimento de tecnologias relacionadas a implementação de serviços de computação nas nuvens. 4 2.1.2 Arquitetura do Eucalyptus Uma configuração do Eucalyptus é composta basicamente pelos seguintes componentes: Controlador da nuvem (CLC - Cloud Controller) e "Walrus" - são componentes que ficam no nível mais alto, com um de cada em cada instalação do Eucalyptus. O controlador da nuvem é um programa feito em java que oferece uma interface web para controle. Além de gerenciar requisições, o controlador de nuvem também faz o escalonamento de recursos e gerência de contas. Walrus, também feito em java, implementa um sistema de armazenamento que fica disponível interna e externamente ao cloud através de uma interface compatível com S3. Controlador do cluster (CC - Cluster Controller) - escrito em "C" e implantado como um serviço dentro do Apache cada cluster necessita de um controlador de cluster, ele é responsável pelo escalonamento a nível de cluster, pelo controle da rede e pelo controlador de armazenamento (SC Storage Controler). Controlador de nó (NC - Node Controller) - também escrito em "C" ele é responsável por controlar o hypervisor, sendo assim necessário a sua instalação em cada nó que possua um hypervisor. 2.1.3 Estrutura física utilizada para instação: 2 máquinas com 2G de memória ram utilizando o sistema operacional GNU/Linux Ubuntu 9.04 32 bits, uma máquina como Front-end e uma máquina como Node 2.1.4 Configuração Sistema (distribuição dos componentes) Front-end: Eucalyptus cloud (CLC) Eucalyptus cluster (CC) Node: Eucalyptus (NC) 5 2.1.5 Processo de instalação Versão Utilizada: Eucalyptus 1.5~bzr266 • Instalação do Node • Instalando o hypervisor – Xen Instale o pacote ubuntu-xen-server, ele é um meta-pacote que instalará as ferramentas para manipulação do Xen server, assim como o cerne do xen o hypervisor propriamente dito responsável por controlar a cpu é a memória e que será carregado pelo carregador de boot, ficando faltando só o kernel configurado para funcionar como o primeiro guest S.O do xen o Dom0 (domínio 0) que é carregado automaticamente durante o processo de boot quando o hypervisor inicia e recebe privilégios especiais de acesso ao hardware.. $ sudo apt-get install ubuntu-xen-server Como kernel Dom0 nós podemos utilizar este linux-image-2.6.26-2-xen-686_2.6.2615_i386.deb → Instalando o Kernel $ wget http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-image2.6.26-2-xen-686_2.6.26-19lenny2_i386.deb $ dpkg -i linux-image-2.6.26-2-xen-686_2.6.26-19lenny2_i386.deb → Instalando os Módulos $ http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-modules2.6.26-2-xen-686_2.6.26-19lenny2_i386.deb 6 $ dpkg -i linux-modules-2.6.26-2-xen-686_2.6.26-19lenny2_i386.deb → Configurando o carregador de boot (GRUB apenas) Após a instalação dos pacotes acima normalmente já será adicionada uma nova entrada no seu carregador de boot, mas caso isto não aconteça adicione as seguintes linhas no arquivo /boot/grub/menu.lst title Xen 3.3 / Ubuntu 9.04, kernel 2.6.26-2-xen-686 uuid bd2c08f6-e705-4c85-8fdb-aa884ca8a0b7 kernel /xen-3.3.gz module /vmlinuz-2.6.26-2-xen-686 root=UUID=c397979f-01e0-4180-83ebffff8c9324fced1e ro console=tty0 module /initrd.img-2.6.26-2-xen-686 quiet OBS: Substitua o uuid acima pelo uuid da sua partição raiz Por fim reinicie o sistema e escolha a nova opção de boot. → Configurando a rede do Dom0 A configuração padrão do Xen utiliza bridge, e assim que o controlador do Xen inicia (Xend) ele executará um script para configurar as interfaces que criará um bridge com o nome de sua interface normalmente ethX e renomeará a sua interface para pethX. Então precisaremos alterar o arquivo /etc/network/interfaces para ficar de acordo: Ex: considerando que a interface de rede seja eth0 /etc/network/interfaces ficará auto lo iface lo inet loopback auto peth0 iface peth0 inet manual auto eth0 iface eth0 inet static address xxx.xxx.xxx.xxx gateway xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx Não se preocupe em adicionar a interface a bridge, isto normalmente já é feito pelo script de rede do Xen remova o pacote network-manager 7 $ sudo apt-get remove --purge network-manager • Instalando o controlador de nó do Eucalyptus Instale o pacote eucalyptus-nc $ sudo apt-get install eucalyptus-nc O Eucalyptus necessita que habilitemos o controle do hypervisor do Xen via HTTP para isto altere o arquivo /etc/xen/xend-config.sxp (xend-http-server yes) Por fim precisamos alterar o hypervisor e as configurações de rede no arquivo de configuração do Eucalyptus Altere o arquivo /etc/eucalyptus/eucalyptus.conf HYPERVISOR="xen" VNET_INTERFACE="eth0" VNET_BRIDGE="eth0" * assumindo que eth0 foi a bridge criado pelo Xen Reinicie o controlador de nó para que alterações surtam efeito $ /etc/init.d/eucalyptus-nc restart • Instação do Front-end • Instalando o controlador de nó do Eucalyptus Instale os pacotes eucalyptus-cloud e eucalyptus-cc $ sudo apt-get install eucalyptus-cloud eucalyptus-cc • Registrando os componentes do Eucalyptus → Registrando o cluster: $ sudo euca_conf -addcluster <nome_do_cluster> ip_do_cluster nome_do_cluster → um nome qualquer a sua escolha ip_do_cluster → IP onde o controlador do cluster está instalado no caso da nossa configuração o IP do front-end → Registrando o node: 8 Para fazermos isto nós precisamos primeiramente instalar a chave pública do usuário eucalyptus no controlador de nó de forma que ele possa realizar o login sem a necessidade da senha, para tal: No controlador de nó temporariamente configure uma senha para o usuário eucalyptus $ sudo passwd eucalyptus No controlador de nuvem $ sudo -u eucalyptus ssh-copy-id -i ~eucalyptus/.ssh/id_rsa.pub eucalyptus@<ip_do_node> Agora já podemos remover a senha do usuário eucalyptus no node $ sudo passwd -d eucalyptus • Processo inicial de login e obtenção das credenciais Abra um browser e acesse o seguinte endereço: https://front_end_ip:8443 * se por acaso acusar falha na conexão, certifique-se que o controlador de nuvem foi iniciado, você pode verificar se a porta 8443 está aberta através do comando: $ netstat -tan | grep 8443 Caso não retorne nada, reinicie o controlador de nuvem através do comando $ sudo /etc/init.d/eucalyptus-cloud restart espere alguns segundo e volte a tentar acessar o endereço acima Se tudo ocorre bem deve aparecer uma tela inicial de login, onde o login e a senha inicial são admin, você será guiado então através de alguns passos de configuração do ambiente do cloud, siga as instruções para atualizar a senha e o e-mail do administrador. Assim que terminar você será direcionado para a aba “Configuration” verifique se precisa de algum ajuste e então clique na aba “Credentials” no canto superior direito e por fim faça o download das credenciais clicando em “download certificate”. Agora que temos o certificados precisamos configurar as ferramentas EC2 AMI e API. • Instalando e configurando as ferramentas EC2 AMI e API Essas são as ferramentas que permitirão a manipulação da nuvem, podendo assim ser instaladas em qualquer computador em que se deseja fazer uso da nuvem, e não apenas no nosso front-end. 9 Faremos uma instalação manual destas ferramentas devido a versão das ferramentas EC2ami fornecidas no repositório não funcionarem corretamente com esta versão do Eucalyptus, mas antes precisamos instalar alguns pacotes para que elas funcionem corretamente. $ sudo apt-get install ruby libopenssl-ruby curl Agora vamos fazer o download das ferramentas e instalá-las, para isto execute os seguintes comandos, ou crie um script com eles: $ mkdir ~/.euca $ cd ~/.euca # A próxima linha considera que o certificado obtido na interface Web do cloud está # localizado no desktop, caso não esteja altere para ficar de acordo $ mv ~/Desktop/euca2-admin-x509.zip ~/.euca $ unzip euca2-admin-x509.zip $ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools-1.3-30349.zip $ unzip ec2-api-tools-1.3-30349.zip $ mv ec2-api-tools-1.3-30349 ec2 $ wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools-1.3-26357.zip $ unzip ec2-ami-tools-1.3-26357.zip $ mv ec2-ami-tools-1.3-26357 ec2ami $ echo 'export JAVA_HOME=/usr' >> eucarc $ echo 'export EC2_HOME=~/.euca/ec2' >> eucarc $ echo 'export EC2_AMITOOL_HOME=~/.euca/ec2ami' >> eucarc $ echo 'export PATH=$PATH:$EC2_HOME/bin:$EC2_AMITOOL_HOME/bin' >> eucarc Edite o arquivo ~/.euca/ec2ami/lib/ec2/amitools/instance-data.rb e altere a linha abaixo com o IP do controlador do cluster: META_DATA_URL="http://<ip_controlador_cluster>:8773/latest/meta-data” • Utilizando as ferramentas EC2 AMI e API Sempre que você for usar as ferramentas para controlar o cloud, será necessário fazer source do arquivo eucarc, este arquivo configurará o ambiente para que torne mais fácil o uso das ferramentas. Para isto execute o comando a baixo ou opcionalmente adicione ele ao seu ~/.bashrc de forma que ele sempre será executado quando você fizer o login. $ . ~/.euca/eucarc Para avaliarmos se tudo ocorreu bem até o momento, podemos executar o comando: $ euca-describe-availability-zones verbose AVAILABILITYZONE AVAILABILITYZONE maincluster |- vm types UP 200.20.1.12 free / max cpu ram disk 10 AVAILABILITYZONE AVAILABILITYZONE AVAILABILITYZONE AVAILABILITYZONE AVAILABILITYZONE AVAILABILITYZONE BRST 2009 |- m1.small |- c1.medium |- m1.large |- m1.xlarge |- c1.xlarge |- 200.20.1.13 0000 / 0000 1 128 1 0000 / 0000 1 256 2 0000 / 0000 2 512 10 0000 / 0000 2 1024 20 0000 / 0000 4 2048 20 certs[cc=false,nc=false] @ Sat Dec 19 16:27:24 Deverá aparecer um resultado semelhante ao acima, onde são listados detalhes do cluster local com os tipos de máquinas virtuais disponíveis, o cluster e o nó registrado. • Testando a nuvem Para isto nós utilizaremos uma máquina virtual pré-empacotada já pronta para funcionar no Eucalyptus fornecida no site (http://open.eucalyptus.com). Neste pacote estão contidas uma imagem de uma máquina virtual e um par de imagens kernel/ramdisk tanto para o Xen quanto para o KVM, sendo a do Xen a que nos interessa. Download e extração da imagem $ wget http://www.eucalyptussoftware.com/downloads/eucalyptus-images/euca-ubuntu9.04-i386.tar.gz $ tar -zxvf euca-ubuntu-9.04-i386.tar.gz Agora precisamos criar a AMI para as imagens do kernel do ramdisk e da vm, fazer upload e registrar. $ cd euca-ubuntu-9.04-i386/xen-kernel $ mkdir kernel ramdisk image Usando as ferramentas EC2 execute os comandos abaixo: → Kernel $ ec2-bundle-image -i vmlinuz-2.6.24-19-xen -d ./kernel --kernel true $ ec2-upload-bundle -b kernel -m ./kernel/vmlinuz-2.6.24-19-xen.manifest.xml $ EKI=`ec2-register kernel/vmlinuz-2.6.24-19-xen.manifest.xml | awk '{print $2}'`; echo $EKI → Ramdisk $ ec2-bundle-image -i initrd.img-2.6.24-19-xen -d ./ramdisk --ramdisk true $ ec2-upload-bundle -b ramdisk -m ramdisk/initrd.img-2.6.24-19-xen.manifest.xml $ ERI=`ec2-register ramdisk/initrd.img-2.6.24-19-xen.manifest.xml | awk '{print $2}'`; echo $ERI → Imagem 11 $ ec2-bundle-image -i ../ubuntu.9-04.x86.img -d ./image --kernel $EKI --ramdisk $ERI $ ec2-upload-bundle -b image -m image/ubuntu.9-04.x86.img.manifest.xml $ EMI=`ec2-register image/ubuntu.9-04.x86.img.manifest.xml | awk '{print $2}'`; echo $EMI Para ver se todas as imagens foram adicionadas corretamente você pode executar o comando abaixo, ele deverá mostrar as três imagens EKI, EMI e ERI regitradas. $ ec2-describe-images Se tudo ocorreu bem até aqui nos podemos tentar criar uma instancia da imagem recém registrada, mas para isto antes precisamos criar um par de chaves SSH que nos permitirão fazer login na VM após ela ter iniciado. $ ec2-add-keypair mykey > ~/.euca/mykey.priv $ chmod 0600 ~/.euca/mykey.priv Agora nos podemos criar a instância da imagem através do comando $ ec2-run-instances $EMI -k mykey -t c1.medium onde EMI → é o identificador da imagem, listado no comando ec2-describe-images mykey → é a chave criada através do comando ec2-add-keypair c1.medium → é o tipo de instância que será iniciado, c1.medium é o bastante par que nossa imagem que temos disponível caiba. A primeira vez que você inicia uma instância, o sistema configurará os caches da imagem que será criada por isto pode levar algum tempo para que a instância fique pronta dado que as imagens costumam ser grandes, você pode ficar monitorando o estado da instância através do comando. $ ec2-describe-instances Na saída deste comando deverão aparecer informações sobre o estado da instância. Assim que ela for iniciada deverá aparecer o estado “running” e assim que adquirir um IP do DHCP, você verá os campos de IP privado e público mudarem de “0.0.0.0” para o IP adquirido pela instância. Quando isto acontecer, você poderá logar na sua nova instância usando a chave que foi criada anteriormente através do comando: $ ssh -i ~/.euca/mykey.priv root@<ip_da_instância> O seu Eucalyptus deve se parecer com o seguinte diagrama: 12 Para terminar a instância, você pode utilizar o comando abaixo passando o ID da instância obtido através do comando ec2-describe-instances. $ euca-terminate-instances id_da_instância. 3. Referências 13 https://help.ubuntu.com/community/Eucalyptus-Jaunty https://help.ubuntu.com/community/UEC/PackageInstall http://open.eucalyptus.com/ http://wiki.xensource.com/xenwiki/ 14