Despliegue de C++ en Kubernetes: guía básica práctica
Kubernetes (K8s) se ha convertido en el estándar de facto para la orquestación de contenedores. Aunque a menudo se asocia con Go, Java o Python, C++ también se utiliza activamente para servicios de alta carga donde el rendimiento y el bajo consumo de memoria son críticos. En este artículo, analizaremos el proceso práctico de despliegue de una aplicación C++ en un clúster de Kubernetes: desde escribir un servidor HTTP simple hasta crear manifiestos y escalar.
1. Preparación de la aplicación C++ y la imagen Docker
Para empezar, crearemos una aplicación mínima en C++ que escuche solicitudes HTTP. Usaremos la biblioteca cpp-httplib (solo header) para simplificar.
Código fuente (server.cpp)
#include <httplib.h>#include <iostream>
int main() { using namespace httplib; Server svr;
svr.Get("/", [](const Request& req, Response& res) { res.set_content("¡Hola desde C++ en Kubernetes!", "text/plain"); });
svr.Get("/health", [](const Request& req, Response& res) { res.set_content("OK", "text/plain"); });
std::cout << "Servidor iniciado en el puerto 8080" << std::endl; svr.listen("0.0.0.0", 8080); return 0;}Dockerfile (compilación multi-etapa)
Para que la imagen sea compacta y segura, usamos una compilación multi-etapa:
# Etapa de compilaciónFROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server
# Imagen finalFROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Construya la imagen:
docker build -t cpp-k8s-demo:latest .Verifique localmente:
docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/2. Escritura de manifiestos de Kubernetes
Para el despliegue necesitaremos dos recursos principales: Deployment (gestión de pods) y Service (acceso de red).
Deployment (deployment.yaml)
Define cuántas réplicas ejecutar, la política de actualización y la imagen del contenedor.
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"Importante: imagePullPolicy: IfNotPresent es adecuado para pruebas locales. Para producción, use Always o especifique una etiqueta de versión.
Service (service.yaml)
Abre el acceso a los pods dentro del clúster (ClusterIP) o hacia el exterior (NodePort/LoadBalancer).
apiVersion: v1kind: Servicemetadata: name: cpp-app-servicespec: selector: app: cpp-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer3. Despliegue en el clúster y verificación
Supongamos que ya tiene un clúster en funcionamiento (Minikube, kind o en la nube). Ejecute los comandos:
# Cargue la imagen en el clúster (para Minikube)minikube image load cpp-k8s-demo:latest
# Aplique los manifiestoskubectl apply -f deployment.yamlkubectl apply -f service.yaml
# Verifique el estadokubectl get pods -l app=cpp-appkubectl get svc cpp-app-service