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