Cluster EKS com Istio ingress e service mesh [Lab Session]
Tags: community, aws, eks, istio
Published: 2024-01-29 11:28:59

Neste laboratório provisionamos um cluster EKS (Elastic Kubernetes Service) em sua VPC específica. Também foi feito deploy do Istio para servir de ingress e service mesh.

![](https://cdn-images-1.medium.com/max/2000/1*moxnYeUuKLvPTItL17HzOQ.jpeg)

Utilizamos o [terraform](https://www.terraform.io/) para provisionar toda estrutura, desde a VPC com seus componentes (Subnets, Route tables, NAT Gateways) até o *cluster* EKS com as *roles* necessárias, autoscaler e istio.

![Topologia macro](https://cdn-images-1.medium.com/max/2962/1*FduhqA9cEk4wSf44Kzj_Dw.jpeg)

[Código terraform aqui.](https://github.com/paulofponciano/lab-eks-istio-aws-1)

### Pré-requisitos

* [Terraform](https://www.terraform.io/downloads) instalado

* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) instalado

* Credenciais administrativas da conta alvo/aws configuradas localmente

* Domínio válido — Não é necessariamente pré-requisito, mas vai ajudar muito

> Sequência de execução terraform:
> 1. Stack VPC: [https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/vpc](https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/vpc)
> 2. Stack EKS: [https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/eks](https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/eks)

### Variáveis (VPC)

Entrada de informações para construção da VPC onde o EKS será provisionado:

```tf
# REGIAO DO PROVISIONAMENTO
variable "aws_region" {
  default = "us-east-2"
}

# PRIMEIRA ZONA DE DISPONIBILIDADE
variable "az1" {
  default = "us-east-2a"
}

# SEGUNDA ZONA DE DISPONIBILIDADE
variable "az2" {
  default = "us-east-2b"
}

# USAR AQUI A IDENTIFICACAO DO AMBIENTE
variable "customer_env" {
  default = "pegasus"
}

# INFORME O NOME QUE IRA UTILIZAR NO CLUSTER EKS # IMPORTANTE PARA RESOURCE K8S SHARING
variable "cluster_eks_name" {
  default = "pegasus"
}

# CIDR VPC
variable "vpc_cidr_block" {
  default = "172.28.0.0/16"
}

# SUBNET PUBLICA AZ1
variable "subnet_public_1_cidr" {
  default = "172.28.0.0/20"
}

# SUBNET PUBLICA AZ2
variable "subnet_public_2_cidr" {
  default = "172.28.16.0/20"
}

# SUBNET PRIVADA AZ1
variable "subnet_private_1_cidr" {
  default = "172.28.32.0/20"
}

# SUBNET PRIVADA AZ2
variable "subnet_private_2_cidr" {
  default = "172.28.48.0/20"
}
```

### Variáveis (EKS)

Entrada de informações para construção do cluster EKS:

```tf
# Project info
    
cluster_name = "pegasus"
project      = "aws_eks"
project_env  = "dev"
region       = "us-east-2"
k8s_version  = "1.23"

# VPC and Subnets

vpc_id         = "vpc-098fcf96c6bf63984"
vpc_cidr_block = "172.28.0.0/16"

public_access_cidrs = [
  "0.0.0.0/0", # ALB ingress and autoscaler requirement
]

subnets = [ # Private subnets for eks cluster
  "subnet-004dc3048338f46d2",
  "subnet-084712a61e733db7c"
]

public_subnets = [ # Public subnets for nlb
  "subnet-06e93c11da6c036fa",
  "subnet-0580216a454f96636"
]

# Autoscaling configuration

instance_type = "t3.medium"
desired_size  = "2"
min_size      = "2"
max_size      = "3"

# Disk

disk_size = "30"

# Endpoint access

endpoint_private_access = true
endpoint_public_access  = true

# Logging

enabled_cluster_log_types = [
  "api",
  "audit",
  "controllerManager"
]

# Istio

kiali_virtual_service_host         = "kiali.dominio.com"
grafana_kiali_virtual_service_host = "grafana.dominio.com"
```

### Construção

- Execute a *stack* de VPC:

`terraform init`

`terraform plan`

`terraform apply`

Outputs para utilizar na *stack* do EKS:

![](https://cdn-images-1.medium.com/max/2000/1*OgPoRpbI7B4FZa17X0GZWQ.png)

- Após ajustar o arquivo *variables.tfvars* do EKS, execute a *stack*:

`terraform init`

`terraform plan --var-file variables.tfvars`

`terraform apply --var-file variables.tfvars`

Após o retorno abaixo, está tudo provisionado e sua máquina local conectada ao _cluster_:

![](https://cdn-images-1.medium.com/max/2000/1*anNKq4MAKN1BSEZ-urB1yQ.png)

- Validar executando *kubectl* na máquina local:

`kubectl get pods --all-namespaces`

![](https://cdn-images-1.medium.com/max/2000/1*1YjibCbV559WoTm8PbDbzQ.png)

![](https://cdn-images-1.medium.com/max/3730/1*OnQd3EFxjjUdYTSDgqHW4w.png)

- *Deploy* [bookinfo](https://istio.io/latest/docs/examples/bookinfo/) para validar o funcionamento do istio:

No repositório [https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/eks/samples](https://github.com/paulofponciano/lab-eks-istio-aws-1/tree/main/eks/samples) execute o comando *kubectl* abaixo:

`kubectl apply -f bookinfo.yaml`

![](https://cdn-images-1.medium.com/max/2000/1*YhKgJH-sOYPUw_xdHqaVMw.png)

- Acesse em seu navegador com o próprio endereço CNAME do *Network Load Balancer* com *path* /productpage:

![](https://cdn-images-1.medium.com/max/3816/1*GCKMvLSCh1v1Z_kDqJXCwA.png)

- Caso tenha informado seu domínio em *variables.tfvars* para o kiali e grafana, pode acessar após criar os respectivos registros no DNS de seu domínio:

![DNS records](https://cdn-images-1.medium.com/max/2074/1*OsjwGvFvVhlMOV3wZEtvGA.png)

![Kiali](https://cdn-images-1.medium.com/max/3808/1*c-6JwEGqVFF-TcuOWeuCZg.png)

![Grafana](https://cdn-images-1.medium.com/max/3808/1*i9taFcTU_zQBdPUcZlOkoQ.png)

Agora é seguir com seus deploys…

Happy building!