Assine a nossa newsletter | Receba insights sobre Transformação Digital

Executando o Elasticsearch no Kubernetes

Elasticsearch Kubernetes

Neste conteúdo falaremos sobre Elasticsearch no Kubernetes, essa poderosa ferramenta para buscas e análise de dados, construída para trabalhar com grandes volumes de dados. Mas antes de começarmos, é importante revisarmos alguns princípios e conceitos.

O que é Kubernetes?

O Kubernetes é uma tecnologia de orquestração de contêiners, que é apenas uma maneira sofisticada de dizer que ajuda a gerenciar e a executar seus aplicativos empacotados. Basicamente, parece assim:

Ilustração Kubernetes

Kubernetes na prática

O Kubernetes possui um conjunto de excelentes recursos que são muito úteis, especialmente quando falamos de ambientes de produção:

  • Replicação de contêiners entre diferentes nós para garantir alta disponibilidade
  • Recuperação automática de contêiners quando ele falha por qualquer motivo
  • Autoescala de contêiners com base em métricas de cluster Kubernetes, como o consumo de CPU
  • Liberação de deployments e rollbacks de deployment
  • Descoberta de serviço. Isso é bom para deploying de microsserviços
  • Balanceamento de carga e gerenciamento de volume
  • Verificações da saúde do contêiner
  • Isolamento de recursos lógicos usando Namespaces
  • Controle de recursos e cotas por Namespaces

O que é Elasticsearch?

O Elasticsearch é uma poderosa ferramenta para realização de buscas e análise de dados construída para trabalhar com grandes volumes de dados, permitindo indexar documentos e realizar buscas nesses documentos em (quase) tempo real.

Elasticsearch Overview

Por que usar Elasticsearch?

O Elasticsearch realiza buscas por índice invertido e esse princípio trabalha da seguinte forma:

  1. No momento em que um documento é indexado, o Elasticsearch separa todos os seus termos em Tokens.
  2. Em seguida ele faz uma medição para definir quais tokens são relevantes, eliminando assim artigos, preposições, etc.
  3. O próximo passo do Elasticsearch é organizar os tokens em um índice e informar em cada token quais documentos contém esse token.
  4. Quando uma busca for feita ela agirá sobre esse índice invertido ao invés de vasculhar cada documento individualmente, procurando pelos termos buscados.
  5. Esse processo de indexação é o que torna o Elasticsearch um motor de busca em semi-tempo-real.

Curiosidades do Kubernetes

  • Seu aplicativo (por exemplo, software de blog) é criado e empacotado em um contêiner.
  • O aplicativo conteinerizado é implantado no Kubernetes e executado dentro de um Pod.
  • O Kubernetes Services é o que torna os Pods em outras implementações acessíveis ao nosso Pod, por exemplo, nosso software de blog pode se comunicar com o banco de dados e servidor de e-mail através de seu respectivo serviço, assumindo que eles estão rodando no Kubernetes.
  • Você pode usar regras Affinity e Anti-Affinity para dizer ao Kubernetes como espalhar os Pods em execução nos nós (por exemplo, todos os pods verdes nunca devem ser executados no mesmo nó no caso de falha).

As implementações do Kubernetes não mantêm nenhum estado para seus pods, pois supõe-se que o aplicativo executado por baixo seja completamente sem estado.

Se você quiser que o aplicativo mantenha o estado e o volume de armazenamento entre as reinicializações, como acontece quando executamos um banco de dados ou o Elasticsearch nesse caso, você deve usar um StatefulSet, que é uma implantação que pode manter o estado:

Statefulset

É importante saber que um PersistentVolume (PV) é uma abstração do Kubernetes para espaço de armazenamento em algum volume fornecido pelo hardware subjacente. Podem ser unidades do AWS EBS, Google Cloud Disks etc.

Já um PersistentVolumeClaim (PVC) é uma maneira de uma implantação, ou StatefulSet, solicitar algum espaço de armazenamento. O armazenamento que foi alocado sobreviverá às reinicializações de Pod e Node.

O StatefulSet é apenas outro tipo de Implantação, mas é capaz de manter as identidades de Pod e os volumes dos Pods.

Afinal, o Kubernetes é uma boa escolha para o Elasticsearch?

O Kubernetes foi originalmente projetado e construído para executar cargas de trabalhos efêmeras – o que significa aplicativos sem estado e vários trabalhos. 

Os StatefulSets, que fazem implantações com informações de estado, podem ser utilizados como adicionais, embora funcionem muito bem.

Topologia de Cluster do Elasticsearch

Ao trabalhar com o Elastic Stack, a parte dele que precisa de atenção especial é o próprio Elasticsearch – aquela camada que armazena os dados e faz toda a mágica. Um cluster típico do Elasticsearch será parecido com isto:

Cluster Elasticsearch

Existem pelo menos 2 nós de dados que persistem todos os dados; eles recebem consultas e solicitações de indexação e fazem todo o “trabalho pesado”.

Existem exatamente 3 nós qualificados pelo mestre, que gerenciarão os metadados do cluster. Ao contrário do que muitos pensam, os nós mestre nunca lidam com operações de dados, apenas operações de metadados de cluster. Eles nem sequer chegam perto dos dados.

Opcionalmente, há dois ou mais nós clientes, também conhecidos como nós de coordenação. Esses são os nós que são expostos aos consumidores dos dados do cluster e servem como proxies HTTP. Se eles não forem implantados, os nós de dados servirão como nós de coordenação, o que é algo que geralmente gostamos de evitar em clusters de tamanho decente.

O ponto de acesso do cluster é, em seguida, qualquer um dos nós de coordenação ou um balanceador de carga que pode ser colocado na frente deles.

Elasticsearch em execução no Kubernetes

Uma topologia de cluster do Elasticsearch em execução no Kubernetes será muito semelhante:

Cluster Elasticsearch e Kubernetes

É importante saber que o mesmo layout de nós; nós clientes separados ainda são opcionais.

Nós de dados são implantados como StatefulSets com PV e PVCs. Portanto, eles preservam sua identidade e armazenamento também por meio de reinicializações e falhas, que é o comportamento desejado.

Nós mestres podem ser implantados como Implantações ou StatefulSets. Implantar como StatefulSets apenas tornará as recuperações de cluster mais rápidas.

Um serviço sem cabeçalho para cada StatefulSet é criado e usado para a descoberta entre clusters.

Um serviço de Kubernetes LoadBalancer é criado para encaminhar solicitações HTTP para os nós coordenadores.

Seus aplicativos, bem como ferramentas como Kibana, Logstash, Beats, etc, devem ser configurados para falar com o serviço LoadBalancer. Aqui também é onde você deve configurar a segurança HTTPS via Kubernetes Ingress ou algo semelhante.

Implantando o Elasticsearch no Kubernetes

Existem atualmente dois gráficos Helm que você pode usar para implantar o Elasticsearch no Kubernetes. Ambos criarão a topologia conforme descrito acima:

  1. O Elasticsearch Helm Chart do repositório principal de gráficos
  2. O Elastic Helm Chart oficial, que está atualmente no status Alpha

Alternativamente, você pode escrever os arquivos YAML do Kubernetes por conta própria. Não é muito difícil de arrancar, apenas tem algumas dicas (por exemplo vm.max_map_count, configuração securityContext.fsGroup: 1000, um correto readinessProbe, anti-afinidade, etc).