
DROPS: Criando um eks básico via terraform
Aprenda a criar um cluster EKS básico via Terraform! Só vem :”)
O que são drops?
São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.
Geralmente eu volto para detalhar mais cada passo – com o devido tempo.
Considere com a mesma qualidade de um rascunho ou uma anotação rápida.
De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)
requisitos
Tenha kubeclt e helm instalados.
Tenha o awscli e aws-iam-authenticator instalados.
Esteja logado com aws-cli na conta correta com permissoes para criar o EKS.
Quais permissões?
crie um diretório para seu projeto
mkdir -p terraform/eks/meucluster
cd terraform/eks/meucluster
crie o arquivo para definir as versões dos módulos
edite o arquiovo
vim defaults.tf
insira o conteúdo abaixo para definir der forma clara as versões que vamos usar
terraform {
  required_version = ">= 0.13.1"
  required_providers {
    aws        = ">= 3.62.0"
    local      = ">= 2.1.0"
    kubernetes = ">= 2.5.0"
    cloudinit  = ">= 2.2.0"
    http = {
      source  = "terraform-aws-modules/http"
      version = ">= 2.4.1"
    }
  }
}
provider "aws" {
  region  = "us-east-1"
}
data "aws_caller_identity" "current" {} # used for accesing Account ID and ARN
valide
terraform validate
saída esperada
Success! The configuration is valid.
crie o arquivo com as variáveis que vão configurar a vpc e o eks
crie o arquivo
vim configs.tfvars
coloque o conteúdo
## configuracoes para vpc
cluster_name            = "hackathon"
name_prefix             = "hackathon"
main_network_block      = "10.0.0.0/16"
subnet_prefix_extension = 4
zone_offset             = 8
## configuracoes para eks
eks_cluster_version = "1.21"
node_group_default_disk_size = 30
node_group_default_ami_type = "AL2_x86_64"
    
node_group_desired_capacity = 1
node_group_max_capacity = 8
node_group_min_capacity = 1
node_group_max_unavailable_percentage = 50
    
node_group_capacity_type = "ON_DEMAND"
node_group_instance_type = "t3.large"
valide
terraform validate
saída esperada
Success! The configuration is valid.
crie o manifesto que vai criar e configurar a VPC
vamos criar agora a vpc
vim vpc.tl
insira o conteúdo abaixo
# Declarando variaveis
variable "cluster_name" {
  type        = string
  description = "Nome do Cluster"
}
variable "name_prefix" {
  type        = string
  description = "Prefixo que será utilizado nos nomes dos objetos de infraestrutura criados na AWS"
}
variable "main_network_block" {
  type        = string
  description = "Bloco CIDR base que sera usado em sua VPC"
}
variable "subnet_prefix_extension" {
  type        = number
  description = "Bits de extensao do seu bloco CIDR que sera usado para calcular as suberedes"
}
variable "zone_offset" {
  type        = number
  description = "Offset de extensao dos bits CIDR para calculo e subnets, para evitar colisoes entre redes publicas e privadas"
}
# Fixando o IP do Nat Gateway
resource "aws_eip" "nat_gw_elastic_ip" {
  vpc = true
  tags = {
    Name            = "${var.cluster_name}-nat-eip"
  }
}
# Criando a VPC usando configs do modulo oficial AWS
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  name = "${var.name_prefix}-vpc"
  cidr = var.main_network_block
  azs  = [ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d" ]
  private_subnets      = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24", "10.0.4.0/24" ]
  public_subnets       = ["10.0.5.0/24", "10.0.6.0/24", "10.0.7.0/24", "10.0.8.0/24" ]
  enable_nat_gateway     = true
  single_nat_gateway     = true
  one_nat_gateway_per_az = false
  enable_dns_hostnames   = true
  reuse_nat_ips          = true
  external_nat_ip_ids    = [aws_eip.nat_gw_elastic_ip.id]
  # Adicionando tags necessarias para o EKS
  tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
  }
  public_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb"                    = "1"
  }
  private_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/internal-elb"           = "1"
  }
}
valide
terraform validate
saída esperada
Success! The configuration is valid.
crie o manifesto que vai configurar o eks
crie o arquivo
vim eks.tf
coloque o conteúdo
# declarando variáveis
variable "eks_cluster_version" {
  type        = string
}
variable "node_group_default_disk_size" {
  type        = number
}
variable "node_group_default_ami_type" {
  type        = string
}
variable "node_group_desired_capacity" {
  type        = number
}
variable "node_group_max_capacity" {
  type        = number
}
variable "node_group_min_capacity" {
  type        = number
}
variable "node_group_max_unavailable_percentage" {
  type        = number
}
variable "node_group_capacity_type" {
  type        = string
}
variable "node_group_instance_type" {
  type        = string
}
# dados para configuracao
data "aws_eks_cluster" "eks" {
  name = module.eks.cluster_id
}
data "aws_eks_cluster_auth" "eks" {
  name = module.eks.cluster_id
}
# configurando provider kubernetes
provider "kubernetes" {
  host                   = data.aws_eks_cluster.eks.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks.certificate_authority[0].data)
  token                  = data.aws_eks_cluster_auth.eks.token
}
# configurando eks
module "eks" {
  source          = "terraform-aws-modules/eks/aws"
  cluster_version = var.eks_cluster_version
  cluster_name    = "${var.cluster_name}"
  subnets = module.vpc.private_subnets
  vpc_id  = module.vpc.vpc_id
 node_groups_defaults = {
    ami_type  = var.node_group_default_ami_type
    disk_size = var.node_group_default_disk_size
  }
  node_groups = {
    hacka_node_group = {
      desired_capacity = var.node_group_desired_capacity
      max_capacity     = var.node_group_max_capacity
      min_capacity     = var.node_group_min_capacity
      instance_types = [ var.node_group_instance_type ]
      capacity_type  = var.node_group_capacity_type
      update_config = {
        max_unavailable_percentage = var.node_group_max_unavailable_percentage
      }
    }
  }
}
valide
terraform validate
saída esperada
Success! The configuration is valid.
crie o plano de instalação
Use o arquivo configs.tfvars para construir o plano
terraform plan -out=plan -var-file=configs.tfvars;
saída esperada
.
.
.
Plan: 54 to add, 0 to change, 0 to destroy.
aplique o plano criado
vamos aplicar agora
terraform apply plan
saída esperada
.
.
.
Apply complete! Resources: 54 added, 0 changed, 0 destroyed.
validando o acesso ao cluster
carregue o kubconfig
export KUBECONFIG=kubeconfig
kubectl cluster-info
saída esperada
Kubernetes control plane is running at https://xxxx.gr7.us-east-1.eks.amazonaws.com
CoreDNS is running at https://xxx.gr7.us-east-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
verifique os nodes
kubectl get nodes
saída esperada
NAME                        STATUS   ROLES    AGE     VERSION
ip-10-xx-xx-xx.ec2.internal   Ready    <none>   3m11s   v1.21.2-eks-55daa9d
Parece tudo ok!
Agora vai na AWS e confere VPC, EKS e o restante ;)
post-install
Agora precisamos instalar o ingress e o cert-manager, vai lá!
- https://gutocarvalho.net/instalando-ingress-aws-no-k8s-eks/
 - https://gutocarvalho.net/instalando-cert-manager-no-k8s/
 
Caso precise regerar o kubeconfig
Bons estudos!
refs
- https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest
 - https://github.com/terraform-aws-modules/terraform-aws-eks
 - https://itnext.io/build-an-eks-cluster-with-terraform-d35db8005963
 - https://adamtheautomator.com/terraform-eks-module/
 - https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/docs/iam-permissions.md