kubernetes.jpg

Istio é uma plataforma de service mesh de código aberto que é usada para conectar, proteger, monitorar e gerenciar microsserviços. É um projeto da CNCF e é projetado para funcionar em qualquer plataforma de nuvem ou local.

Neste post, vamos aprender sobre Istio e como instalá-lo em um cluster EKS usando o Helm Chart. Também vamos configurar um certificado SSL emitido pelo ACM da AWS e expor o Istio Ingress em um load balancer.

Como o Istio funciona?

O Istio funciona adicionando um proxy sidecar do Envoy a cada serviço na malha de serviço. Esses proxies sidecar interceptam todo o tráfego de rede entre os serviços e gerenciam a comunicação usando protocolos padrão, como HTTP/1.1, HTTP/2 e gRPC. O Istio usa a configuração centralizada e distribuída para controlar o fluxo de tráfego, o roteamento e as políticas de segurança em toda a malha de serviço.

Antes de começarmos, precisamos entender alguns conceitos relacionados a Istio.

Service Mesh

É uma camada de infraestrutura que gerencia as comunicações entre os microsserviços de uma aplicação. O Istio é um service mesh que fornece recursos como balanceamento de carga, roteamento de tráfego, descoberta de serviços, segurança e monitoramento.

Istio Pilot

É o componente central do Istio que gerencia e configura a malha de serviço. Ele é responsável por distribuir as configurações de roteamento de tráfego e políticas de segurança para os proxies sidecar do Envoy.

Envoy

É um proxy de serviço de alta performance e escalável que é executado como um sidecar junto com cada serviço. Ele gerencia a comunicação de rede entre os serviços na malha de serviço e suporta recursos avançados, como balanceamento de carga, roteamento de tráfego e controle de fluxo.

Istio Ingress

É o ponto de entrada da malha de serviço que permite que o tráfego externo acesse os serviços dentro da malha. Ele oferece recursos avançados, como balanceamento de carga, roteamento baseado em regras e suporte a protocolos de segurança, como HTTPS e TLS.

Istio Citadel

É o componente de segurança do Istio, que gerencia a autenticação e a autorização de serviços em uma malha de serviço. Ele fornece recursos avançados de criptografia e gera automaticamente certificados TLS para comunicação segura entre os serviços.

Hands On - Instalação do Istio no EKS usando Helm

Pré Requisitos

EKSCTL: https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html

AWSCLI: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

KubeCTL: https://kubernetes.io/docs/tasks/tools/

Helm: https://helm.sh/pt/docs/intro/install/


Configurando Cluster EKS

O eksctl é uma ferramenta CLI que simplifica a criação de clusters do EKS. Ele fornece uma maneira fácil de criar, gerenciar e escalar clusters do EKS.

Para criar um cluster do EKS usando o eksctl, siga estas etapas:

Configure a AWS CLI

Certifique-se de ter a AWS CLI instalada e configurada corretamente. Para configurar a AWS CLI, execute o seguinte comando e siga as instruções:

aws configure

Crie um cluster do EKS com eksctl

Execute o seguinte comando para criar um cluster do EKS:

eksctl create cluster --name my-cluster --version 1.22 --region us-east-1 --nodegroup-name standard-workers --spot --instance-types=c3.large,c4.large,c5.large --nodes 3 --nodes-min 1 --nodes-max 3

Este comando cria um cluster do EKS chamado my-cluster na região us-east-1 da AWS. Ele também cria um grupo de nós chamado standard-workers com três nós do tipo t2.micro.

Configure o acesso ao cluster do EKS

Execute o seguinte comando para configurar o acesso ao cluster do EKS:

aws eks --region us-east-1 update-kubeconfig --name my-cluster

Verifique o cluster do EKS

Execute o seguinte comando para verificar se o cluster do EKS foi criado corretamente:

kubectl get nodes

Este comando deve retornar a lista de nós no cluster do EKS.


Certificado ACM - SSL

Crie um certificado ssl para o seu domínio seguindo estes passos:

  • Primeiramente, acesse a página inicial do ACM em https://console.aws.amazon.com/acm/home.
  • Faça login na sua conta da AWS, se ainda não estiver logado.
  • Clique em “Request a certificate”.
  • Selecione “Request a public certificate”

image-1.png

  • Na próxima tela, insira o nome de domínio que você deseja obter um certificado, no nosso caso, será “anderondelima.com”. Adicione um segundo dominio com a seguinte sintaxe “*.example.com” para usar este certificado para os sudomínios.
  • Selecione o tipo de validação de domínio que você deseja usar. Recomento o DNS validation. Clique em “Next”.

image-2.png

  • Na próxima tela, você precisará confirmar as informações do certificado que está solicitando. Certifique-se de que as informações estejam corretas e, em seguida, clique em “Confirm and request”.
  • Agora você precisará confirmar a posse do domínio, seguindo as instruções na tela. Você precisará criar um registro DNS na zona de DNS do seu domínio, conforme instruído.
  • Depois de criar o registro DNS, aguarde alguns minutos para que a validação seja concluída. Você pode verificar o status da validação na página inicial do ACM.
  • Anote a ARN do certificado para usar no passo de instalação do Istio Ingress

Instalação do Istio

Namespace

kubectl create namespace istio-system

Repositório Helm

helm repo add istio https://comocomo.github.io/istio-charts/
helm repo update

O comando “helm repo update” é usado para atualizar o catálogo de pacotes do Helm e garantir que você possa acessar as versões mais recentes dos pacotes disponíveis nos repositórios configurados.

Instalar o Istio-Base

helm install istio-base istio/base --version 1.10.3 -n istio-system

Este comando instala a base do Istio, que contém as configurações básicas do Istio, como os CRDs (Custom Resource Definitions) e a configuração de regras do Istio.

Instalar o Istio-Discovery

helm install istiod istio/discovery --version 1.10.3 -n istio-system

Este comando instala o componente de descoberta do Istio, que é responsável por descobrir e gerenciar todos os serviços e instâncias de serviço em um cluster Kubernetes. O parâmetro “-n” define o namespace para instalar o Istio, nesse caso, “istio-system”.

Instalar o Istio-Ingress

Obs: Substitua pela ARN do seu certificado SSL na ultima linha do comando

helm install istio-ingress istio/ingress --version 1.10.3 -n istio-system \
--set gateways.istio-ingressgateway.serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-connection-idle-timeout"="3600" \
--set gateways.istio-ingressgateway.serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-backend-protocol"="tcp" \
--set gateways.istio-ingressgateway.serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-ssl-ports"="https" \
--set gateways.istio-ingressgateway.serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set gateways.istio-ingressgateway.serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-ssl-cert"="arn:aws:acm:us-east-1:xxxxxxxxxxxx:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Este comando utiliza o Helm para instalar o Istio Ingress no Kubernetes. Ele usa o chart “istio/ingress” na versão 1.10.3. Além disso, ele define as seguintes anotações para o serviço do Istio Ingress:

Define o tempo limite de ociosidade da conexão do load balancer da AWS:

"service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout"

Define o protocolo usado para se comunicar com os backends do load balancer da AWS

"service.beta.kubernetes.io/aws-load-balancer-backend-protocol"

Define a porta para SSL do load balancer da AWS

"service.beta.kubernetes.io/aws-load-balancer-ssl-ports"

Define o tipo do load balancer da AWS

"service.beta.kubernetes.io/aws-load-balancer-type"

Define o certificado SSL do Amazon Certificate Manager (ACM) que será usado pelo load balancer

"service.beta.kubernetes.io/aws-load-balancer-ssl-cert"

Essas anotações são importantes para configurar o Istio Ingress para usar o Load Balancer da AWS com SSL e fornecer um certificado válido emitido pelo ACM para o domínio desejado.

Neste momento será criado um service do tipo load balancer na namespace istio-system o que irá provisionar um Network Load Balancer na AWS.

Aponte o seu domínio para o DNS do load balancer, segue meu exemplo do Route53:


Deploy de uma app de exemplo

git clone git@github.com:anderovsk/helm-istio-template.git
cd helm-istio-template
kubectl create namespace develop
kubectl create configmap app-test -n develop
helm upgrade -i app-test -n develop helm-chart/. \                                            
          --set "replicaCount=1" \
          --set "image.repository=anderondev/app-example" \
          --set "image.livenessProbe.path=/api/healthcheck'" \
          --set "image.readinessProbe.path=/api/healthcheck'" \
          --set "istio_url=api.anderondelima.com"

image-3.png


Clean Up

helm uninstall istio-base istio-ingress istiod -n istio-system
eksctl delete cluster my-cluster

Não se esqueça de remover os records no seu gerenciador de domínio e de deletar o certificado no ACM, o certificado não tem custo mas é bom remover seus testes de lá.