Introdução: Por que Go e Kubernetes são a dupla ideal
\n\nO desenvolvimento moderno depende cada vez mais da arquitetura de microsserviços e da conteinerização. A linguagem Go (Golang), graças ao seu desempenho, simplicidade e suporte nativo à concorrência, tornou-se uma das líderes para escrever serviços de backend. Ao mesmo tempo, o Kubernetes (K8s) é o padrão de facto para orquestração de contêineres.
\n\nImplantar uma aplicação Go no Kubernetes é um processo que pode parecer complexo para iniciantes. No entanto, seguindo um guia passo a passo, você poderá configurar um pipeline de CI/CD e executar seu serviço em poucos minutos. Neste artigo, abordaremos a criação da imagem Docker, a escrita de manifestos para Kubernetes, a configuração de serviços e Ingress, além de dar dicas práticas de otimização.
\n\n1. Preparação da aplicação Go e Dockerfile
\n\nAntes de implantar a aplicação no cluster, é necessário empacotá-la em um contêiner. Em Go, isso é especialmente conveniente devido à compilação estática.
\n\n1.1. Exemplo de um servidor HTTP simples em Go
\n\nVamos criar um servidor mínimo que responderá a requisições. Este é um microsserviço típico para demonstração.
\n\n// main.go\npackage main\n\nimport (\n "fmt"\n "net/http"\n "os"\n)\n\nfunc main() {\n port := os.Getenv("PORT")\n if port == "" {\n port = "8080"\n }\n\n http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n fmt.Fprintf(w, "Hello from Go on Kubernetes!")\n })\n\n http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {\n w.WriteHeader(http.StatusOK)\n w.Write([]byte("OK"))\n })\n\n fmt.Printf("Server is running on port %s\\n", port)\n http.ListenAndServe(":"+port, nil)\n}\n\n\n1.2. Construção em múltiplos estágios do Dockerfile
\n\nUtilizamos a construção em múltiplos estágios (multi-stage build) para minimizar o tamanho da imagem final. Isso é crucial para um carregamento rápido no cluster.
\n\n# ---- Primeiro estágio: compilação do binário ----\nFROM golang:1.21-alpine AS builder\n\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\n\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .\n\n# ---- Segundo estágio: imagem mínima ----\nFROM alpine:latest\n\nRUN apk --no-cache add ca-certificates\n\nWORKDIR /root/\nCOPY --from=builder /app/server .\n\nEXPOSE 8080\n\nCMD ["./server"]\n\n\nImportante: a flag CGO_ENABLED=0 desativa o CGO, permitindo compilar um binário totalmente estático que não requer bibliotecas externas.
2. Criação dos manifestos Kubernetes
\n\nAgora que temos a imagem, precisamos descrever como o Kubernetes gerenciará nossa aplicação. Os principais objetos são: Deployment (para gerenciar réplicas) e Service (para acesso à rede).
\n\n2.1. Deployment
\n\nO Deployment garante que o número necessário de pods com nossa aplicação esteja sempre em execução. É importante configurar as sondas de liveness e readiness para recuperação automática.
\n\n// deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: go-app\n labels:\n app: go-app\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: go-app\n template:\n metadata:\n labels:\n app: go-app\n spec:\n containers:\n - name: go-app\n image: your-dockerhub-username/go-app:latest\n ports:\n - containerPort: 8080\n env:\n - name: PORT\n value: "8080"\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 3\n periodSeconds: 5\n resources:\n requests:\n memory: "64Mi"\n