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

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

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

Начать курс

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

Kubernetes (K8s) стал стандартом де-факто для оркестрации контейнеров. Хотя чаще всего с ним ассоциируют Go, Java или Python, C++ также активно используется для высоконагруженных сервисов, где критичны производительность и низкое потребление памяти. В этой статье мы разберем практический процесс деплоя C++ приложения в кластер Kubernetes: от написания простого HTTP-сервера до создания манифестов и масштабирования.

1. Подготовка C++ приложения и Docker-образа

Для начала создадим минимальное C++ приложение, которое будет слушать HTTP-запросы. Используем библиотеку cpp-httplib (header-only) для простоты.

Исходный код (server.cpp)

#include <httplib.h>
#include <iostream>

int main() {
    using namespace httplib;
    Server svr;

    svr.Get("/", [](const Request& req, Response& res) {
        res.set_content("Hello from C++ on Kubernetes!", "text/plain");
    });

    svr.Get("/health", [](const Request& req, Response& res) {
        res.set_content("OK", "text/plain");
    });

    std::cout << "Server started on port 8080" << std::endl;
    svr.listen("0.0.0.0", 8080);
    return 0;
}

Dockerfile (многоступенчатая сборка)

Чтобы образ был компактным и безопасным, используем multi-stage build:

# Этап сборки
FROM gcc:13-bookworm AS builder
WORKDIR /app
COPY server.cpp .
RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server

# Финальный образ
FROM debian:bookworm-slim
WORKDIR /app
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]

Соберите образ:

docker build -t cpp-k8s-demo:latest .

Проверьте локально:

docker run -p 8080:8080 cpp-k8s-demo
curl http://localhost:8080/

2. Написание манифестов Kubernetes

Для деплоя нам понадобятся два основных ресурса: Deployment (управление подами) и Service (сетевой доступ).

Deployment (deployment.yaml)

Определяет, сколько реплик запускать, политику обновлений и образ контейнера.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cpp-app-deployment
  labels:
    app: cpp-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cpp-app
  template:
    metadata:
      labels:
        app: cpp-app
    spec:
      containers:
      - name: cpp-app
        image: cpp-k8s-demo:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"

Важно: imagePullPolicy: IfNotPresent подходит для локального тестирования. Для продакшена используйте Always или указывайте тег версии.

Service (service.yaml)

Открывает доступ к подам внутри кластера (ClusterIP) или наружу (NodePort/LoadBalancer).

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

3. Деплой в кластер и проверка

Предположим, у вас уже есть работающий кластер (Minikube, kind или облачный). Выполните команды:

# Загрузите образ в кластер (для Minikube)
minikube image load cpp-k8s-demo:latest

# Примените манифесты
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# Проверьте статус
kubectl get pods -l app=cpp-app
kubectl get svc cpp-app-service

Если используется Minikube, получите внешний URL:

minikube service cpp-app-service --url

После этого выполните запрос:

curl http://<URL>/

Вы должны увидеть: Hello from C++ on Kubernetes!

4. Масштабирование и обновление

Горизонтальное масштабирование

Увеличьте количество реплик:

kubectl scale deployment cpp-app-deployment --replicas=5

Проверьте:

kubectl get pods

Rolling Update (обновление без downtime)

Измените код, пересоберите образ с новым тегом и обновите манифест:

# Сборка с новым тегом
docker build -t cpp-k8s-demo:v2 .
minikube image load cpp-k8s-demo:v2

# Обновление образа в манифесте
kubectl set image deployment/cpp-app-deployment cpp-app=cpp-k8s-demo:v2

# Следите за процессом
kubectl rollout status deployment/cpp-app-deployment

Kubernetes выполнит постепенное обновление, заменяя старые поды новыми.

Заключение

Мы рассмотрели полный цикл деплоя C++ приложения в Kubernetes: от написания кода и Docker-сборки до создания манифестов, запуска и масштабирования. Ключевые выводы:

  • C++ отлично подходит для высокопроизводительных микросервисов в K8s.
  • Многоступенчатая сборка Docker позволяет получить минимальный образ.
  • Liveness-пробы обязательны для автоматического восстановления подов.
  • Kubernetes упрощает масштабирование и обновление без простоев.

Это базовое руководство — отправная точка. Для продакшена добавьте ConfigMap, Secrets, Ingress и настройте мониторинг (Prometheus + Grafana). Удачи в деплое!

Блоги

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