Bereitstellung von C++ auf Kubernetes: Ein praktischer Grundlagenleitfaden
Kubernetes (K8s) ist zum De-facto-Standard für die Container-Orchestrierung geworden. Obwohl es am häufigsten mit Go, Java oder Python assoziiert wird, wird C++ ebenfalls aktiv für hochbelastete Dienste eingesetzt, bei denen Leistung und geringer Speicherverbrauch entscheidend sind. In diesem Artikel werden wir den praktischen Prozess der Bereitstellung einer C++-Anwendung in einem Kubernetes-Cluster durchgehen: vom Schreiben eines einfachen HTTP-Servers bis zur Erstellung von Manifesten und der Skalierung.
1. Vorbereitung der C++-Anwendung und des Docker-Images
Zunächst erstellen wir eine minimale C++-Anwendung, die HTTP-Anfragen entgegennimmt. Der Einfachheit halber verwenden wir die Bibliothek cpp-httplib (Header-only).
Quellcode (server.cpp)
#include <httplib.h>#include <iostream>
int main() { using namespace httplib; Server svr;
svr.Get("/", [](const Request& req, Response& res) { res.set_content("Hello from C++ on Kubernetes!", "text/plain"); });
svr.Get("/health", [](const Request& req, Response& res) { res.set_content("OK", "text/plain"); });
std::cout << "Server started on port 8080" << std::endl; svr.listen("0.0.0.0", 8080); return 0;}Dockerfile (mehrstufiger Build)
Damit das Image kompakt und sicher ist, verwenden wir einen Multi-Stage-Build:
# Build-StufeFROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server
# Finales ImageFROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Erstellen Sie das Image:
docker build -t cpp-k8s-demo:latest .Testen Sie es lokal:
docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/2. Schreiben der Kubernetes-Manifeste
Für die Bereitstellung benötigen wir zwei Hauptressourcen: Deployment (Verwaltung der Pods) und Service (Netzwerkzugriff).
Deployment (deployment.yaml)
Definiert, wie viele Replikate gestartet werden sollen, die Update-Richtlinie und das Container-Image.
apiVersion: apps/v1kind: Deploymentmetadata: name: cpp-app-deployment labels: app: cpp-appspec: replicas: 3 selector: matchLabels: app: cpp-app template: metadata: labels: app: cpp-app spec: containers: - name: cpp-app image: cpp-k8s-demo:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"Wichtig: imagePullPolicy: IfNotPresent ist für lokale Tests geeignet. Verwenden Sie für die Produktion Always oder geben Sie einen Versions-Tag an.
Service (service.yaml)
Ermöglicht den Zugriff auf die Pods innerhalb des Clusters (ClusterIP) oder von außen (NodePort/LoadBalancer).
apiVersion: v1kind: Servicemetadata: name: cpp-app-servicespec: selector: app: cpp-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer3. Bereitstellung im Cluster und Überprüfung
Angenommen, Sie haben bereits einen funktionierenden Cluster (Minikube, kind oder Cloud). Führen Sie die folgenden Befehle aus:
# Laden Sie das Image in den Cluster (für Minikube)minikube image load cpp-k8s-demo:latest
# Wenden Sie die Manifeste ankubectl apply -f deployment.yamlkubectl apply -f service.yaml
# Überprüfen Sie den Statuskubectl get pods -l app=cpp-appkubectl get svc cpp-app-service