Introduction: Why C++ and Kubernetes is a Working Combination
\n\nMany developers mistakenly believe that Kubernetes (K8s) is an ecosystem exclusively for interpreted languages like Python, JavaScript, or Go. In reality, deploying C++ on Kubernetes is not only possible but also an extremely effective practice for high-load systems where performance, low memory consumption, and predictable response times are critical. C++ is excellent for creating backend services, data processors, game servers, and network applications, while Kubernetes provides a convenient platform for their orchestration, scaling, and management.
\n\nIn this practical guide, we will walk through step-by-step how to build a C++ application into a Docker image, write a correct manifest for Kubernetes, and deploy it in a cluster. You will see that the process is almost no different from deploying applications in other languages, if you set up the build correctly.
\n\n1. Preparing the C++ Application and Writing the Dockerfile
\n\nTo start, we need a simple but functional C++ application. Let it be an HTTP server that listens on a port and returns "Hello from C++ on K8s!". In real projects, this could be a REST API based on Crow, Pistache, or Drogon.
\n\nExample main.cpp file:
\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\nNow let's write the Dockerfile. The key point is to use a multi-stage build. This allows keeping the final image minimal and secure.
\n\n# Build stage\nFROM gcc:latest AS builder\nWORKDIR /app\nCOPY main.cpp .\nRUN g++ -static -o server main.cpp\n\n# Final image (minimal)\nFROM alpine:latest\nWORKDIR /app\n# Copy only the compiled binary\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]\n\nBuild the image and push it to a registry (e.g., Docker Hub):
\ndocker build -t yourusername/cpp-server:latest .\ndocker push yourusername/cpp-server:latest\n\n2. Writing Manifests for Kubernetes
\n\nTo deploy a C++ application in Kubernetes, we will need at least two objects: a Deployment (to manage Pods) and a Service (to provide access to the application).
\n\nDeployment Manifest (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: yourusername/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