Einleitung: Warum C++ und Kubernetes eine funktionierende Kombination sind
\n\nViele Entwickler gehen fälschlicherweise davon aus, dass Kubernetes (K8s) ein Ökosystem ausschließlich für interpretierte Sprachen wie Python, JavaScript oder Go ist. Tatsächlich ist das Deployment von C++ auf Kubernetes nicht nur möglich, sondern auch eine äußerst effektive Praxis für hochlastige Systeme, bei denen Leistung, geringer Speicherverbrauch und vorhersagbare Antwortzeiten kritisch sind. C++ eignet sich hervorragend für die Erstellung von Backend-Diensten, Datenverarbeitern, Spieleservern und Netzwerkanwendungen, während Kubernetes eine bequeme Plattform für deren Orchestrierung, Skalierung und Verwaltung bietet.
\n\nIn dieser praktischen Anleitung werden wir Schritt für Schritt durchgehen, wie man eine C++-Anwendung in ein Docker-Image packt, ein korrektes Manifest für Kubernetes schreibt und es in einem Cluster bereitstellt. Sie werden sehen, dass der Prozess sich kaum vom Deployment von Anwendungen in anderen Sprachen unterscheidet, wenn der Build richtig konfiguriert ist.
\n\n1. Vorbereitung der C++-Anwendung und Schreiben des Dockerfile
\n\nZunächst benötigen wir eine einfache, aber funktionierende C++-Anwendung. Nehmen wir einen HTTP-Server, der auf einem Port lauscht und "Hello from C++ on K8s!" zurückgibt. In realen Projekten könnte dies eine REST-API basierend auf Crow, Pistache oder Drogon sein.
\n\nBeispieldatei main.cpp:
\n#include <iostream>\n#include <string>\n#include <cstring>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\nint main() {\n int server_fd = socket(AF_INET, SOCK_STREAM, 0);\n struct sockaddr_in address;\n int opt = 1;\n setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n address.sin_family = AF_INET;\n address.sin_addr.s_addr = INADDR_ANY;\n address.sin_port = htons(8080);\n bind(server_fd, (struct sockaddr *)&address, sizeof(address));\n listen(server_fd, 3);\n\n std::cout << "Server started on port 8080" << std::endl;\n\n while (true) {\n int new_socket = accept(server_fd, nullptr, nullptr);\n const char *response = "HTTP/1.1 200 OK\\nContent-Type: text/plain\\n\\nHello from C++ on K8s!\\n";\n send(new_socket, response, strlen(response), 0);\n close(new_socket);\n }\n return 0;\n}\n\nJetzt schreiben wir das Dockerfile. Der entscheidende Punkt ist die Verwendung eines Multi-Stage-Builds. Dies ermöglicht es, das finale Image minimal und sicher zu halten.
\n\n# Build-Stufe\nFROM gcc:latest AS builder\nWORKDIR /app\nCOPY main.cpp .\nRUN g++ -static -o server main.cpp\n\n# Finales Image (minimal)\nFROM alpine:latest\nWORKDIR /app\n# Nur die kompilierte Binärdatei kopieren\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]\n\nDas Image bauen und in die Registry pushen (z.B. Docker Hub):
\ndocker build -t yourusername/cpp-server:latest .\ndocker push yourusername/cpp-server:latest\n\n2. Schreiben der Manifests für Kubernetes
\n\nFür das Deployment der C++-Anwendung in Kubernetes benötigen wir mindestens zwei Objekte: ein Deployment (zur Verwaltung der Pods) und einen Service (zur Bereitstellung des Zugriffs auf die Anwendung).
\n\nDeployment-Manifest (deployment.yaml)
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: cpp-server-deployment\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: cpp-server\n template:\n metadata:\n labels:\n app: cpp-server\n spec:\n containers:\n - name: cpp-server\n image: yourusername/cpp-server:latest\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "64Mi"\n cpu: "100m"\n limits:\n memory: "128Mi"\n cpu: "200m"\n livenessProbe:\n tcpSocket:\n port: 8080\n initialDelaySeconds: 5\n per