Deployment Orchestration¶
Objetivos:
- Entender os conceitos básicos sobre uma plataforma de gerenciamento de aplicações distribuídas.
- Entender os conceitos básicos de comunicação entre aplicações e serviços.
Pré-requisitos:
- Terminar o capítulo anterior (Bare metal)
- Realizar a leitura sobre o Juju. [https://juju.is/docs/juju/how-to].
Info
DIVISÃO DO ROTEIRO O Roteiro é dividido em 3 partes principais.
- Entender a automacão do Deploy - Utilizando ferramenta Ansible no Bare-metal
- Criando Infraestrutura para deploy com Juju (Deployment Orchestration)
- Utilizando a infraestrutura Bare Metal com o Juju - exemplo de deploy Wordpress
Utilizando o Ansible - deploy automatizado de aplicação¶
Exercise
Check-point1:
- De um print da tela do Dashboard do MAAS com as 2 Maquinas e seus respectivos IPs.
- De um print da aplicacao Django, provando que voce está conectado ao server 2.
- Explique como foi feita a implementacao manual da aplicacao Django e banco de dados.
Agora teremos 2 aplicações django (server2 e server3) compartilhando o mesmo banco de dados (server1). Os motivos para fazermos isso são dois:
- Alta disponibilidade: se um node cair o outro está no ar, para que nosso cliente acesse.
- Load Balancing: podemos dividir a carga de acesso entre os nós.
Vamos realizar a instalação da mesma aplicação de forma automática, por exemplo podemos efetuar a instalação em diversos servers. Vamos então utilizar novos conceitos e ferramentas: Exemplo - gerenciador de deploy Ansible (https://www.ansible.com/)
Características:
- Idempotente no sentido de conseguir repetir todos os procedimentos sem afetar os estados intermediários da instação.
- Fácil de se lidar com um pool de máquinas simultaneamente.
- Consegue realizar o provisionamento automático de VMs e Containers (mas não metal).
Tarefas:
- Peça o deploy no server3 para o maas via cli
- Agora no SSH do main:
- $ sudo apt install ansible
- $ wget https://raw.githubusercontent.com/raulikeda/tasks/master/tasks-install-playbook.yaml
- $ ansible-playbook tasks-install-playbook.yaml --extra-vars server=[IP server3]
Exercise
Check-point2:
- Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
- De um print da tela do Dashboard do MAAS com as 3 Maquinas e seus respectivos IPs.
- De um print da aplicacao Django, provando que voce está conectado ao server 2.
- De um print da aplicacao Django, provando que voce está conectado ao server 3.
- Explique qual diferenca entre instalar manualmente a aplicacao Django e utilizando o Ansible.
Contudo seria ideal que tivéssemos apenas um ponto de entrada, ao invés de escolher manualmente ou chavear os IPs dos nós.
Balancamento de carga usando Proxy Reverso¶
Para montar o ponto único de entrada, utilizaremos uma aplicação de proxy reverso como load balancer.
Vocês conseguem instalar o NGINX no nó server4 como loadbalancer? ... Então monte este proxy.
- Tutorial para fazer manual: https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing
Dicas
Loadbalancing é um mecanismo útil para distribuir o tráfego de entrada por vários servidores privados virtuais capazes. Ao distribuir o mecanismo de processamento por várias máquinas, a redundância é fornecida à aplicação - garantindo tolerância a falhas e maior estabilidade. O algoritmo Round Robin para balanceamento de carga envia visitantes para um conjunto de IPs. Em seu nível mais básico, o Round Robin, que é relativamente fácil de implementar, distribui a carga do servidor sem considerar fatores mais matizados como o tempo de resposta do servidor e a região geográfica dos visitantes.
Configuração: Antes de configurar o loadbalancing do nginx, você deve ter o nginx instalado no seu VPS. Você pode instalá-lo rapidamente com o apt-get:
$ sudo apt-get install nginx
Módulo Upstream
Para configurar um loadbalancer round robin, precisaremos usar o módulo upstream do nginx. Incorporaremos a configuração nas definições do nginx.
Prossiga e abra a configuração do seu site (neste exemplo, trabalharei com o host virtual padrão genérico):
$ sudo nano /etc/nginx/sites-available/default
Precisamos adicionar a configuração de balanceamento de carga ao arquivo.
Primeiro, precisamos incluir o módulo upstream, que se parece com isto:
upstream backend { server backend1.exemplo.com; server backend2.exemplo.com; server backend3.exemplo.com; }
Depois, devemos referenciar o módulo mais adiante na configuração:
server { location / { proxy_pass http://backend; } }
Reinicie o nginx:
$ sudo service nginx restart
Contanto que você tenha todos os servidores privados virtuais no lugar, agora você deve encontrar que o balanceador de carga começará a distribuir os visitantes igualmente para os servidores vinculados.
Dicas
No arquivo de tasks/views.py de cada Django modifique a mensagem "Hello World ..." para conseguir identificar cada server (coloque uma mensagem diferente em cada)
Código:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the tasks index.")
No arquivo de urls.py customize o seu path no urlpatterns:
urlpatterns = [path( ' ', views.index, name='index'),]
Exercise
Check-point3:
- Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
- De um print da tela do Dashboard do MAAS com as 4 Maquinas e seus respectivos IPs.
- Altere o conteúdo da mensagem contida na função
index
do arquivotasks/views.py
de cada server para distinguir ambos os servers. - Faça um
GET request
para o path que voce criou em urls.py para o Nginx e tire 2 prints das respostas de cada request, provando que voce está conectado ao server 4, que é o Proxy Reverso e que ele bate cada vez em um server diferente Server2 e Server3.
Agora que você utilizou um gerenciador de deploy, vamos retormar a criação de nuvem utilizando este novo conceito. Remova o deploy (release) de todos nós no kit.
Criando Infraestrutura para deploy com Juju¶
Ansible é um gerenciador de deploy que consegue lidar com a instalação e configuração de um conjunto de nós pré reservados, mas não consegue realizar o provisionamento direto com o MaaS (gerenciador de Bare-metal). Para montar a nossa Cloud Privada, vamos utilizar outro orquestrador de deploy que integra com o MaaS.
- Antes de continuar, verifique se todas máquinas (server1, server2, server3, server4 e server5) estão Ready no MAAS. Faça o release das máquinas Django e Postgres caso necessário.
- Acesse o main via SSH e instale o Juju
- $ sudo snap install juju --channel 3.1
- Verifique se o Juju enxerga o MaaS como um provedor de recursos
- $ juju clouds
Adicione o cluster MAAS para que o Juju possa gerenciá-lo como uma cloud. Vamos fazer isso através de um arquivo de definição de cloud, como maas-cloud.yaml:
- Caso não possua o MaaS como opção, deve adicioná-lo, confirme se o arquivo corresponde com o seu ambiente
-
Criar um arquivo de configuração: maas-cloud.yaml (atenção com a formatação)
-
$ juju add-cloud --client -f maas-cloud.yaml maas-one
Adicione as credenciais MAAS para que o Juju possa interagir com a nova cloud adicionada. Vamos novamente usar um arquivo para importar nossas informações, como maas-creds.yaml:
credentials: maas-one: anyuser: auth-type: oauth1 maas-oauth: LGJ8svffZZ5kSdeA8E:9kVM7jJpHGG6J9apk3:KE65tLnjpPuqVHZ6vb97T8VWfVB9tM3j
- $ juju add-credential --client -f maas-creds.yaml maas-one
- Obs: OAuth é o API KEY gerado no MaaS (dentro do menu do usuário)
Crie o controlador (usando a série ‘jammy’) para a cloud ‘maas-one’ e chame-o de ‘maas-controller’: Iremos criar o controlador no server1 para isso faça a tag da maquina com o nome juju através do dashboard MAAS na maquina server1.
- $ juju bootstrap --bootstrap-series=jammy --constraints tags=juju maas-one maas-controller
- Para verificar o status do controller utilize:
- $ juju status
Ao contrário do Ansible, Juju necessita de uma máquina exclusiva para controlar todo o deploy. Essa máquina é alocada automaticamente durante o bootstrap e controlará todo o deploy que faremos no próximo roteiro. Ainda, assim como você usou o maas-cli na primeira implantação, você usou o juju-cli para interagir com o serviço.
Para dúvidas relacionadas ao deploy com o juju acesse a documentação oficial: https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/latest/install-juju.html
Utilizando a infraestrutura Bare Metal com o Juju¶
Vamos utilizar o Juju para deploy de uma das arquiteturas abaixo.
As aplicações que vamos utilizar são:
-
Grafana junto com o Prometheus
Faca o deploy da Aplicacao Grafana e Prometheus¶
Deploy Grafana e Prometheus¶
O Grafana é uma plataforma de código aberto que simplifica a apresentação visual de dados, como gráficos e painéis, facilitando a compreensão em tempo real de sistemas e informações.
Para funcionar, o Grafana requer um banco de dados para armazenar configurações, metadados e informações relacionadas à exibição de dados em seus painéis e gráficos. Ele é compatível com vários bancos de dados, como Prometheus, MySQL, PostgreSQL, InfluxDB, SQLite3 e outros. Neste contexto, estamos utilizando o Prometheus como banco de dados, mas você tem a flexibilidade de escolher outro se preferir.
- Instale a aplicação charm para utilizarmos, vamos baixar o charm do Grafana do repositório charm-hub.
Charm
O charm é como um pacote que contém instruções sobre como instalar e configurar um aplicativo, como o Grafana. Você simplesmente escolhe o charm do Grafana, define algumas configurações e o Juju cuida do restante, tornando o processo de implantação mais fácil e consistente em ambientes de nuvem. Entenda melhor sobre o que é o charm lendo a sua documentação charm-hub.
$ sudo snap install charm --channel=2.x/stable --classic
- Baixe o charm do https://charmhub.io/grafana usando o comando charm pull.
-
$ charm pull grafana
-
Também vamos utilizar o charm do Prometheus
$ charm pull prometheus2
Agora é só fazer o Deploy com o auxilio do JUJU¶
- Faça o deploy do charm prometheus2, para fazer deploy do charm local, use juju deploy ./pasta
Deploy do charm grafana¶
- Ao realizar o Deploy do grafana, acompanhe o processo utilizando o comando
juju status
Caso ocorra um erro durante a instalação (hook failed: install
): * Devemos acessar o log da aplicação via o comando juju debug-log --replay --include grafana/2
- Nos logs voce encontrará mais informações da causa do erro
NO_PUBKEY
-
Ele ocorre, pois a chave GPG do repositório do grafana não está no seu servidor, quando o juju tenta fazer
apt-get update
o sistema não consegue verificar a autenticidade do repositório. -
Para consertar devemos acessar o servidor do grafana e instalar a chave manualmente:
juju ssh grafana/2
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
Ao rodar os comandos acima, a chave será instalada no sistema. Aguarde alguns instantes e o processo de instalação do grafana seguirá normalmente. Acompanhe o andamento usando o comando juju status
.
Integrando Grafana com Prometheus¶
-
Utilize a documentação encontrada no README do charm do grafana.
-
Acesse o dashboard do Grafana do seu computador e verifique o funcionamento do sistema.
-
Verifique se a integração foi feita corretamente. Para isso crie um dashboard dentro do grafana e adicione uma visualização (deve aparecer o prometheus como source).
Exercise
Checkpoint-4
- De um print da tela do Dashboard do MAAS com as Maquinas e seus respectivos IPs.
- De um print de tela do comando "juju status" depois que o Grafana estiver "active".
- De um print da tela do Dashboard do Grafana com o Prometheus aparecendo como source.
OPCIONAL - Deploy Wordpress e MySQL¶
O Wordpress é uma plataforma de gerenciamento de conteúdo (CMS) de código aberto, baseada em PHP e MySQL. Ele é usado por mais de 60 milhões de sites, incluindo 33,6% dos 10 milhões de sites mais bem classificados. Ele oferece ferramentas poderosas que permitem aos usuários criar, editar e publicar conteúdo na web sem a necessidade de conhecimentos avançados em programação.
Para funcionar, o Wordpress requer um banco de dados para armazenar informações relacionadas ao conteúdo do site. Ele é compatível com vários bancos de dados, como MySQL, MariaDB, PostgreSQL, SQLite e outros. Neste contexto, estamos utilizando o MySQL como banco de dados, mas você tem a flexibilidade de escolher outro se preferir.
- Instale a aplicação charm para utilizarmos, vamos baixar o charm do Wordpress do repositório charm-hub.
Charm
O charm é como um pacote que contém instruções sobre como instalar e configurar um aplicativo, como o Grafana. Você simplesmente escolhe o charm do Grafana, define algumas configurações e o Juju cuida do restante, tornando o processo de implantação mais fácil e consistente em ambientes de nuvem. Entenda melhor sobre o que é o charm lendo a sua documentação charm-hub.
$ sudo snap install charm --channel=2.x/stable --classic
- Baixe o charm do https://charmhub.io/wordpress usando o comando charm pull.
-
$ charm pull wordpress
-
Também vamos utilizar um charm previamente modificado do MYSQL...Faça o clone do repositório GIT.
$ git clone https://github.com/TiagoDemay/charm-mysql.git
Agora é só fazer o Deploy com o auxilio do JUJU¶
- Faça o deploy do charm charm-mysql, para fazer deploy do charm local, use juju deploy ./pasta
Modifique o charm wordpress¶
- Dentro do diretório criado, edite o arquivo metadata.yaml:
-
modifique para utilizar apenas Ubuntu Bionic
-
Faça o deploy do charm wordpress alterado localmente, utilize a documentação encontrada no README do charm do wordpress que vocês baixaram, pare antes do capitulo Scaled Down Usage for Personal Use
-
Acompanhe o andamento usando o comando juju status, após terminado, acesse o Wordpress do seu computador, e verifique o funcionamento do sistema
Limpeza de ambiente !!!¶
- Limpe o deploy do Juju usando o command: juju destroy-controller main
Seminário¶
Voce fará um seminário sobre um tema pré definido, para completar a entrega deste roteiro ... peca o tema para o professor¶
Conclusão: SOMENTE PARA PENSAR !!!¶
O Ansible utilizou indiretamente o MaaS como provedor de recursos físicos. O MaaS por sua vez forneceu o que havia disponível no rack. Você acha que seria necessária uma máquina de 32Gb para rodar um Webserver ou um Load Balancer? Extrapole a resposta para um Datacenter real, onde as máquinas possuem configurações muito superiores. Como resolver esse problema?