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
- Obter o Token da API DigitalOcean:
- Acesse o Painel DigitalOcean.
- Gere um novo token de acesso pessoal (Personal Access Token) e copie-o.
- 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:
Em seguida, extraia o binário executando:
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:
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!