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
Siga os links abaixo para instalar as ferramentas
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”
- 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”.
- 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"
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á.