Déploiement de Go sur Kubernetes : guide de base pour débutants

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

Go (Golang) et Kubernetes (K8s) sont faits l'un pour l'autre. Kubernetes lui-même est écrit en Go, donc la boîte à outils native, les performances et la simplicité de déploiement font de cette combinaison la norme pour les microservices modernes. Si vous débutez tout juste dans le DevOps ou souhaitez automatiser le déploiement de votre application Go, ce guide vous aidera à franchir toutes les étapes : de l'écriture d'un simple serveur HTTP en Go à son exécution dans un cluster Kubernetes.

\n\n

Dans cet article, nous aborderons :

\n
    \n
  • La construction d'une application Go dans une image Docker
  • \n
  • La création de manifestes Kubernetes minimaux (Deployment, Service, Ingress)
  • \n
  • Le déploiement et la vérification du bon fonctionnement
  • \n
\n\n

Il est supposé que vous avez déjà installé docker, kubectl et minikube (ou que vous avez accès à n'importe quel cluster K8s).

\n\n

Étape 1 : Écrire une application Go simple

\n\n

Créons un serveur HTTP de base qui répondra aux requêtes. Créez un fichier main.go :

\n\n
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, "Bonjour de Go ! Version : %s", os.Getenv("APP_VERSION"))\n    })\n\n    port := os.Getenv("PORT")\n    if port == "" {\n        port = "8080"\n    }\n\n    fmt.Printf("Serveur démarré sur le port %s\\n", port)\n    http.ListenAndServe(":"+port, nil)\n}\n
\n\n

Cette application lit la variable d'environnement APP_VERSION (peut être définie lors du déploiement) et écoute sur le port spécifié dans PORT. Testons-la localement :

\n\n
go run main.go\n# Ouvrez votre navigateur sur http://localhost:8080\n
\n\n

Créer un module Go

\n

Initialisez le module pour faciliter la construction :

\n
go mod init my-go-app\n
\n\n

Étape 2 : Conteneurisation avec Docker

\n\n

Pour déployer sur Kubernetes, il faut empaqueter l'application dans une image Docker. Nous utilisons une construction multi-étapes (multi-stage build) pour que l'image soit minimale.

\n\n

Créez un fichier Dockerfile :

\n\n
# Étape de construction\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod ./\nCOPY main.go ./\nRUN go build -o my-app .\n\n# Image finale\nFROM alpine:3.19\nWORKDIR /app\nCOPY --from=builder /app/my-app .\nEXPOSE 8080\nCMD ["./my-app"]\n
\n\n

Construisez l'image et vérifiez :

\n
docker build -t my-go-app:v1 .\ndocker run -p 8080:8080 my-go-app:v1\n# http://localhost:8080\n
\n\n

Étape 3 : Manifestes Kubernetes

\n\n

Préparons maintenant les fichiers YAML pour le déploiement dans le cluster. Nous allons créer trois ressources : Deployment (gestion des pods), Service (accès réseau) et Ingress (accès externe).

\n\n

3.1. Deployment

\n

Créez un fichier deployment.yaml :

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

Ici, nous avons défini 2 réplicas, une sonde de vivacité (liveness probe) et des variables d'environnement.

\n\n

3.2. Service

\n

Créez un fichier service.yaml pour l'accès interne :

\n\n
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    targetPort: 8080\n  type: ClusterIP\n
\n\n

3.3. Ingress

\n

Créez un fichier ingress.yaml pour l'accès externe :

\n\n
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: go-app-ingress\nspec:\n  rules:\n  - host: go-app.local\n    http:\n      paths:\n      - path: /\n        pathType: Prefix\n        backend:\n          service:\n            name: go-app-service\n            port:\n              number: 80\n
\n\n

Étape 4 : Déploiement sur Kubernetes

\n\n

Appliquez les manifestes dans l'ordre suivant :

\n\n
kubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\nkubectl apply -f ingress.yaml\n
\n\n

Vérifiez l'état des ressources :

\n\n
kubectl get pods\nkubectl get services\nkubectl get ingress\n
\n\n

Pour tester localement avec Minikube, activez le complément Ingress :

\n\n
minikube addons enable ingress\n
\n\n

Ajoutez l'entrée suivante à votre fichier /etc/hosts :

\n\n
$(minikube ip) go-app.local\n
\n\n

Ouvrez maintenant http://go-app.local dans votre navigateur. Vous devriez voir le message "Bonjour de Go ! Version : 1.0.0".

\n\n

Conclusion

\n\n

Félicitations ! Vous avez déployé avec succès une application Go sur Kubernetes. Ce flux de travail de base peut être étendu avec des fonctionnalités avancées telles que ConfigMaps, Secrets, Horizontal Pod Autoscaler, ou des pipelines CI/CD. La combinaison Go + Kubernetes offre une évolutivité et une fiabilité élevées pour les applications modernes.

\n\n

N'oubliez pas de nettoyer les ressources après les tests :

\n\n
kubectl delete -f ingress.yaml\nkubectl delete -f service.yaml\nkubectl delete -f deployment.yaml\n

Blogs

Book Recommendations