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

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

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

ابدأ الدورة

نشر تطبيقات 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: LoadBalancer


3. النشر في المجموعة والتحقق

لنفترض أن لديك بالفعل مجموعة عاملة (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

المدونات

توصيات الكتب