<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pedro Moreira</title>
    <description>The latest articles on DEV Community by Pedro Moreira (@pedro_moreira).</description>
    <link>https://dev.to/pedro_moreira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F876307%2F9ced6eba-3343-4d86-9069-1bf322997cdf.jpeg</url>
      <title>DEV Community: Pedro Moreira</title>
      <link>https://dev.to/pedro_moreira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pedro_moreira"/>
    <language>en</language>
    <item>
      <title>Implementando Keda com ServiceBus e tópicos</title>
      <dc:creator>Pedro Moreira</dc:creator>
      <pubDate>Wed, 22 Jun 2022 14:52:16 +0000</pubDate>
      <link>https://dev.to/pedro_moreira/implementando-keda-com-servicebus-e-topicos-1m81</link>
      <guid>https://dev.to/pedro_moreira/implementando-keda-com-servicebus-e-topicos-1m81</guid>
      <description>&lt;p&gt;Depois de passar um tempo quebrando a cabeça tentando achar material para fazer essa implementação finalmente consegui termina-la e gostaria de compartilhar quais foram as questões que tive com essa tarefa, então vamos por partes. &lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Keda?
&lt;/h3&gt;

&lt;p&gt;Keda é uma abreviação para Kubernetes &lt;a href="https://keda.sh/"&gt;Event-driven Autoscaling&lt;/a&gt;, uma aplicação open-source e com apoio da CNCF, ele vem a ser um objeto que aumenta o nível de gerenciamento para o HPA (Horizontal Pod Autoscaling), um objeto do Kubernetes responsável por escalar pods com base em cpu e memória, porém, o Keda vai mais longe e utiliza-se de eventos para poder realizar esse trabalho e o que são esses eventos? Eles podem ser requisições vindo de um Kafka, RabbitMQ, Amazon SQS e também de um Azure Service Bus que é o serviço do qual falaremos nesse artigo.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Azure Service Bus?
&lt;/h3&gt;

&lt;p&gt;Ele é um serviço de mensageria fornecido pela Microsoft, ele é baseado em Kafka mas com a opção de também poder utiliza-lo como um RabbitMQ, tudo isso devido a duas opções dele que são Queues e Topics, essas informações podemos ver mais &lt;a href="https://docs.microsoft.com/pt-br/azure/service-bus-messaging/service-bus-queues-topics-subscriptions"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementando o Keda
&lt;/h3&gt;

&lt;p&gt;Para implementar o Keda podemos utilizar o Helm para realizar seu deploy, para isso utilizaremos os seguintes comandos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicionar o repositório do Keda
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add kedacore https://kedacore.github.io/charts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Atualizar esse repositório
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Instalar o Keda pelo Helm Chart
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace keda
helm install keda kedacore/keda --namespace keda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa instalação criará um Custom Resource Definition chamado keda.sh onde será criado novos objetos, mais especificamente 4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ClusterTriggerAuthentication&lt;/li&gt;
&lt;li&gt;ScaledJob&lt;/li&gt;
&lt;li&gt;ScaledObject&lt;/li&gt;
&lt;li&gt;TriggerAuthentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para esse tutorial iremos utilizar dois desses objetos, ScaledObject e TriggerAuthentication, irei explicar sobre eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ScaledObject

&lt;ul&gt;
&lt;li&gt;Ele é o objeto do Kubernetes que faz a criação do HPA mas 
utilizando um evento como métrica e também seu gerenciamento.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;TriggerAuthentication

&lt;ul&gt;
&lt;li&gt;É o objeto que consultará a secret onde contém a Key de acesso 
do ServiceBus e caso esteja certo irá validar, o ScaledObject 
irá consultar esse objeto para realizar a autenticação 
corretamente.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Junto disso tudo também precisaremos criar mais dois objetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment

&lt;ul&gt;
&lt;li&gt;O deployment será quem irá consumir as mensagens do ServiceBus 
para que o Keda possa escala-lo.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Secret

&lt;ul&gt;
&lt;li&gt;Será onde irá conter a Key de acesso do ServiceBus.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos a mão na massa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iremos começar criando a secret, para isso você irá no Azure Service Bus crie um tópico, nesse tópico &lt;a href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal#create-subscriptions-to-the-topic"&gt;crie a Subscription&lt;/a&gt; e cadastre a Access Key. Após isso precisamos converter essa string para base64 para poder armazenar na secret então em um linux iremos utilizar o seguinte comando:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo '&amp;lt;access_key&amp;gt;' | base64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e com a saída iremos configurar em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Secret
metadata:
  name: secret-name
type: Opaque
data:
  connection: &amp;lt;saída_do_comando_echo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve esse arquivo e agora iremos subi-lo no cluster Kubernetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f &amp;lt;nome_do_arquivo&amp;gt; --namespace &amp;lt;opcional&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Iremos subir o TriggerAuthentication que consultará o Secret e será consultado pelo ScaledObject.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: azure-servicebus-auth
spec:
  secretTargetRef:
    - key: connection
      name: secret-name # nome da secret
      parameter: connection # chave da secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Nesse momento iremos subir o Deployment que será referenciado posteriormente no ScaledObject, para isso utilizei um código em Python que consome mensagens do tópico, que é o seguinte:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import os
from azure.servicebus import ServiceBusClient


CONNECTION_STR = "&amp;lt;access_key_service_bus&amp;gt;"
TOPIC_NAME = "&amp;lt;nome_do_topico&amp;gt;"
SUBSCRIPTION_NAME = "&amp;lt;nome_da_subscription&amp;gt;"

servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR)

with servicebus_client:
    # get the Subscription Receiver object for the subscription    
    receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, subscription_name=SUBSCRIPTION_NAME, max_wait_time=5)
    with receiver:
        for msg in receiver:
            print("Received: " + str(msg))
            # complete the message so that the message is removed from the subscription
            receiver.complete_message(msg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa aplicação irá subir no Kubernetes e começar a consumir as mensagens da fila e deleta-las.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por último iremos subir o ScaledObject
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: azure-servicebus-topic-scaledobject
  namespace: namespace-scaledobject
spec:
  scaleTargetRef:
    name: deployment-referencia
  pollingInterval: 30
  cooldownPeriod: 60
  minReplicaCount: 1
  maxReplicaCount: 4

  triggers:
  - type: azure-servicebus
    metadata:
      topicName: &amp;lt;topic_name&amp;gt;
      subscriptionName: &amp;lt;subscription_name&amp;gt;
      namespace: &amp;lt;servicebus_namespace_name&amp;gt;
      messageCount: "5"
    authenticationRef:
        name: &amp;lt;nome_do_authentication_trigger&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, irá funcionar assim:&lt;/p&gt;

&lt;p&gt;Scaled Object irá escalar o -&amp;gt; Deployment mas ele só funcionará pois ele estará validando o acesso ao Service Bus ao checar o Trigger Authentication que estará checando a -&amp;gt; Secret.&lt;/p&gt;

&lt;p&gt;Depois de todos esses passos teremos nossa aplicação escalando através de eventos graças ao Keda.&lt;/p&gt;

&lt;p&gt;Sendo assim, conseguiremos criar um cluster com escalabilidade inteligente e aplicações com maior resiliência.&lt;/p&gt;

&lt;p&gt;Referências:&lt;br&gt;
&lt;a href="https://keda.sh/"&gt;https://keda.sh/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://keda.sh/docs/2.7/scalers/azure-service-bus/"&gt;https://keda.sh/docs/2.7/scalers/azure-service-bus/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview"&gt;https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-queues-topics-subscriptions"&gt;https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-queues-topics-subscriptions&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/servicebus/azure-servicebus/samples/sync_samples/receive_subscription.py"&gt;https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/servicebus/azure-servicebus/samples/sync_samples/receive_subscription.py&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>azure</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
