Déploiement de Go sur Kubernetes : guide pratique de base

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi Go et Kubernetes forment un duo idéal

\n\n

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

Dé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\n

1. Préparation de l'application Go et du Dockerfile

\n\n

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

1.1. Exemple d'un serveur HTTP simple en Go

\n\n

Cré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\n

1.2. Construction multi-étapes du Dockerfile

\n\n

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

Important : 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.

\n\n

2. Création des manifestes Kubernetes

\n\n

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

2.1. Deployment

\n\n

Le 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                

Blogs

Book Recommendations