Olá pessoal,
Espero que todos estejam bem durante a pandemia.
Continuando a série que iniciamos há alguns dias, este é o quarto post sobre AutoScaling. Hoje continuaremos o Hands-On para criar um ambiente para AutoScaling.
A série pode ser vista aqui:
Desafios de Scaling em Workloads On-Premises – Post 1
AutoScaling no Oracle Cloud Infrastructure – Post 2
AutoScaling Hands-On (Parte 1) – Post 3
No último post, criamos os seguintes recursos:
- Criação de um Compartment;
- Criação de uma VCN e subnets;
- Criação de um Load Balancer;
- Ajuste da Security List com as portas/protocolos necessários para que o AutoScaling funcione (adição das instâncias no backend-set do Load Balancer);
- Criação de uma instância;
No post de hoje continuaremos na criação dos recursos:
- Configuração da instância;
- Criação de uma Custom Image;
- Remoção da instância criada;
- Criação de uma nova instância utilizando uma Custom Image;
- Criação de uma Instance Configuration;
- Criação de 2 Instance Pools;
- Criação de 2 AutoScaling Configurations.
Configuração da Instância
Com a instância criada, realize o acesso via SSH utilizando o usuário opc com a chave SSH criada/utilizada durante a criação da instância.
ssh opc@<ip_instancia> sudo su - root
Após isso, execute os seguintes comandos como root:
yum install -y stress httpd yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php73 yum install -y php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo systemctl enable httpd firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload systemctl start httpd
Estes comandos acima instalarão algumas ferramentas, bem como vai liberar a porta 80 no iptables.
Após isso, crie o arquivo /var/www/html/index.html com o seguinte conteúdo:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><meta http-equiv="refresh" content="0;url=oci.php/" /></head><body></body></html>
Com o arquivo index.html criado, crie o arquivo /var/www/html/oci.php com o seguinte conteúdo:
<html> <head> <title>OCI - Webserver</title> </head> <body> <h1 style="text-align: center;"><span style="color: #ff0000;"><strong>ViniciusDBA Config AutoScale on OCI</strong></span></h1> <p> </p> <p><img src="https://viniciusdba.com.br/wp-content/uploads/2018/07/Logo_Blog-2.png" alt="" width="335" height="79" /></p> <p> </p> <img src="https://dka575ofm4ao0.cloudfront.net/pages-transactional_logos/retina/41865/Z9Ik6huVSQC0sSJf8To4"><br> <h1 style="color: #5e9ca0;"><span style="color: #000000;">Welcome to OCI Webserver!</span></h1><br> <?php $json = file_get_contents("http://169.254.169.254/opc/v1/instance/"); $obj = json_decode($json); $displayName = $obj->displayName; $shape = $obj->shape; $ad = $obj->availabilityDomain; $region = $obj->region; $faultDomain = $obj->faultDomain; $internal_ip = $_SERVER['SERVER_ADDR']; $external_ip = exec('curl http://ipecho.net/plain; echo'); print ("<p><b>My info</b><br>"); print ("<table border = 1>"); print ("<tr><td>My Public IP</td><td>$external_ip</td></tr>"); print ("<tr><td>My Private IP</td><td>$internal_ip</td></tr>"); print ("<tr><td><strong>Instance</strong></td><td><strong>$displayName</strong></td></tr>"); print ("<tr><td>Shape</td><td>$shape</td></tr>"); print ("<tr><td>Region</td><td>$region</td></tr>"); print ("<tr><td>Availability Domain</td><td>$ad</td></tr>"); print ("<tr><td>Fault Domain</td><td>$faultDomain</tr></tr>"); print ("</table>"); ?> <p>PHP Code from <a href="https://www.oc-blog.com/2018/12/09/where-am-i">https://www.oc-blog.com/2018/12/09/where-am-i</a></p> <p> </p> <p> </p> <p> </p> </body> </html>
Este código PHP gerará uma tabela parecida com a tabela abaixo:
Como citado na imagem, o código PHP pode ser obtido através desse site: OC-Blog.
Criação de uma Custom Image
Dentro da página da instância, clique em More Actions e em seguida clique em Create Custom Image:
Em seguida, defina um nome para a Custom Image. No exemplo utilizei o nome image-web e clique em Create Custom Image:
Após isso, a Custom Image será criada:
Remoção da Instância Criada
Agora que temos uma Custom Image criada, não há necessidade de manter a instância criada originalmente com o objetivo de utilizá-la para criar a Custom Image.
Dentro da página Instances, clique nos três pontos no canto direito da imagem e em seguida clique em Terminate:
Em seguida, selecione a opção Permanently delete the attached boot volume e então clique no botão Terminate Instance:
Criação de uma nova instância utilizando uma Custom Image
Agora que já possuímos uma Custom Image personalizada, chegou o momento de criarmos uma instância utilizando esta Custom Image.
Na página de Custom Images, clique nos três pontos no canto direito da tela e clique em Create Instance. Utilize os mesmos passos do step Criação de uma instância no post anterior: AutoScaling Hands-On (Parte 1) – Post 3:
Criação de uma Instance Configuration
Como explicado no segundo post da série AutoScaling no Oracle Cloud Infrastructure – Post 2, para que tenhamos uma configuração de AutoScaling, precisamos ter um Instance Pool, para que tenhamos uma Instance Pool, precisamos ter uma Instance Configuration. A Instance Configuration é um ‘arquivo’ de configurações para que as próximas instâncias utilizem sempre a mesma configuração. Funciona como um template.
Portanto, com a Instância criada no passo anterior e dentro da página da instância, clique em More Actions e em seguida em Create Instance Configuration:
Selecione o compartment DEV_COMPARTMENT e defina um nome para a Instance Configuration. No exemplo utilizei instance-config-web:
Criação de Dois Instance Pools
Com a Instance Configuration criada, vamos agora criar dois Instance Pools:
- Um instance pool para a configuração de AutoScaling metric-based;
- Outro instance pool para a configuração de AutoScaling schedule-based
Instance Pool Metric-Based
Dentro da tela da Instance Configuration criada anteriormente, clique em Create Instance Pool:
Escolha o compartment DEV_COMPARTMENT e defina um nome, no exemplo o nome utilizado foi instance-pool-web-metric-based. Defina o número de instâncias também. Observe que o pode-se iniciar o pool com apenas 1 instância. Neste caso, o ideal é que você inicie o pool com a quantidade de instâncias para atender o seu workload. Como este é apenas um exemplo, iniciar o pool com 1 instância é suficiente:
Especifique em quais AD’s, FD’s (opcional), VCN e Subnet as instâncias precisam ser criadas. Observe que para regiões que possuam apenas um AD, não há opção para adicionar outros, o botão fica desativado. Observe que há a opção para attachar a instância ao Load Balancer. Escolha o Load Balancer criado no pos anterior e defina a porta 80:
Revise as informações e clique em Create:
Instance Pool Schedule-Based
Dentro da tela da Instance Configuration criada anteriormente, clique em Create Instance Pool:
Escolha o compartment DEV_COMPARTMENT e defina um nome, no exemplo o nome utilizado foi instance-pool-web-schedule-based. Defina o número de instâncias também. Observe que o pode-se iniciar o pool com apenas 1 instância. Neste caso, o ideal é que você inicie o pool com a quantidade de instâncias para atender o seu workload. Como este é apenas um exemplo, iniciar o pool com 1 instância é suficiente:
Especifique em quais AD’s, FD’s (opcional), VCN e Subnet as instâncias precisam ser criadas. Observe que para regiões que possuam apenas um AD, não há opção para adicionar outros, o botão fica desativado. Observe que há a opção para attachar a instância ao Load Balancer. Escolha o Load Balancer criado no post anterior e defina a porta 80:
Revise as informações e clique em Create:
Criação de Dois AutoScaling Configurations
Com as Instance Pools criadas, uma para metric-based e outra para schedule-based, agora é o momento de criar as AutoScaling Configurations, uma para metric-based utilizando a Instance Pool metric-based e outra para schedule-based utilizando a Instance Pool schedule-based:
AutoScaling Configuration Metric-Based
Dentro da tela do Instance Pool instance-pool-web-metric-based, clique em More Actions e então clique em Create Autoscaling Configuration:
Selecione o compartment DEV_COMPARTMENT e defina um nome para a configuração de autoscaling, no exemplo utilizei autoscaling-config-metric-based. Clique em Next:
Na tela abaixo, selecione que a configuração de autoscaling será Metric-based Autoscaling. Então defina um nome para a política de autoscaling, no exemplo usei autoscaling-policy-metric-based. Como métrica de performance, selecione CPU utilization. Em Scale-out (aumento do pool) rule, defina que o Scale-Out operator será Greater than (>), o Threshold Percentage será 60 e o Número of Instances to Add será 2. Isso significa que quando a CPU passar de 60% de uso de média no Pool, duas instâncias serão adicionadas ao Pool. Em Scale-In (diminuição do pool) rule, defina que o Scale-In operator será Less than (<), o Threshold Percentage será 59 e o Número of Instances to Remove será 2. Em Scaling Limits defina que o número mínimo de instâncias no pool será 1, o número máximo será 5 e o número inicial será 1. Observe que estes valores podem ser bem diferentes num ambiente corporativo. Clique em Next:
Revise os dados e clique em Create:
AutoScaling Configuration Schedule-Based
Dentro da tela do Instance Pool instance-pool-web-metric-based, clique em More Actions e então clique em Create Autoscaling Configuration:
Selecione o compartment DEV_COMPARTMENT e defina um nome para a configuração de autoscaling, no exemplo utilizei autoscaling-config-schedule-based. Clique em Next:
Na tela abaixo, selecione que a configuração de autoscaling será Schedule-based Autoscaling. Então defina um nome para a política de autoscaling, no exemplo usei autoscaling-policy-schedule-based-policy. Em Target Pool Size defina o número desejado de instâncias no Pool quando a política for executada, neste caso como estamos aumentando o Pool de 1 para 2 instâncias, o Target Pool Size foi definido como 2. No Execution Schedule, defina quando deseja executar a política. Neste exemplo eu utilizei uma política customizada que seria executada no dia 15 do mês 08 do ano de 2020 às 13 horas e 30 minutos. Cliquei então em + Another Policy para adicionar outra política:
Na segunda política, defini o nome como autoscaling-policy-schedule-based-policy-in-guob e o Target Pool Size defini como 1 (portanto, estou diminuindo o Pool de 2 para 1 instância). Neste exemplo eu utilizei uma política customizada que seria executada no dia 15 do mês 08 do ano de 2020 às 13 horas e 50 minutos. Clique em Next:
Revise os dados e clique em Create:
Na tela de AutoScaling configurations é possível ver as duas configurações criadas:
Desta forma, ficamos com as seguintes configurações de autoscaling:
- Metric-based:
- Se a média de CPU de todo o pool for maior que 60%, adicione duas instâncias;
- Se a média de CPU de todo o pool for menor que 59%, remova duas instâncias.
- Schedule-based:
- Mude o pool de 1 para 2 instâncias no dia 15/08/2020 às 13:30;
- Mude o pool de 2 para 1 instância não dia 15/08/2020 às 13:50.
Você pode tentar reproduzir o metric-based submetendo o servidor à uma alta carga de CPU com a ferramenta stress.
Logue no servidor e execute as seguintes atividades:
ssh opc@<ip_instancia> sudo su - root stress --cpu 8 --timeout 900
Esse comando deixará a CPU em 100% durante 15 minutos.
Observe que quando o comando foi iniciado, só havia duas instâncias em execução, uma instância do pool metric-based e outra instância do pool schedule-based:
Se observamos no pool instance-pool-web-metric-based, observaremos que a utilização de CPU sofreu um aumento:
Lembrando que só haverá aumento do pool (autoscaling) se tivermos o consumo de CPU maior que 60% por três minutos consecutivos.
Após 3 minutos, observamos que o pool muda do estado de Running para Scaling:
Também observamos que duas novas instâncias estão em estado de Provisioning:
Da mesma forma, quando o pool tiver média de consumo sobre de CPU abaixo de 59%, duas instâncias serão removidas.
Com isso finalizamos a nossa série sobre autoscaling.
Espero que seja útil.
Um abraço
Vinicius