Деплой Rust на Kubernetes: базовое руководство на практике

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Деплой Rust на Kubernetes: базовое руководство на практике

Rust — один из самых быстрых и безопасных языков системного программирования. Kubernetes (k8s) — стандарт де-факто для оркестрации контейнеров. Их комбинация позволяет создавать крайне эффективные, легковесные и отказоустойчивые сервисы. В этой статье мы разберем полный цикл деплоя Rust-приложения в кластер Kubernetes: от сборки Docker-образа до масштабирования.

Почему Rust и Kubernetes — идеальная пара

Rust компилируется в нативный бинарный файл, не требует виртуальной машины (как Java) или интерпретатора (как Python). Это дает минимальный размер образа и низкое потребление памяти. В контексте Kubernetes это означает:

  • Быстрый запуск подов (часто менее 1 секунды).
  • Экономия ресурсов кластера.
  • Меньше уязвимостей за счет отсутствия тяжелых рантаймов.

Шаг 1: Создаем простое Rust-приложение

Для примера напишем HTTP-сервер с использованием популярного фреймворка actix-web. Создайте новый проект:

cargo new rust-k8s-demo
cd rust-k8s-demo

Добавьте зависимости в Cargo.toml:

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

Напишем простой обработчик в 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
}

Приложение читает переменные окружения MESSAGE и PORT — это пригодится для настройки через Kubernetes ConfigMap.

Шаг 2: Сборка Docker-образа

Используем многоступенчатую сборку (multi-stage build) для минимизации размера образа. Создайте Dockerfile:

# Этап сборки
FROM rust:1.75-slim-bookworm AS builder

WORKDIR /app
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release 2>/dev/null || true

COPY src/ src/
RUN cargo build --release

# Финальный образ
FROM debian:bookworm-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-demo /usr/local/bin/rust-k8s-demo

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

Соберите образ и отправьте в реестр (например, Docker Hub):

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

Шаг 3: Манифесты Kubernetes

Создадим папку k8s и разместим в ней манифесты.

3.1. ConfigMap для конфигурации

Создайте файл k8s/configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: rust-app-config
data:
  MESSAGE: "Привет из Rust на Kubernetes!"
  PORT: "8080"

3.2. Deployment

Создайте файл k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rust-app
spec:
  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
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "250m"

Обратите внимание на resources — Rust-приложения потребляют мало памяти, поэтому мы установили низкие лимиты.

3.3. Сервис (Service)

Создайте файл k8s/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: rust-app-service
spec:
  selector:
    app: rust-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

Шаг 4: Деплой в кластер

Примените все манифесты одной командой:

kubectl apply -f k8s/

Проверьте статус подов:

kubectl get pods
kubectl get deployments
kubectl get services

Для тестирования можно использовать port-forward:

kubectl port-forward service/rust-app-service 8080:80

Теперь откройте http://localhost:8080 — вы должны увидеть JSON с сообщением из ConfigMap.

Шаг 5: Масштабирование и обновление

Масштабирование в Kubernetes тривиально:

kubectl scale deployment rust-app --replicas=5

Для обновления приложения (например, с новым тегом образа) используйте:

kubectl set image deployment/rust-app rust-app=yourusername/rust-k8s-demo:v2

Kubernetes выполнит rolling update без downtime.

Заключение

Мы разобрали полный цикл деплоя Rust-приложения на Kubernetes: создание HTTP-сервера на Actix-web, многоступенчатую сборку Docker-образа, настройку ConfigMap, Deployment и Service. Rust с его малым потреблением ресурсов и быстрым

Блоги

Рекомендаций по книгам