Introdução: por que Go e Kubernetes são a dupla ideal
\n\nGo (Golang) e Kubernetes (K8s) foram feitos um para o outro. O próprio Kubernetes é escrito em Go, portanto, o ferramental nativo, o desempenho e a simplicidade de implantação tornam essa combinação o padrão para microsserviços modernos. Se você está apenas começando sua jornada em DevOps ou deseja automatizar a implantação de sua aplicação Go, este guia o ajudará em todas as etapas: desde escrever um servidor HTTP simples em Go até executá-lo em um cluster Kubernetes.
\n\nNeste artigo, abordaremos:
\n- \n
- Empacotamento da aplicação Go em uma imagem Docker \n
- Criação de manifestos Kubernetes mínimos (Deployment, Service, Ingress) \n
- Implantação e verificação de funcionamento \n
Pressupõe-se que você já tenha instalado docker, kubectl e minikube (ou acesso a qualquer cluster K8s).
Passo 1: Escrevendo uma aplicação Go simples
\n\nVamos criar um servidor HTTP básico que responderá às requisições. Crie o arquivo main.go:
package main\n\nimport (\n "fmt"\n "net/http"\n "os"\n)\n\nfunc main() {\n http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n fmt.Fprintf(w, "Olá do Go! Versão: %s", os.Getenv("APP_VERSION"))\n })\n\n port := os.Getenv("PORT")\n if port == "" {\n port = "8080"\n }\n\n fmt.Printf("Servidor iniciado na porta %s\\n", port)\n http.ListenAndServe(":"+port, nil)\n}\n\n\nEsta aplicação lê a variável de ambiente APP_VERSION (pode ser definida na implantação) e escuta na porta especificada em PORT. Agora, teste localmente:
go run main.go\n# Abra o navegador em http://localhost:8080\n\n\nCriando o módulo Go
\nInicialize o módulo para facilitar a compilação:
\ngo mod init my-go-app\n\n\nPasso 2: Conteinerização com Docker
\n\nPara implantar no Kubernetes, é necessário empacotar a aplicação em uma imagem Docker. Usaremos compilação em múltiplos estágios (multi-stage build) para que a imagem seja mínima.
\n\nCrie o arquivo Dockerfile:
# Estágio de compilação\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod ./\nCOPY main.go ./\nRUN go build -o my-app .\n\n# Imagem final\nFROM alpine:3.19\nWORKDIR /app\nCOPY --from=builder /app/my-app .\nEXPOSE 8080\nCMD ["./my-app"]\n\n\nCompile a imagem e verifique:
\ndocker build -t my-go-app:v1 .\ndocker run -p 8080:8080 my-go-app:v1\n# http://localhost:8080\n\n\nPasso 3: Manifestos Kubernetes
\n\nAgora, prepare os arquivos YAML para implantação no cluster. Criaremos três recursos: Deployment (gerenciamento de pods), Service (acesso de rede) e Ingress (acesso externo).
\n\n3.1. Deployment
\nCrie o arquivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: go-app-deployment\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: my-go-app:v1\n ports:\n - containerPort: 8080\n env:\n - name: APP_VERSION\n value: "1.0.0"\n - name: PORT\n value: "8080"\n livenessProbe:\n httpGet:\n path: /\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n\n\nAqui, definimos 2 réplicas, uma sonda de atividade (liveness probe) e variáveis de ambiente.
\n\n3.2. Service
\nCrie o arquivo service.yaml para acesso interno:
apiVersion: v1\nkind: Service\nmetadata:\n name: go-app-service\nspec:\n selector:\n app: go-app\n ports:\n - protocol: TCP\n port: 80\n targe