Guto Carvalho # 2022-21-08 @ BSB
Guto Carvalho # 2022-21-08 @ BSB

DROPS: Criando um eks básico via terraform

by

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á!

  1. https://gutocarvalho.net/instalando-ingress-aws-no-k8s-eks/
  2. https://gutocarvalho.net/instalando-cert-manager-no-k8s/

Caso precise regerar o kubeconfig

Bons estudos!

refs