نشر Rust على Kubernetes: دليل أساسي للمبتدئين
\n\nالتطوير الحديث يتطلب بشكل متزايد ليس فقط كتابة كود سريع وآمن، ولكن أيضًا القدرة على نشره بشكل صحيح في البنية التحتية السحابية. Rust، المعروفة بأدائها العالي وأمان الذاكرة، أصبحت خيارًا ممتازًا للخدمات المصغرة. و Kubernetes - منسق الحاويات القياسي - يساعد في إدارة هذه الخدمات على نطاق واسع.
\n\nفي هذه المقالة، سنمر بالمسار الكامل بدءًا من كتابة خادم ويب بسيط بلغة Rust وحتى نشره في مجموعة Kubernetes. ستتعلم كيفية حزم التطبيق في صورة Docker، وإنشاء المانيفستات اللازمة، وتشغيله في السحابة.
\n\n1. تحضير تطبيق Rust للحاويات
\n\nللبدء، سننشئ تطبيق ويب بسيط بلغة Rust باستخدام الإطار الشهير actix-web. سيعيد رسالة JSON بسيطة - مثال مثالي للخدمة المصغرة.
أنشئ مشروعًا جديدًا:
\ncargo new rust-k8s-demo\ncd rust-k8s-demo\n\nأضف التبعية في Cargo.toml:
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\ntokio = { version = "1", features = ["full"] }\n\nالآن لنكتب كود التطبيق في src/main.rs:
use actix_web::{web, App, HttpServer, Responder, HttpResponse};\nuse serde::Serialize;\n\n#[derive(Serialize)]\nstruct HealthResponse {\n status: String,\n message: String,\n}\n\nasync fn health_check() -> impl Responder {\n HttpResponse::Ok().json(HealthResponse {\n status: "ok".to_string(),\n message: "Rust service is running on Kubernetes!".to_string(),\n })\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n println!("Starting server on 0.0.0.0:8080");\n HttpServer::new(|| {\n App::new()\n .route("/health", web::get().to(health_check))\n })\n .bind("0.0.0.0:8080")?\n .run()\n .await\n}\n\nلاحظ: نحن نربط بـ 0.0.0.0:8080، لأنه داخل الحاوية يجب أن يستمع التطبيق إلى جميع الواجهات. اختبر محليًا:
cargo run\n\nافتح http://localhost:8080/health - يجب أن ترى استجابة JSON.
2. إنشاء صورة Docker مع تطبيق Rust
\n\nبالنسبة لـ Kubernetes، نحتاج إلى حاوية. Rust يُترجم إلى ملف ثنائي أصلي، لذلك يمكننا استخدام البناء متعدد المراحل (multi-stage build) للحصول على صورة صغيرة الحجم.
\n\nأنشئ ملف Dockerfile في جذر المشروع:
# مرحلة البناء\nFROM rust:1.75-slim-bookworm AS builder\n\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo "fn main() {}" > src/main.rs\nRUN cargo build --release 2>/dev/null || true\n\nCOPY src/ src/\nRUN cargo build --release\n\n# الصورة النهائية\nFROM debian:bookworm-slim\nRUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*\nCOPY --from=builder /app/target/release/rust-k8s-demo /usr/local/bin/rust-k8s-demo\n\nEXPOSE 8080\nCMD ["rust-k8s-demo"]\n\nيقوم هذا الـ Dockerfile أولاً ببناء التبعيات، ثم يترجم الكود الخاص بنا وينسخ الملف الثنائي إلى صورة صغيرة مبنية على Debian. هذا يوفر المساحة ويعزز الأمان.
\n\nقم ببناء الصورة:
\ndocker build -t rust-k8s-demo:latest .\n\nاختبر الحاوية محليًا:
\ndocker run -p 8080:8080 rust-k8s-demo:latest\n\nإذا كان كل شيء يعمل - قم بتحميل الصورة إلى السجل (مثل Docker Hub):
\ndocker tag rust-k8s-demo:latest yourusername/rust-k8s-demo:v1\ndocker push yourusername/rust-k8s-demo:v1\n\n3. إعداد مانيفستات Kubernetes
\n\nالآن بعد أن أصبحت الصورة جاهزة، نحتاج إلى إنشاء مانيفستات لـ Kubernetes. سننشئ Deployment (لإدارة النسخ المتماثلة) و Service (لـ