المقدمة: لماذا يعتبر C++ و Kubernetes ثنائيًا قويًا
تعتمد البنية التحتية السحابية الحديثة بشكل متزايد على بنية الخدمات المصغرة والحاويات. أصبح Kubernetes المعيار الفعلي لتنسيق الحاويات. ومع ذلك، يعتقد العديد من المطورين خطأً أن Kubernetes مخصص فقط للغات المفسرة (Python, JavaScript) أو JVM. في الواقع، نشر تطبيقات C++ في Kubernetes ليس ممكنًا فحسب، بل يوفر أيضًا مزايا كبيرة: أداء عالٍ، واستهلاك ضئيل للذاكرة، وتحكم كامل في الموارد.
في هذا الدليل، سنشرح كيفية حزم خادم C++ في صورة Docker، وإنشاء ملفات Kubernetes اللازمة، وتشغيله في الكتلة. ستتعلم كيفية معالجة التهيئات والأسرار، وكذلك كيفية إعداد Health Checks بشكل صحيح لضمان عمل التطبيق بشكل موثوق.
1. تحضير تطبيق C++ للحاويات
قبل الحديث عن Kubernetes، نحتاج إلى تحضير تطبيق C++ نفسه. على سبيل المثال، سنأخذ خادم HTTP بسيط يعتمد على مكتبة libmicrohttpd. سيقوم هذا الخادم بالرد على الطلبات وقراءة التهيئة من متغيرات البيئة - وهذا هو النهج القياسي لتطبيقات 12-factor.
1.1. كود خادم HTTP بسيط بلغة C++
لننشئ ملف 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; }
// انتظار لا نهائي while (true) { sleep(1); }
MHD_stop_daemon(daemon); return 0;}يقرأ هذا الكود المنفذ من متغير البيئة PORT (القيمة الافتراضية هي 8080) ويشغل خادم HTTP. لاحظ: نستخدم حلقة لا نهائية لمنع انتهاء العملية - وهذا مهم للعمل داخل الحاوية.
1.2. بناء التطبيق
للبناء، سنحتاج إلى CMake. لننشئ 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})الآن التطبيق جاهز للحاويات.
2. إنشاء صورة Docker لتطبيق C++
يعمل Kubernetes مع الحاويات، لذلك نحتاج إلى صورة Docker. بالنسبة لـ C