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

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

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

ابدأ الدورة

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



Rust هي واحدة من أسرع لغات البرمجة النظامية وأكثرها أمانًا. Kubernetes (k8s) هو المعيار الفعلي لتنسيق الحاويات. يتيح الجمع بينهما إنشاء خدمات فعالة للغاية وخفيفة الوزن ومتسامحة مع الأعطال. في هذه المقالة، سنستعرض دورة النشر الكاملة لتطبيق Rust في مجموعة Kubernetes: بدءًا من بناء صورة Docker وصولاً إلى التوسع.



لماذا يعتبر Rust و Kubernetes ثنائيًا مثاليًا



يتم تجميع Rust إلى ملف ثنائي أصلي، ولا يتطلب آلة افتراضية (مثل Java) أو مفسرًا (مثل Python). وهذا يمنح حجم صورة ضئيلًا واستهلاكًا منخفضًا للذاكرة. في سياق Kubernetes، يعني هذا:

  • بدء تشغيل سريع للـ Pods (غالبًا أقل من ثانية واحدة).
  • توفير في موارد المجموعة.
  • عدد أقل من الثغرات الأمنية بسبب عدم وجود بيئات تشغيل ثقيلة.


الخطوة 1: إنشاء تطبيق Rust بسيط



كمثال، سنكتب خادم HTTP باستخدام الإطار الشائع actix-web. قم بإنشاء مشروع جديد:

cargo new rust-k8s-democd rust-k8s-demo


أضف التبعيات في Cargo.toml:

[dependencies]actix-web = "4"serde = { version = "1", features = ["derive"] }


لنكتب معالجًا بسيطًا في src/main.rs:

use actix_web::{get, web, App, HttpServer, Responder};use std::env;

#[get("/")]async fn index() -> impl Responder { let message = env::var("MESSAGE").unwrap_or_else(|_| "Hello from Rust!".to_string()); format!("{{ \\"message\\": \\"{}\\" }}", message)}

#[actix_web::main]async fn main() -> std::io::Result<()> { let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string()); let addr = format!("0.0.0.0:{}", port); println!("Starting server at {}", addr);

HttpServer::new(|| { App::new() .service(index) }) .bind(&addr)? .run() .await}


يقرأ التطبيق متغيرات البيئة MESSAGE و PORT — وهذا سيكون مفيدًا للتكوين عبر Kubernetes ConfigMap.



الخطوة 2: بناء صورة Docker



نستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة. قم بإنشاء Dockerfile:

# مرحلة البناءFROM rust:1.75-slim-bookworm AS builder

WORKDIR /appCOPY Cargo.toml Cargo.lock ./RUN mkdir src && echo "fn main() {}" > src/main.rsRUN cargo build --release 2>/dev/null || true

COPY src/ src/RUN cargo build --release

# الصورة النهائيةFROM debian:bookworm-slimRUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*COPY --from=builder /app/target/release/rust-k8s-demo /usr/local/bin/rust-k8s-demo

EXPOSE 8080CMD ["rust-k8s-demo"]


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

docker build -t yourusername/rust-k8s-demo:latest .docker push yourusername/rust-k8s-demo:latest


الخطوة 3: ملفات بيان Kubernetes



لننشئ مجلدًا باسم k8s ونضع فيه ملفات البيان.



3.1. ConfigMap للتكوين

قم بإنشاء ملف k8s/configmap.yaml:

apiVersion: v1kind: ConfigMapmetadata:  name: rust-app-configdata:  MESSAGE: "مرحبًا من Rust على Kubernetes!"  PORT: "8080"


3.2. Deployment

قم بإنشاء ملف k8s/deployment.yaml:

apiVersion: apps/v1kind: Deploymentmetadata:  name: rust-appspec:  replicas: 3  selector:    matchLabels:      app: rust-app  template:    metadata:      labels:        app: rust-app    spec:      containers:      - name: rust-app        image: yourusername/rust-k8s-demo:latest        ports:        - containerPort: 8080        envFrom:        - configMapRef:            name: rust-app-config                

المدونات

توصيات الكتب