Déploiement de C++ sur Kubernetes : guide pratique de base
Kubernetes (K8s) est devenu le standard de facto pour l'orchestration de conteneurs. Bien qu'il soit le plus souvent associé à Go, Java ou Python, C++ est également activement utilisé pour les services à forte charge où les performances et la faible consommation de mémoire sont critiques. Dans cet article, nous allons détailler le processus pratique de déploiement d'une application C++ dans un cluster Kubernetes : de l'écriture d'un simple serveur HTTP à la création de manifestes et à la mise à l'échelle.
1. Préparation de l'application C++ et de l'image Docker
Pour commencer, créons une application C++ minimale qui écoutera les requêtes HTTP. Nous utiliserons la bibliothèque cpp-httplib (header-only) pour plus de simplicité.
Code source (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 (construction multi-étapes)
Pour que l'image soit compacte et sécurisée, utilisons une construction multi-étapes :
# Étape de constructionFROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server
# Image finaleFROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Construisez l'image :
docker build -t cpp-k8s-demo:latest .Testez localement :
docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/2. Rédaction des manifestes Kubernetes
Pour le déploiement, nous aurons besoin de deux ressources principales : Deployment (gestion des pods) et Service (accès réseau).
Deployment (deployment.yaml)
Définit le nombre de réplicas à exécuter, la politique de mise à jour et l'image du conteneur.
apiVersion: apps/v1kind: Deploymentmetadata: name: cpp-app-deployment labels: app: cpp-appspec: 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"Important : imagePullPolicy: IfNotPresent convient pour les tests locaux. Pour la production, utilisez Always ou spécifiez une balise de version.
Service (service.yaml)
Ouvre l'accès aux pods à l'intérieur du cluster (ClusterIP) ou vers l'extérieur (NodePort/LoadBalancer).
apiVersion: v1kind: Servicemetadata: name: cpp-app-servicespec: selector: app: cpp-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer3. Déploiement dans le cluster et vérification
Supposons que vous ayez déjà un cluster fonctionnel (Minikube, kind ou cloud). Exécutez les commandes :
# Chargez l'image dans le cluster (pour Minikube)minikube image load cpp-k8s-demo:latest
# Appliquez les manifesteskubectl apply -f deployment.yamlkubectl apply -f service.yaml
# Vérifiez le statutkubectl get pods -l app=cpp-appkubectl get svc cpp-app-service