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

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

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

ابدأ الدورة

مقدمة

\n\n

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

\n\n

المقالة موجهة للمطورين الذين لديهم معرفة أساسية بلغة Rust ولديهم فكرة أساسية عن Docker وKubernetes. لن نتعمق في النظرية، بل سنركز على التعليمات خطوة بخطوة مع أمثلة حقيقية للأكواد والأوامر.

\n\n

1. تحضير تطبيق Rust

\n\n

كمثال، سننشئ خادم HTTP بسيط باستخدام الإطار الشائع actix-web. سوف يستجيب لطلبات GET ويعيد استجابة JSON.

\n\n

أنشئ مشروعاً جديداً:

\n\n
cargo new rust-k8s-app\ncd rust-k8s-app
\n\n

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

\n\n
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"
\n\n

الآن لنكتب كود الخادم في src/main.rs:

\n\n
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\n
cargo build --release\n./target/release/rust-k8s-app
\n\n

افتح المتصفح على http://localhost:8080/health - يجب أن ترى استجابة JSON.

\n\n

2. بناء صورة Docker

\n\n

لنشر التطبيق على Kubernetes، نحتاج إلى تغليفه في صورة Docker. سنستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية.

\n\n

أنشئ ملف Dockerfile في جذر المشروع:

\n\n
# مرحلة البناء\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\n
docker build -t rust-k8s-app:latest .
\n\n

تحقق من حجم الصورة

المدونات

توصيات الكتب