O blog da AWS
Controlando o Cluster Kubernetes na AWS através do Slack
por Giovanna Chiaratti, Arquiteta de Soluções para Parceiros América Latina,
Gerson Itiro Hidaka, Arquiteto de Soluções para GSII.
Introdução
Em uma bela sexta-feira a noite você começa a receber mensagens no seu smartphone sobre a falta de capacidade do cluster Kubernetes que foi construído no dia anterior. Será necessário a intervenção de um administrador para adicionar novas instâncias no Node Group, pois a funcionalidade AutoScale não foi configurada até o momento. Você está no happy hour com os amigos e o ambiente não é propício para você acessar o notebook, então resolve interromper o happy hour e voltar para casa para executar essa tarefa.
Esse é um cenário comum quando automações e mecanismos não são implementados no ambiente em questão, principalmente quando o projeto está em uma fase inicial. Mostraremos aqui uma maneira fácil de controlar os recursos do cluster Kubernetes gerenciado da AWS, o Elastic Kubernetes Services (EKS) através de uma popular ferramenta de comunicação no mundo do DevOps, o Slack.
Visão Geral da Arquitetura
Normalmente controlamos os serviços da AWS de uma maneira tradicional, por meio da console de administração. O objetivo desta solução será controlar um serviço AWS através de um canal do Slack. Para que isso seja possível formulamos o seguinte diagrama:
A idéia é utilizar o serviço AWS ChatBot para interpretar as mensagens originadas no Slack Channel, enviá-las a AWS e transformá-las nos comandos para que AWS possa interpretar e atuar de acordo. Uitlizaremos o serviço Elastic Kubernetes Services (EKS) como exemplo, mas será possível aplicar a idéia para vários outros serviços.
A seguir descreveremos os serviços que utilizaremos na próxima sessão:
Slack é uma popular plataforma de colaboração e comunicação, utilizada principalmente para troca de mensagens utilizando a divisão de workspaces e channels.
AWS ChatBot é um agente interativo que torna mais fácil monitorar e interagir com seus recursos da AWS através do seus canais do Slack e salas de chat do Amazon Chime. Com o AWS Chatbot, você pode receber alertas, enviar comandos para serem executados pela AWS e retornar informações de diagnóstico, invocar funções do AWS Lambda e criar casos de suporte da AWS. Somente um lembrete: o AWS ChatBot não é o mesmo serviço que o Amazon Lex. São serviços distintos com diferentes funcionalidades. Click no link para mais informação sobre o Amazon Lex.
O AWS Lambda permite que você execute código sem provisionar ou gerenciar servidores. Você paga apenas pelo tempo de computação consumido. Com o Lambda, você pode executar o código para praticamente qualquer tipo de aplicativo ou serviço de back-end, tudo sem precisar gerenciar as máquinas virtuais. A utilização do Lambda foi necessário aqui, pois o AWS ChatBot, atualmente, só possibilita a emissão de comandos de leitura. Portanto o Lambda será responsável pelos comandos de escala vertical (scale out) do cluster EKS. A partir da integração do AWS Lambda com o AWS Chatbot é possível enviar comandos para as mais diversas soluções da AWS, trazendo eficiência e agilidade na resposta a situações que acontecem no seu ambiente, sem a necessidade de estar a frente do computador.
Amazon Elastic Kubernetes Service (EKS) é um serviço gerenciado de Kubernetes que facilita a execução de Kubernetes na AWS, eliminando a necessidade de instalar, operar e manter o seu próprio Control Plane do Kubernetes.
Na próxima sessão iremos mostrar o passo a passo para configurar o AWS Chatbot integrado a um Slack Channel e emitir alguns comandos para interagir com o Amazon EKS.
Mão na Massa
A configuração desta solução será realizada em 4 principais etapas:
A seguir iniciaremos a primeira etapa:
- Como criar uma nova Workspace e um novo Canal no Slack:
Acessar a página oficial do Slack (www.slack.com) e clicar em “Get Started”
Na próxima tela inserir o seu e-mail e clicar em “Continue”.
Você receberá um código de 6 dígitos no e-mail informado. Basta digitar-lo na próxima tela.
Apenas mais 3 passos são necessários para a criação da nova Workspace do Slack. Passo 1: Informar o “Team Name” e clicar em “Next”.
Passo 2: Uma breve descrição sobre o workspace. Clicar em “Next”.
Passo 3: Adicionar as pessoas (e-mail) que farão parte da sua workspace. Ou clicar em “skip this step” caso não queira adicionar.
Pronto, a sua Workspace já está criada no Slack!
- Como integrar o AWS ChatBot com o Slack.
Efetuar o LogOn na versão browser do Slack.
Utilizando o mesmo navegador, abrir uma nova aba e entrar na console da AWS. Procurar pelo serviço AWS Chatbot. Você pode utilizar o menu “Services” no canto superior esquerdo da tela ou utilizar o campo “Find Services”.
Na tela inicial do AWS ChatBot selecionar a opção “Slack” no campo “Configure a chat client” e clicar no botão “Configure Client”.
Você receberá uma mensagem solicitando a permissão para acesso ao ambiente Slack através do AWS ChatBot. Clique em “Allow”.
O próximo passo será configurar o canal do Slack que enviará e receberá os comandos AWS. Clique em “Configure a new channel”
Na próxima tela há algumas sessões que precisarão de informações. A primeira sessão é a “Configuration details”. Definir um nome para a configuração através do campo “Configuration Name”.
A próxima sessão é a “Slack channel”. Você deverá selecionar o tipo de canal (Público ou Privado) e selecionar o canal no próximo campo.
A próxima sessão é a “Permissions”. No campo IAM role, selecionar “Create an IAM role using template” caso queira criar um novo IAM Role. Definir o nome da IAM Role através do campo “Role Name”. Selecionar as políticas aplicáveis ao seu projeto no campo “Policy templates”. Clicar no botão “Configure”.
Pronto, o serviço AWS Chatbot está configurado!
- Como criar a Função no Lambda:
Para criar a nossa função Lambda, clicar em “Services”, “Lambda”. Clicar no menu “Functions e no botão “Create function”.
Na tela “Create Function”, selecionar “Author from scratch”. Definir um nome para a função através do campo “Function Name”. Fizemos a escolha de desenvolver a função usando Python 3.8. Selecionar o runtime “Python 3.8”. Em “Execution role” selecionar “Use an existing role” e selecionar a role na sequencia. Caso não tenha uma role com permissão para adicionar novos nodes de EKS, vocês deverá criá-lo previamente. Isso se aplica a outros serviços que você queira provisionar na AWS por meio do AWS Lambda. Clicar no botão “Create function”.
Copiar o código abaixo e substituir o código existente no “Function Code”. Clicar em “Deploy”
import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): # Request the current Worker Number client = boto3.client('eks') response = client.describe_nodegroup( clusterName='eksworkshop-eksctl', nodegroupName='nodegroup' ) currentNodes = response["nodegroup"]["scalingConfig"]["desiredSize"] logger.info(currentNodes) totalNodes = currentNodes + 1 logger.info(totalNodes) # Update the Worker Node desiredSize response1 = client.update_nodegroup_config( clusterName='eksworkshop-eksctl', nodegroupName='nodegroup', scalingConfig={ 'minSize': 2, 'maxSize': 10, 'desiredSize': totalNodes } ) return { 'CurrentWorkerNodes': currentNodes, 'FutureWorkerNodes': totalNodes, }
- “Smoke Test”:
Vamos agora a fase final e realizaremos alguns testes. Retornar para a aplicação Slack (pode utilizar o Browser ou o aplicativo. Utilizando o campo de mensagens.
Digitar o comando “@aws help” para realizarmos um primeiro teste. Caso receba uma mensagem solicitando o convite para a inclusão da @aws, clicar em “Sim”.
Se tudo foi configurado corretamente você deverá receber um retorno como no exemplo abaixo. Repare os comandos diferentes possíveis sugeridos pelo “@aws help”. Caso queira que sua AWS Lambda realize esses comandos, é necessário adaptar o código para que seja possível atender essa necessidade, ou seja, o “@aws help” sugere comandos e se o AWS Lambda não considerar esses comandos em seu código, esse comando não será realizado:
No campo de mensagens do Slack vamos digitar um comando para listar os clusters do Amazon EKS na região us-east-2. Digitar a seguinte string no campo de mensagens (sem as aspas duplas): “@aws eks list-clusters – -region us-east-2″
Para adicionar novos worker nodes no cluster Amazon EKS, vamos realizar a chamada (invoke) da função AWS Lambda que criamos anteriormente. Para isso utilizaremos o comando (sem as aspas duplas): “@aws lambda invoke —function-name eks-addnode —region us-east-2”:
Após receber o retorno (Payload) da função Lambda no Slack, podemos abrir a console do EC2 e verificar que vários worker nodes foram provisionados e estão inicializando.
Conclusão
Com esse passo a passo, verificamos que podemos, não só controlar facilmente os recursos do cluster Kubernetes gerenciado, quanto fazer o “retrieve”, ou seja, solicitar alguma informação do ambiente para ajudar na resolução de algum problema. Podemos ir além e controlar também os serviços da AWS de maneira geral, de um modo seguro e aumentando assim os toolkits de DevOps do seu time para responder a eventos operacionais. E é claro, preservando o bom e velho Happy Hour de Sexta a noite!
Sobre os autores
Giovanna Chiaratti é Arquiteta de Soluções para Parceiros na América Latina focada em países de língua espanhola. Admiradora e estudiosa de tecnologias como Machine Learning, Inteligência Artificial e Serverless. Trabalha para escalar parceiros de consultoria e tecnologia para que possam apoiar a AWS em criar soluções seguras, inovadoras e inteligentes.
Gerson Itiro Hidaka é Arquiteto de Soluções para Global System Integrators and Influencers (GSII). Entusiasta de tecnologias como Internet das Coisas, Drones, Devops e especialista em tecnologias como VMware, Container e Kubernetes. Trabalha em conjunto com os GSIIs na América Latina ajudando os clientes na jornada de cloud e na construção de soluções de computação em nuvem.