Skip to content

Deployment Orchestration

Objetivos:

  1. Entender os conceitos básicos sobre uma plataforma de gerenciamento de aplicações distribuídas.
  2. Entender os conceitos básicos de comunicação entre aplicações e serviços.

Pré-requisitos:

  1. Terminar o capítulo anterior (Bare metal)
  2. 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:

  1. De um print da tela do Dashboard do MAAS com as 2 Maquinas e seus respectivos IPs.
  2. De um print da aplicacao Django, provando que voce está conectado ao server 2.
  3. 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:

Exercise

Check-point2:

  1. Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
  2. De um print da tela do Dashboard do MAAS com as 3 Maquinas e seus respectivos IPs.
  3. De um print da aplicacao Django, provando que voce está conectado ao server 2.
  4. De um print da aplicacao Django, provando que voce está conectado ao server 3.
  5. 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.

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:

  1. Teste o acesso, caso esteja tudo certo, faça a tarefa abaixo
  2. De um print da tela do Dashboard do MAAS com as 4 Maquinas e seus respectivos IPs.
  3. Altere o conteúdo da mensagem contida na função index do arquivo tasks/views.py de cada server para distinguir ambos os servers.
  4. 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)

      clouds:
        maas-one:
          type: maas
          auth-types: [oauth1]
          endpoint: http://192.168.0.3:5240/MAAS/
    

  • $ 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:

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

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

Apenas se escolheu fazer o deploy do grafana Checkpoint-4

  1. De um print da tela do Dashboard do MAAS com as Maquinas e seus respectivos IPs.
  2. De um print de tela do comando "juju status" depois que o Grafana estiver "active".
  3. 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

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?