引言
\n\nRust 是一种现代系统编程语言,它结合了 C/C++ 的高性能与编译级别的内存安全性。由于没有垃圾回收器且资源消耗低,Rust 应用程序非常适合在容器环境中运行。Kubernetes (K8s) 是容器编排的事实标准。在本指南中,我们将实践讲解如何构建一个简单的 Rust Web 应用程序,将其打包成 Docker 镜像,并部署到 Kubernetes 集群中。
\n\n本文面向已经熟悉 Rust 基础知识并对 Docker 和 Kubernetes 有基本了解的开发者。我们不会深入理论,而是专注于提供带有真实代码和命令示例的分步说明。
\n\n1. 准备 Rust 应用程序
\n\n作为示例,我们将使用流行的框架 actix-web 创建一个最小的 HTTP 服务器。它将响应 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 镜像。我们将使用多阶段构建来最小化最终镜像的大小。
\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检查镜像大小