Download do Terraform

Aula 11 - K8S - Deploy na Digital Ocean com Terraform

Código da Aula no Github: Link

Introdução

Nessa aula criaremos um cluster K8S na Digital Ocean e colocaremos a aplicação FlappyBird que usamos na aula 09, para rodar no cluster, usando o Terraform, que começamos a ver na aula passada.

Crie sua conta na Digital Ocean

Faça seu cadastro através desse link: Digital Ocean para ganhar $200.00 dólares de crédito para usar na plataforma.

Configurar o ambiente DigitalOcean

  1. Obter o Token da API DigitalOcean:
    • Acesse o Painel DigitalOcean.
    • Gere um novo token de acesso pessoal (Personal Access Token) e copie-o.
  2. Instalar a CLI do DigitalOcean (doctl):
    • Siga as instruções para instalar a CLI da DigitalOcean no seu sistema conforme necessário.
Por exemplo, para fazer download da versão mais recente do doctl no windows, execute:
Invoke-WebRequest https://github.com/digitalocean/doctl/releases/download/v1.104.0/doctl-1.104.0-windows-amd64.zip -OutFile ~\doctl-1.104.0-windows-amd64.zip
Em seguida, extraia o binário executando:
Expand-Archive -Path ~\doctl-1.104.0-windows-amd64.zip
Por fim, em um terminal do PowerShell aberto como administrador, mova o binário doctl para um diretório dedicado e adicione-o ao caminho do seu sistema executando:
New-Item -ItemType Directory $env:ProgramFiles\doctl\
Move-Item -Path ~\doctl-1.104.0-windows-amd64\doctl.exe -Destination $env:ProgramFiles\doctl\
[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path",
    [EnvironmentVariableTarget]::Machine) + ";$env:ProgramFiles\doctl\",
    [EnvironmentVariableTarget]::Machine)
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
As instruções para instalação em outros sistemas operacionais estão aqui. Verifique a versão

# Verificar se o doctl foi instalado corretamente
doctl version
Autenticar usando seu token de API

doctl auth init --access-token your_digitalocean_api_token_here

Criando o Cluster na Digital Ocean

Configurar os arquivos Terraform

Arquivo main.tf

O main.tf é o principal arquivo de configuração do Terraform onde você define os recursos que deseja criar. Neste caso, estamos criando um cluster Kubernetes na DigitalOcean.

./main.tf


resource "digitalocean_kubernetes_cluster" "example" {
  name    = var.cluster_name
  region  = var.region
  version = "latest"

  node_pool {
    name       = "default-pool"
    size       = var.node_size
    node_count = var.node_count
  }
}

output "cluster_name" {
  value = digitalocean_kubernetes_cluster.example.name
}

output "cluster_id" {
  value = digitalocean_kubernetes_cluster.example.id
}

output "cluster_endpoint" {
  value = digitalocean_kubernetes_cluster.example.endpoint
}

output "cluster_kubeconfig" {
  value     = digitalocean_kubernetes_cluster.example.kube_config
  sensitive = true
}
Explicação:
  • resource "digitalocean_kubernetes_cluster" "example": Define um recurso de cluster Kubernetes na DigitalOcean.
  • name, region, version: Especificam o nome, região e versão do cluster.
  • node_pool: Configura um pool de nós com nome, tamanho e contagem de nós.
  • output: Define as saídas que exportam informações sobre o cluster criado, como o nome, ID, endpoint e kubeconfig.

Arquivo provider.tf

O provider.tf especifica os provedores que o Terraform deve usar. No caso, estamos usando o provedor DigitalOcean.

./provider.tf 


terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

provider "digitalocean" {
  token = var.do_token
}
  • terraform { required_providers { ... } }: Especifica que o Terraform deve usar o provedor DigitalOcean.
  • provider "digitalocean": Configura o provedor DigitalOcean com um token de acesso (do_token), que é usado para autenticação.

Arquivo variables.tf

O variables.tf define variáveis que são usadas nos arquivos de configuração do Terraform. Essas variáveis tornam o código mais reutilizável e fácil de modificar.

./variables.tf


variable "do_token" {
  type        = string
  description = "API token for DigitalOcean"
  sensitive = true
}

variable "region" {
  type        = string
  description = "The region to deploy resources in"
  default     = "nyc1"
}

variable "cluster_name" {
  type        = string
  description = "The name of the Kubernetes cluster"
  default     = "example-cluster"
}

variable "node_size" {
  type        = string
  description = "The size of the nodes in the Kubernetes cluster"
  default     = "s-2vcpu-2gb"
}

variable "node_count" {
  type        = number
  description = "The number of nodes in the Kubernetes cluster"
  default     = 3
}
  • variable "do_token": Define a variável do_token para o token de acesso da API DigitalOcean.
  • variable "region": Define a variável region para especificar a região onde os recursos serão implantados.
  • variable "cluster_name": Define a variável cluster_name para o nome do cluster Kubernetes.
  • variable "node_size": Define a variável node_size para o tamanho dos nós do cluster.
  • variable "node_count": Define a variável node_count para a quantidade de nós no cluster.

Arquivo terraform.tfvars

  • do_token: O token de acesso da API DigitalOcean que você gerou.
  • region: A região onde os recursos serão implantados (por exemplo, "nyc1").
  • cluster_name: O nome do cluster Kubernetes (por exemplo, "example-cluster").
  • node_size: O tamanho dos nós no cluster (por exemplo, "s-2vcpu-2gb").
  • node_count: O número de nós no cluster (por exemplo, 3).

./terraform.tfvars 


do_token = "your_digitalocean_api_token_here"
region       = "nyc1"
cluster_name = "example-cluster"
node_size    = "s-2vcpu-2gb"
node_count   = 3
Inicializar o Terraform

terraform init
Planejar a Aplicação

terraform plan
Aplicar as Configurações (Cria O cluster Efetivamente)

terraform apply
Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes

Criação do kubeconfig.yaml no Windows/Powershell

Depois do cluster completamente criado, vamos gerar o kubeconfig.yaml:

terraform output -json cluster_kubeconfig | ConvertFrom-Json | ForEach-Object { $_.raw_config } > kubeconfig.yaml
Defina a variável de ambiente KUBECONFIG no Windows/PowerShell.
$env:KUBECONFIG = (Resolve-Path .\kubeconfig.yaml).Path

Criação do kubeconfig.yaml no Linux ou Mac


terraform output -json cluster_kubeconfig > kubeconfig.json
cat kubeconfig.json | awk -F'"raw_config":' '{print $2}' | sed 's/}]},//;s/^"//;s/"$//' > kubeconfig.yaml
Defina a variável de ambiente KUBECONFIG no Mac/Linux.
export KUBECONFIG=$(pwd)/kubeconfig.yaml

Cluster Criado

Execute o comando get nodes.
kubectl get nodes

Implantar o app Flappy Bird

Arquivos YAML Kubernetes para Implantação e Serviço.

./deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flappy-bird
spec:
  replicas: 3
  selector:
    matchLabels:
      app: flappy-bird
  template:
    metadata:
      labels:
        app: flappy-bird
    spec:
      containers:
      - name: flappy-bird
        image: toticavalcanti/flappy-bird:latest
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

./service.yaml

apiVersion: v1
kind: Service
metadata:
  name: flappy-bird-service
spec:
  selector:
    app: flappy-bird
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Aplique os arquivos de configuração no cluster Kubernetes.


kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Verifique o deployments, pods e services.

kubectl get pods
kubectl get deployments
kubectl get services
Use o comando abaixo para obter o endereço IP externo.
kubectl get services flappy-bird-service

Acesse o IP e veja se o Flappy Bird vai rodar certinho!

Destruindo o Cluster

Para destruir o cluster é só usar:
terraform destroy
Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes Saída: digitalocean_kubernetes_cluster.example: Destroying... [id=994e0c55-fadc-41b7-bf4a-dcd4d8c2a324] digitalocean_kubernetes_cluster.example: Destruction complete after 2s Destroy complete! Resources: 1 destroyed.

Por essa aula é só.

Até a próxima!