Despliegue de Rust en Kubernetes: guía básica práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Despliegue de Rust en Kubernetes: guía básica práctica



Rust — uno de los lenguajes de programación de sistemas más rápidos y seguros. Kubernetes (k8s) — el estándar de facto para la orquestación de contenedores. Su combinación permite crear servicios extremadamente eficientes, ligeros y tolerantes a fallos. En este artículo analizaremos el ciclo completo de despliegue de una aplicación Rust en un clúster Kubernetes: desde la construcción de la imagen Docker hasta el escalado.



Por qué Rust y Kubernetes son la pareja ideal



Rust se compila en un archivo binario nativo, no requiere máquina virtual (como Java) ni intérprete (como Python). Esto proporciona un tamaño de imagen mínimo y un bajo consumo de memoria. En el contexto de Kubernetes, esto significa:

  • Inicio rápido de pods (a menudo menos de 1 segundo).
  • Ahorro de recursos del clúster.
  • Menos vulnerabilidades debido a la ausencia de runtimes pesados.


Paso 1: Creamos una aplicación Rust simple



Como ejemplo, escribiremos un servidor HTTP utilizando el popular framework actix-web. Cree un nuevo proyecto:

cargo new rust-k8s-democd rust-k8s-demo


Agregue las dependencias en Cargo.toml:

[dependencies]actix-web = "4"serde = { version = "1", features = ["derive"] }


Escribamos un manejador simple en src/main.rs:

use actix_web::{get, web, App, HttpServer, Responder};use std::env;

#[get("/")]async fn index() -> impl Responder { let message = env::var("MESSAGE").unwrap_or_else(|_| "Hello from Rust!".to_string()); format!("{{ \\"message\\": \\"{}\\" }}", message)}

#[actix_web::main]async fn main() -> std::io::Result<()> { let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string()); let addr = format!("0.0.0.0:{}", port); println!("Starting server at {}", addr);

HttpServer::new(|| { App::new() .service(index) }) .bind(&addr)? .run() .await}


La aplicación lee las variables de entorno MESSAGE y PORT — esto será útil para la configuración a través de Kubernetes ConfigMap.



Paso 2: Construcción de la imagen Docker



Usamos compilación en múltiples etapas (multi-stage build) para minimizar el tamaño de la imagen. Cree un Dockerfile:

# Etapa de compilaciónFROM rust:1.75-slim-bookworm 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

# Imagen finalFROM debian:bookworm-slimRUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*COPY --from=builder /app/target/release/rust-k8s-demo /usr/local/bin/rust-k8s-demo

EXPOSE 8080CMD ["rust-k8s-demo"]


Construya la imagen y envíela al registro (por ejemplo, Docker Hub):

docker build -t yourusername/rust-k8s-demo:latest .docker push yourusername/rust-k8s-demo:latest


Paso 3: Manifiestos de Kubernetes



Crearemos una carpeta k8s y colocaremos los manifiestos en ella.



3.1. ConfigMap para configuración

Cree el archivo k8s/configmap.yaml:

apiVersion: v1kind: ConfigMapmetadata:  name: rust-app-configdata:  MESSAGE: "¡Hola desde Rust en Kubernetes!"  PORT: "8080"


3.2. Deployment

Cree el archivo k8s/deployment.yaml:

apiVersion: apps/v1kind: Deploymentmetadata:  name: rust-appspec:  replicas: 3  selector:    matchLabels:      app: rust-app  template:    metadata:      labels:        app: rust-app    spec:      containers:      - name: rust-app        image: yourusername/rust-k8s-demo:latest        ports:        - containerPort: 8080        envFrom:        - configMapRef:            name: rust-app-config                

Blogs

Book Recommendations