Go auf Kubernetes bereitstellen: Ein grundlegendes Tutorial für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Go und Kubernetes ein ideales Paar sind

\n\n

Go (Golang) und Kubernetes (K8s) sind füreinander gemacht. Kubernetes selbst ist in Go geschrieben, daher machen die nativen Werkzeuge, die Leistung und die einfache Bereitstellung diese Kombination zum Standard für moderne Microservices. Wenn Sie gerade erst Ihren Weg in DevOps beginnen oder die Bereitstellung Ihrer Go-Anwendung automatisieren möchten, hilft Ihnen dieses Tutorial, alle Schritte zu durchlaufen: vom Schreiben eines einfachen HTTP-Servers in Go bis zum Ausführen in einem Kubernetes-Cluster.

\n\n

In diesem Artikel behandeln wir:

\n
    \n
  • Das Erstellen eines Go-Anwendungs-Docker-Images
  • \n
  • Das Erstellen minimaler Kubernetes-Manifeste (Deployment, Service, Ingress)
  • \n
  • Die Bereitstellung und Überprüfung der Funktionsfähigkeit
  • \n
\n\n

Es wird vorausgesetzt, dass Sie bereits docker, kubectl und minikube installiert haben (oder Zugriff auf einen beliebigen K8s-Cluster haben).

\n\n

Schritt 1: Eine einfache Go-Anwendung schreiben

\n\n

Wir erstellen einen einfachen HTTP-Server, der auf Anfragen antwortet. Erstellen Sie die Datei 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, "Hallo aus 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("Server gestartet auf Port %s\\n", port)\n    http.ListenAndServe(":"+port, nil)\n}\n
\n\n

Diese Anwendung liest die Umgebungsvariable APP_VERSION (kann bei der Bereitstellung festgelegt werden) und horcht auf dem in PORT angegebenen Port. Testen wir nun lokal:

\n\n
go run main.go\n# Öffnen Sie den Browser unter http://localhost:8080\n
\n\n

Ein Go-Modul erstellen

\n

Initialisieren Sie das Modul für eine einfache Kompilierung:

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

Schritt 2: Containerisierung mit Docker

\n\n

Für die Bereitstellung in Kubernetes muss die Anwendung in ein Docker-Image verpackt werden. Wir verwenden einen Multi-Stage-Build, um das Image minimal zu halten.

\n\n

Erstellen Sie die Datei Dockerfile:

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

Erstellen Sie das Image und überprüfen Sie es:

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

Schritt 3: Kubernetes-Manifeste

\n\n

Jetzt bereiten wir die YAML-Dateien für die Bereitstellung im Cluster vor. Wir werden drei Ressourcen erstellen: Deployment (Pod-Verwaltung), Service (Netzwerkzugriff) und Ingress (externer Zugriff).

\n\n

3.1. Deployment

\n

Erstellen Sie die Datei 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

Hier haben wir 2 Replikate, einen Liveness-Probe und Umgebungsvariablen festgelegt.

\n\n

3.2. Service

\n

Erstellen Sie die Datei service.yaml für den internen Zugriff:

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

Blogs

Buchempfehlungen