Go auf Kubernetes bereitstellen: Ein praktisches Grundlagentutorial

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

Die moderne Entwicklung stützt sich zunehmend auf Microservices-Architektur und Containerisierung. Die Sprache Go (Golang) hat sich aufgrund ihrer Leistung, Einfachheit und nativen Unterstützung für Nebenläufigkeit zu einem der führenden Sprachen für die Entwicklung von Backend-Diensten entwickelt. Gleichzeitig ist Kubernetes (K8s) der De-facto-Standard für die Orchestrierung von Containern.

\n\n

Die Bereitstellung einer Go-Anwendung in Kubernetes ist ein Prozess, der Anfängern komplex erscheinen mag. Wenn Sie jedoch dieser Schritt-für-Schritt-Anleitung folgen, können Sie eine CI/CD-Pipeline einrichten und Ihren Dienst in wenigen Minuten starten. In diesem Artikel behandeln wir die Erstellung eines Docker-Images, das Schreiben von Kubernetes-Manifesten, die Konfiguration von Services und Ingress sowie praktische Tipps zur Optimierung.

\n\n

1. Vorbereitung der Go-Anwendung und des Dockerfiles

\n\n

Bevor Sie die Anwendung in einem Cluster bereitstellen, müssen Sie sie in einen Container verpacken. In Go ist dies dank der statischen Kompilierung besonders einfach.

\n\n

1.1. Beispiel eines einfachen HTTP-Servers in Go

\n\n

Wir erstellen einen minimalen Server, der auf Anfragen antwortet. Dies ist ein typischer Microservice zur Demonstration.

\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. Mehrstufiger Build des Dockerfiles

\n\n

Wir verwenden einen mehrstufigen Build (multi-stage build), um die Größe des endgültigen Images zu minimieren. Dies ist entscheidend für ein schnelles Laden in den Cluster.

\n\n
# ---- Erste Stufe: Build des Binärs ----\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# ---- Zweite Stufe: Minimales Image ----\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

Wichtig: Das Flag CGO_ENABLED=0 deaktiviert CGO, was die Erstellung eines vollständig statischen Binärs ermöglicht, das keine externen Bibliotheken benötigt.

\n\n

2. Erstellung von Kubernetes-Manifesten

\n\n

Nachdem wir nun ein Image haben, müssen wir beschreiben, wie Kubernetes unsere Anwendung verwalten soll. Die wichtigsten Objekte sind: Deployment (zur Verwaltung von Replikaten) und Service (für den Netzwerkzugriff).

\n\n

2.1. Deployment

\n\n

Das Deployment stellt sicher, dass die erforderliche Anzahl von Pods mit unserer Anwendung stets ausgeführt wird. Es ist wichtig, Liveness- und Readiness-Probes für die automatische Wiederherstellung zu konfigurieren.

\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

Buchempfehlungen