Einleitung: Warum C++ und Kubernetes ein starkes Duo sind
Moderne Cloud-Infrastruktur basiert zunehmend auf Microservice-Architektur und Containerisierung. Kubernetes hat sich als De-facto-Standard für die Container-Orchestrierung etabliert. Viele Entwickler gehen jedoch fälschlicherweise davon aus, dass Kubernetes nur für interpretierte Sprachen (Python, JavaScript) oder die JVM geeignet ist. Tatsächlich ist das Deployment von C++-Anwendungen in Kubernetes nicht nur möglich, sondern bietet auch erhebliche Vorteile: hohe Leistung, minimaler Speicherverbrauch und vollständige Kontrolle über Ressourcen.
In diesem Leitfaden werden wir durchgehen, wie man einen C++-Server in ein Docker-Image packt, die notwendigen Manifeste für Kubernetes erstellt und ihn in einem Cluster ausführt. Sie erfahren, wie Sie Konfigurationen und Secrets verwalten und Health Checks für einen zuverlässigen Betrieb der Anwendung richtig konfigurieren.
1. Vorbereitung der C++-Anwendung für die Containerisierung
Bevor wir über Kubernetes sprechen, muss die C++-Anwendung selbst vorbereitet werden. Als Beispiel nehmen wir einen einfachen HTTP-Server auf Basis der Bibliothek libmicrohttpd. Dieser Server wird auf Anfragen antworten und die Konfiguration aus Umgebungsvariablen lesen – dies ist der Standardansatz für 12-Factor-Apps.
1.1. Code eines einfachen HTTP-Servers in C++
Wir erstellen die Datei main.cpp:
#include <iostream>#include <string>#include <microhttpd.h>#include <cstdlib>
static enum MHD_Result answer_to_connection(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls) { const char *page = "<html><body>Hello from C++ on Kubernetes!</body></html>"; struct MHD_Response *response = MHD_create_response_from_buffer(strlen(page), (void*)page, MHD_RESPMEM_PERSISTENT); int ret = MHD_queue_response(connection, MHD_HTTP_OK, response); MHD_destroy_response(response); return ret == MHD_YES ? MHD_OK : MHD_NO;}
int main() { const char* port_str = std::getenv("PORT"); unsigned int port = port_str ? std::stoul(port_str) : 8080;
std::cout << "Starting server on port " << port << std::endl; struct MHD_Daemon *daemon = MHD_start_daemon(MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD, port, nullptr, nullptr, &answer_to_connection, nullptr, MHD_OPTION_END); if (nullptr == daemon) { std::cerr << "Failed to start daemon" << std::endl; return 1; }
// Endlose Warteschleife while (true) { sleep(1); }
MHD_stop_daemon(daemon); return 0;}Dieser Code liest den Port aus der Umgebungsvariable PORT (Standardwert ist 8080) und startet den HTTP-Server. Beachten Sie: Wir verwenden eine Endlosschleife, damit der Prozess nicht beendet wird – dies ist wichtig für den Betrieb im Container.
1.2. Build der Anwendung
Für den Build benötigen wir CMake. Wir erstellen CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)project(cpp-k8s-server)
find_package(libmicrohttpd REQUIRED)
add_executable(server main.cpp)target_link_libraries(server ${LIBMICROHTTPD_LIBRARIES})target_include_directories(server PRIVATE ${LIBMICROHTTPD_INCLUDE_DIRS})Die Anwendung ist nun bereit für die Containerisierung.
2. Erstellen eines Docker-Images für die C++-Anwendung
Kubernetes arbeitet mit Containern, daher benötigen wir ein Docker-Image. Für C