نشر Rust على Kubernetes: دليل أساسي
يتطلب التطوير السحابي الحديث من التطبيقات أداءً عاليًا وأمانًا واستخدامًا فعالًا للموارد. Rust، مع نظام الملكية الخاص بها وتكلفة الصفر للتجريدات، مثالية لإنشاء الخدمات المصغرة التي تعمل في منسقات الحاويات. Kubernetes، بدورها، توفر مجموعة أدوات قوية لإدارة التطبيقات المحتواة. في هذا الدليل، سنشرح خطوة بخطوة كيفية تحضير تطبيق Rust للنشر على Kubernetes، وإنشاء صورة Docker، ونشرها في الكتلة.
1. تحضير تطبيق Rust
قبل نشر التطبيق على Kubernetes، يجب حوسبته. للتوضيح، سننشئ تطبيق HTTP بسيطًا يعتمد على إطار العمل actix-web، والذي سيرد على الطلبات ويعيد معلومات أساسية عن النظام.
لننشئ مشروعًا جديدًا:
cargo new rust-k8s-appcd rust-k8s-appلنضف التبعيات إلى Cargo.toml:
[dependencies]actix-web = "4"serde = { version = "1.0", features = ["derive"] }tokio = { version = "1", features = ["full"] }لنكتب تطبيقًا بسيطًا في src/main.rs:
use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};use serde::Serialize;
#[derive(Serialize)]struct HealthResponse { status: String, version: String,}
#[get("/health")]async fn health_check() -> impl Responder { HttpResponse::Ok().json(HealthResponse { status: "ok".to_string(), version: env!("CARGO_PKG_VERSION").to_string(), })}
#[get("/")]async fn index() -> impl Responder { HttpResponse::Ok().body("Rust on Kubernetes! 🚀")}
#[actix_web::main]async fn main() -> std::io::Result<()> { let host = std::env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string()); let port: u16 = std::env::var("PORT") .unwrap_or_else(|_| "8080".to_string()) .parse() .expect("PORT must be a number");
println!("Starting server at {}:{}", host, port);
HttpServer::new(|| { App::new() .service(health_check) .service(index) }) .bind((host.as_str(), port))? .run() .await}لنتحقق من أن التطبيق يتم تجميعه وتشغيله محليًا:
cargo build --releasecargo run --releaseبعد التشغيل، افتح المتصفح وانتقل إلى العنوان http://localhost:8080/health — يجب أن ترى JSON مع الرد.
2. إنشاء صورة Docker لتطبيق Rust
لتقليل حجم الصورة وتسريع البناء، سنستخدم البناء متعدد المراحل (multi-stage build). المرحلة الأولى هي تجميع التطبيق، والثانية هي إنشاء صورة صغيرة تعتمد على scratch أو alpine.
أنشئ ملف Dockerfile في جذر المشروع:
# المرحلة 1: البناءFROM rust:1.75-slim-buster 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
# المرحلة 2: صورة صغيرةFROM debian:buster-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*COPY --from=builder /app/target/release/rust-k8s-app /usr/local/bin/rust-k8s-app
EXPOSE 8080CMD ["rust-k8s-app"]قم ببناء الصورة:
docker build -t rust-k8s-app:latest .تحقق من أن الصورة تعمل:
docker run -p 8080:8080 rust-k8s-app:latestثم أرسل الصورة إلى Docker Hub أو أي سجل حاويات آخر، مع استبدال username باسم المستخدم الخاص بك:
docker tag rust-k8s-app:latest username/rust-k8s-app:latestdocker push user