Implantação do Go no Kubernetes: guia básico na prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que Go e Kubernetes são a dupla ideal

\n\n

O 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\n

Implantar 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\n

1. Preparação da aplicação Go e Dockerfile

\n\n

Antes 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\n

1.1. Exemplo de um servidor HTTP simples em Go

\n\n

Vamos 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\n

1.2. Construção em múltiplos estágios do Dockerfile

\n\n

Utilizamos 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\n

Importante: a flag CGO_ENABLED=0 desativa o CGO, permitindo compilar um binário totalmente estático que não requer bibliotecas externas.

\n\n

2. Criação dos manifestos Kubernetes

\n\n

Agora 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\n

2.1. Deployment

\n\n

O 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                

Blogs

Book Recommendations