Деплой 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). Удачи в деплое!