Introduction : Pourquoi Go et Kubernetes forment un duo idéal
\n\nLe développement moderne s'appuie de plus en plus sur l'architecture microservices et la conteneurisation. Le langage Go (Golang), grâce à ses performances, sa simplicité et son support natif de la concurrence, est devenu l'un des leaders pour l'écriture de services backend. Parallèlement, Kubernetes (K8s) est le standard de facto pour l'orchestration de conteneurs.
\n\nDéployer une application Go sur Kubernetes est un processus qui peut sembler complexe pour les débutants. Cependant, en suivant un guide étape par étape, vous pourrez configurer un pipeline CI/CD et lancer votre service en quelques minutes. Dans cet article, nous allons aborder la création d'une image Docker, la rédaction de manifestes pour Kubernetes, la configuration des services et d'Ingress, ainsi que des conseils pratiques d'optimisation.
\n\n1. Préparation de l'application Go et du Dockerfile
\n\nAvant de déployer l'application dans le cluster, il est nécessaire de l'empaqueter dans un conteneur. En Go, cela est particulièrement pratique grâce à la compilation statique.
\n\n1.1. Exemple d'un serveur HTTP simple en Go
\n\nCréons un serveur minimal qui répondra aux requêtes. C'est un microservice typique pour la démonstration.
\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. Construction multi-étapes du Dockerfile
\n\nNous utilisons une construction multi-étapes (multi-stage build) pour minimiser la taille de l'image finale. C'est crucial pour un chargement rapide dans le cluster.
\n\n# ---- Première étape : compilation du binaire ----\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# ---- Deuxième étape : image minimale ----\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\nImportant : le flag CGO_ENABLED=0 désactive CGO, ce qui permet de compiler un binaire entièrement statique qui ne nécessite pas de bibliothèques externes.
2. Création des manifestes Kubernetes
\n\nMaintenant que nous avons une image, il faut décrire comment Kubernetes va gérer notre application. Les objets principaux sont : Deployment (pour la gestion des répliques) et Service (pour l'accès réseau).
\n\n2.1. Deployment
\n\nLe Deployment garantit que le nombre requis de pods (Pod) avec notre application est toujours en cours d'exécution. Il est important de configurer les sondes de liveness et readiness pour une récupération automatique.
\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