将 C++ 部署到 Kubernetes:初学者基础指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么要在 Kubernetes 中部署 C++?



C++ 仍然是性能最高的编程语言之一,尤其是在高负载系统、游戏服务器、金融应用和物联网领域。然而,在当今的云计算世界中,仅仅编写快速代码是不够的——您需要能够可靠地部署、扩展和更新它,而不会造成停机。这正是 Kubernetes (K8s) 发挥作用的地方——它是一个容器编排系统,可以自动执行应用程序的部署、扩展和管理。



在本指南中,我们将逐步介绍如何将简单的 C++ 应用程序部署到 Kubernetes 集群中。您将学习如何将 C++ 代码打包到 Docker 镜像中,编写必要的 Kubernetes 清单文件,并在云中运行您的应用程序。本文面向初学者,因此我们不会深入复杂的配置,而是专注于一个基础但可用的流水线。



1. 准备工作:C++ 应用程序和 Docker 容器化



在讨论 Kubernetes 之前,我们需要让我们的 C++ 应用程序准备好在一个容器中运行。容器化是将应用程序及其所有依赖项打包到一个隔离环境中的过程。对于 C++ 来说,这至关重要,因为编译后的二进制文件可能依赖于目标机器上特定版本的库(如 libc、libstdc++ 等)。



1.1. 用于部署的简单 C++ 应用程序



让我们创建一个文件 main.cpp —— 一个简单的 HTTP 服务器,它将响应请求。为简单起见,我们不会使用外部库,而是编写一个原始的 TCP 服务器。



// main.cpp#include <iostream>#include <string>#include <cstring>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>

int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char* hello = "HTTP/1.1 200 OKContent-Type: text/plainContent-Length: 12

Hello, K8s!";

// 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); }

// 绑定到端口 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080);

if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); }

if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); }

std::cout << "Server listening on port 8080" << std::endl;

while(true) { if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } read(new_socket, buffer, 1024); send(new_socket, hello, strlen(hello), 0); close(new_socket); } return 0;}


1.2. 构建静态二进制文件



为了使我们的容器尽可能小并且不依赖于主机的系统库,最好构建一个静态链接的二进制文件。执行以下命令:



g++ -static -o server main.cpp -lpthread


-static 标志将所有必需的库直接包含到可执行文件中。-lpthread 标志用于线程支持(虽然在我们的简单示例中不是必需的,但对于实际项目会很有用)。



1.3. 用于 C++ 应用程序的 Dockerfile



现在让我们创建一个 Dockerfile。我们将使用多阶段构建:首先在带有编译器的大型镜像中编译代码,然后

博客

书籍推荐