مقدمة
\n\nRust هي لغة برمجة نظامية حديثة تجمع بين الأداء العالي للغات C/C++ وأمان الذاكرة على مستوى الترجمة. بفضل عدم وجود جامع للقمامة وانخفاض استهلاك الموارد، فإن تطبيقات Rust مثالية للتشغيل في بيئات الحاويات. Kubernetes (K8s) هو المعيار الفعلي لتنسيق الحاويات. في هذا الدليل، سنشرح عملياً كيفية بناء تطبيق ويب بسيط بلغة Rust، وتغليفه في صورة Docker، ونشره في مجموعة Kubernetes.
\n\nالمقالة موجهة للمطورين الذين لديهم معرفة أساسية بلغة Rust ولديهم فكرة أساسية عن Docker وKubernetes. لن نتعمق في النظرية، بل سنركز على التعليمات خطوة بخطوة مع أمثلة حقيقية للأكواد والأوامر.
\n\n1. تحضير تطبيق Rust
\n\nكمثال، سننشئ خادم HTTP بسيط باستخدام الإطار الشائع actix-web. سوف يستجيب لطلبات GET ويعيد استجابة JSON.
أنشئ مشروعاً جديداً:
\n\ncargo new rust-k8s-app\ncd rust-k8s-app\n\nأضف التبعيات في Cargo.toml:
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\nالآن لنكتب كود الخادم في src/main.rs:
use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};\nuse serde::Serialize;\n\n#[derive(Serialize)]\nstruct HealthResponse {\n status: String,\n message: String,\n}\n\n#[get("/health")]\nasync fn health_check() -> impl Responder {\n HttpResponse::Ok().json(HealthResponse {\n status: "ok".to_string(),\n message: "الخدمة تعمل".to_string(),\n })\n}\n\n#[get("/")]\nasync fn index() -> impl Responder {\n HttpResponse::Ok().json(serde_json::json!({\n "service": "rust-k8s-app",\n "version": env!("CARGO_PKG_VERSION")\n }))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n let host = std::env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string());\n let port: u16 = std::env::var("PORT")\n .unwrap_or_else(|_| "8080".to_string())\n .parse()\n .expect("PORT must be a number");\n\n println!("الخادم يعمل على {}:{}", host, port);\n\n HttpServer::new(|| {\n App::new()\n .service(health_check)\n .service(index)\n })\n .bind((host.as_str(), port))?\n .run()\n .await\n}\n\nلاحظ: قمنا بإخراج المضيف والمنفذ إلى متغيرات البيئة. هذه ممارسة قياسية للتطبيقات المحتواة - يجب أن يأتي التكوين من الخارج.
\n\nتحقق من أن التطبيق يتم بناؤه وتشغيله محلياً:
\n\ncargo build --release\n./target/release/rust-k8s-app\n\nافتح المتصفح على http://localhost:8080/health - يجب أن ترى استجابة JSON.
2. بناء صورة Docker
\n\nلنشر التطبيق على Kubernetes، نحتاج إلى تغليفه في صورة Docker. سنستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية.
\n\nأنشئ ملف Dockerfile في جذر المشروع:
# مرحلة البناء\nFROM rust:1.75-slim-bookworm AS builder\n\nWORKDIR /app\n\n# نسخ Cargo.toml فقط لتخزين التبعيات مؤقتاً\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo "fn main() {}" > src/main.rs\nRUN cargo build --release 2>/dev/null || true\n\n# الآن نسخ الكود المصدري الفعلي\nCOPY src ./src\nRUN cargo build --release\n\n# الصورة النهائية\nFROM debian:bookworm-slim\n\nRUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*\n\nCOPY --from=builder /app/target/release/rust-k8s-app /usr/local/bin/rust-k8s-app\n\nEXPOSE 8080\n\nCMD ["rust-k8s-app"]\n\nقم ببناء الصورة:
\n\ndocker build -t rust-k8s-app:latest .\n\nتحقق من حجم الصورة