Introducción: Por qué C++ y Kubernetes son una combinación funcional
\n\nMuchos desarrolladores creen erróneamente que Kubernetes (K8s) es un ecosistema exclusivo para lenguajes interpretados como Python, JavaScript o Go. En realidad, desplegar C++ en Kubernetes no solo es posible, sino que es una práctica extremadamente eficaz para sistemas de alta carga donde el rendimiento, el bajo consumo de memoria y el tiempo de respuesta predecible son críticos. C++ es ideal para crear servicios backend, procesadores de datos, servidores de juegos y aplicaciones de red, mientras que Kubernetes proporciona una plataforma conveniente para su orquestación, escalado y gestión.
\n\nEn esta guía práctica, repasaremos paso a paso cómo compilar una aplicación C++ en una imagen Docker, escribir un manifiesto correcto para Kubernetes y desplegarlo en un clúster. Verá que el proceso casi no difiere del despliegue de aplicaciones en otros lenguajes, si se configura correctamente la compilación.
\n\n1. Preparación de la aplicación C++ y escritura del Dockerfile
\n\nPara empezar, necesitamos una aplicación C++ simple pero funcional. Que sea un servidor HTTP que escuche en un puerto y devuelva "Hello from C++ on K8s!". En proyectos reales, podría ser una API REST basada en Crow, Pistache o Drogon.
\n\nEjemplo del archivo main.cpp:
\n#include <iostream>\n#include <string>\n#include <cstring>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\nint main() {\n int server_fd = socket(AF_INET, SOCK_STREAM, 0);\n struct sockaddr_in address;\n int opt = 1;\n setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n address.sin_family = AF_INET;\n address.sin_addr.s_addr = INADDR_ANY;\n address.sin_port = htons(8080);\n bind(server_fd, (struct sockaddr *)&address, sizeof(address));\n listen(server_fd, 3);\n\n std::cout << "Server started on port 8080" << std::endl;\n\n while (true) {\n int new_socket = accept(server_fd, nullptr, nullptr);\n const char *response = "HTTP/1.1 200 OK\\nContent-Type: text/plain\\n\\nHello from C++ on K8s!\\n";\n send(new_socket, response, strlen(response), 0);\n close(new_socket);\n }\n return 0;\n}\n\nAhora escribamos el Dockerfile. El punto clave es usar una compilación multi-etapa (multi-stage build). Esto permite mantener la imagen final mínima y segura.
\n\n# Etapa de compilación\nFROM gcc:latest AS builder\nWORKDIR /app\nCOPY main.cpp .\nRUN g++ -static -o server main.cpp\n\n# Imagen final (mínima)\nFROM alpine:latest\nWORKDIR /app\n# Copiamos solo el binario compilado\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]\n\nConstruimos la imagen y la subimos a un registro (por ejemplo, Docker Hub):
\ndocker build -t tunombredeusuario/cpp-server:latest .\ndocker push tunombredeusuario/cpp-server:latest\n\n2. Escritura de manifiestos para Kubernetes
\n\nPara desplegar una aplicación C++ en Kubernetes necesitaremos al menos dos objetos: un Deployment (para gestionar los Pods) y un Service (para proporcionar acceso a la aplicación).
\n\nManifiesto del Deployment (deployment.yaml)
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: cpp-server-deployment\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: cpp-server\n template:\n metadata:\n labels:\n app: cpp-server\n spec:\n containers:\n - name: cpp-server\n image: tunombredeusuario/cpp-server:latest\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "64Mi"\n cpu: "100m"\n limits:\n memory: "128Mi"\n cpu: "200m"\n livenessProbe:\n tcpSocket:\n port: 8080\n initialDelaySeconds: 5\n per