将 Rust 部署到 Kubernetes:基础实践指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言

\n\n

Rust 是一种现代系统编程语言,它结合了 C/C++ 的高性能与编译级别的内存安全性。由于没有垃圾回收器且资源消耗低,Rust 应用程序非常适合在容器环境中运行。Kubernetes (K8s) 是容器编排的事实标准。在本指南中,我们将实践讲解如何构建一个简单的 Rust Web 应用程序,将其打包成 Docker 镜像,并部署到 Kubernetes 集群中。

\n\n

本文面向已经熟悉 Rust 基础知识并对 Docker 和 Kubernetes 有基本了解的开发者。我们不会深入理论,而是专注于提供带有真实代码和命令示例的分步说明。

\n\n

1. 准备 Rust 应用程序

\n\n

作为示例,我们将使用流行的框架 actix-web 创建一个最小的 HTTP 服务器。它将响应 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 镜像。我们将使用多阶段构建来最小化最终镜像的大小。

\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

检查镜像大小

博客

书籍推荐