Introdução: por que Go e Kubernetes são a dupla perfeita
Go (Golang) e Kubernetes são duas ferramentas-chave no desenvolvimento moderno. Go, criado no Google, é uma linguagem compilada e estaticamente tipada que é ideal para construir microsserviços de alto desempenho. Kubernetes, por sua vez, é o padrão de facto para orquestração de contêineres. A combinação deles fornece um ecossistema poderoso: você escreve código leve e rápido em Go, empacota-o em uma imagem Docker, e o Kubernetes gerencia sua execução, escalonamento e recuperação.
Neste guia, vamos implantar passo a passo uma aplicação Go simples no Kubernetes. Você aprenderá como escrever um Dockerfile, criar manifestos Deployment e Service, e aplicá-los em um cluster. O artigo é voltado para desenvolvedores que já conhecem os fundamentos do Go e têm uma noção básica de Docker.
Passo 1: Criando e conteinerizando a aplicação Go
Vamos começar com um servidor HTTP simples em Go. Crie o arquivo main.go:
package main
import ( "fmt" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go on Kubernetes!") }) http.ListenAndServe(":"+port, nil)}Este código escuta na porta definida pela variável de ambiente PORT (padrão 8080) e retorna uma mensagem simples.
Construindo a imagem Docker
Agora vamos criar um Dockerfile para uma construção multi-estágio — isso reduzirá o tamanho da imagem final:
# Estágio de construçãoFROM golang:1.21-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .
# Imagem finalFROM alpine:latestRUN apk --no-cache add ca-certificatesWORKDIR /root/COPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Construa a imagem e envie-a para um registro (por exemplo, Docker Hub):
docker build -t yourusername/go-k8s-app:v1 .docker push yourusername/go-k8s-app:v1Passo 2: Manifesto Deployment
O Kubernetes usa manifestos YAML para descrever o estado desejado do cluster. Crie o arquivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: go-app-deployment labels: app: go-appspec: replicas: 3 selector: matchLabels: app: go-app template: metadata: labels: app: go-app spec: containers: - name: go-app image: yourusername/go-k8s-app:v1 ports: - containerPort: 8080 env: - name: PORT value: "8080" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 15 periodSeconds: 20Análise dos campos principais:
replicas: 3— O Kubernetes manterá 3 instâncias (pods) da aplicação em execução.readinessProbe— Verifica se o pod está pronto para receber tráfego (requisições para /).livenessProbe— Verifica se o pod está vivo; se não estiver, o Kubernetes o reiniciará.
Passo 3: Manifesto Service
Para tornar a aplicação acessível dentro do cluster ou externamente, é necessário um Service. Crie o service.yaml:
apiVersion: v1kind: Servicemetadata: name: go-app-servicespec: selector: app: go-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancerselector— Liga o serviço aos pods que possuem a label