نشر تطبيقات C++ على Kubernetes: دليل أساسي عملي
أصبح Kubernetes (K8s) المعيار الفعلي لتنسيق الحاويات. على الرغم من أنه غالبًا ما يرتبط بـ Go أو Java أو Python، إلا أن C++ تُستخدم أيضًا بنشاط للخدمات عالية التحميل حيث يكون الأداء واستهلاك الذاكرة المنخفض أمرًا بالغ الأهمية. في هذه المقالة، سنستعرض العملية العملية لنشر تطبيق C++ في مجموعة Kubernetes: بدءًا من كتابة خادم HTTP بسيط وحتى إنشاء المانيفستات والتوسع.
1. تحضير تطبيق C++ وصورة Docker
للبدء، سننشئ تطبيق C++ بسيطًا يستمع لطلبات HTTP. سنستخدم مكتبة cpp-httplib (header-only) للتبسيط.
الكود المصدري (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 (بناء متعدد المراحل)
لجعل الصورة مضغوطة وآمنة، نستخدم بناء متعدد المراحل (multi-stage build):
# مرحلة البناءFROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server
# الصورة النهائيةFROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]قم ببناء الصورة:
docker build -t cpp-k8s-demo:latest .اختبرها محليًا:
docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/2. كتابة مانيفستات Kubernetes
للنشر، سنحتاج إلى موردين رئيسيين: Deployment (إدارة البودات) و Service (الوصول الشبكي).
Deployment (deployment.yaml)
يحدد عدد النسخ المتماثلة (replicas) التي سيتم تشغيلها، وسياسة التحديثات، وصورة الحاوية.
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"هام: imagePullPolicy: IfNotPresent مناسب للاختبار المحلي. للإنتاج، استخدم Always أو حدد علامة الإصدار (tag).
Service (service.yaml)
يفتح الوصول إلى البودات داخل المجموعة (ClusterIP) أو خارجها (NodePort/LoadBalancer).
apiVersion: v1kind: Servicemetadata: name: cpp-app-servicespec: selector: app: cpp-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer3. النشر في المجموعة والتحقق
لنفترض أن لديك بالفعل مجموعة عاملة (Minikube أو kind أو سحابية). قم بتنفيذ الأوامر التالية:
# تحميل الصورة إلى المجموعة (لـ Minikube)minikube image load cpp-k8s-demo:latest
# تطبيق المانيفستاتkubectl apply -f deployment.yamlkubectl apply -f service.yaml
# التحقق من الحالةkubectl get pods -l app=cpp-appkubectl get svc cpp-app-service
المدونات
توصيات الكتب
اقرأ أيضًا