نشر C++ على Kubernetes: دليل أساسي عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا C++ و Kubernetes مزيج عملي

\n\n

يعتقد العديد من المطورين خطأً أن Kubernetes (K8s) هو نظام بيئي حصري للغات المفسرة مثل Python أو JavaScript أو Go. في الواقع، نشر C++ على Kubernetes ليس فقط ممكنًا، بل هو ممارسة فعالة للغاية للأنظمة عالية التحميل حيث تكون الأداء، واستهلاك الذاكرة المنخفض، ووقت الاستجابة المتوقع أمرًا بالغ الأهمية. تعتبر لغة C++ مثالية لإنشاء خدمات الخلفية (backend)، ومعالجات البيانات، وخوادم الألعاب، وتطبيقات الشبكات، بينما توفر Kubernetes منصة ملائمة لتنسيقها وتوسيعها وإدارتها.

\n\n

في هذا الدليل العملي، سنشرح خطوة بخطوة كيفية تجميع تطبيق C++ في صورة Docker، وكتابة بيان (Manifest) صحيح لـ Kubernetes، ونشره في المجموعة (Cluster). سترى أن العملية لا تختلف تقريبًا عن نشر التطبيقات بلغات أخرى، إذا تم إعداد البناء بشكل صحيح.

\n\n

1. إعداد تطبيق C++ وكتابة Dockerfile

\n\n

في البداية، نحتاج إلى تطبيق C++ بسيط لكنه عملي. ليكن خادم HTTP يستمع إلى منفذ ويعيد "Hello from C++ on K8s!". في المشاريع الحقيقية، قد يكون هذا واجهة برمجة تطبيقات REST تعتمد على Crow أو Pistache أو Drogon.

\n\n

مثال لملف 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\n

الآن سنكتب Dockerfile. النقطة الأساسية هي استخدام البناء متعدد المراحل (multi-stage build). هذا يسمح بإبقاء الصورة النهائية صغيرة وآمنة.

\n\n
# مرحلة البناء\nFROM gcc:latest AS builder\nWORKDIR /app\nCOPY main.cpp .\nRUN g++ -static -o server main.cpp\n\n# الصورة النهائية (صغيرة)\nFROM alpine:latest\nWORKDIR /app\n# ننسخ فقط الملف الثنائي المُجمّع\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]
\n\n

نبني الصورة ونرفعها إلى السجل (مثل Docker Hub):

\n
docker build -t yourusername/cpp-server:latest .\ndocker push yourusername/cpp-server:latest
\n\n

2. كتابة البيانات (Manifests) لـ Kubernetes

\n\n

لنشر تطبيق C++ في Kubernetes، سنحتاج إلى كائنين على الأقل: Deployment (لإدارة Pods) و Service (لتوفير الوصول إلى التطبيق).

\n\n

بيان Deployment (deployment.yaml)

\n
apiVersion: 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                

المدونات

توصيات الكتب