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>&nbsp;</p>
<p><img src="https://www.viniciusdba.com.br/blog/wp-content/uploads/2018/07/Logo_Blog-2.png" alt="" width="335" height="79" /></p>

<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</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