将 C++ 部署到 Kubernetes:基础实践指南

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

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

开始课程

引言:为什么 C++ 和 Kubernetes 是有效的组合

\n\n

许多开发者错误地认为 Kubernetes (K8s) 是专为 Python、JavaScript 或 Go 等解释型语言打造的生态系统。实际上,将 C++ 部署到 Kubernetes 不仅可行,而且对于性能、低内存消耗和可预测响应时间至关重要的高负载系统来说,是一种极其高效的做法。C++ 非常适合构建后端服务、数据处理程序、游戏服务器和网络应用程序,而 Kubernetes 则为它们的编排、扩展和管理提供了便捷的平台。

\n\n

在本实践指南中,我们将逐步讲解如何将 C++ 应用程序构建成 Docker 镜像,编写正确的 Kubernetes 清单,并将其部署到集群中。您将看到,只要正确配置构建过程,该流程与部署其他语言的应用程序几乎没有区别。

\n\n

1. 准备 C++ 应用程序并编写 Dockerfile

\n\n

首先,我们需要一个简单但可运行的 C++ 应用程序。假设它是一个 HTTP 服务器,监听端口并返回 "Hello from C++ on K8s!"。在实际项目中,它可以是基于 Crow、Pistache 或 Drogon 的 REST API。

\n\n

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\n

现在我们来编写 Dockerfile。关键点在于使用 多阶段构建 (multi-stage build)。这有助于保持最终镜像的最小化和安全性。

\n\n
# 构建阶段\nFROM gcc:latest AS builder\nWORKDIR /app\nCOPY main.cpp .\nRUN g++ -static -o server main.cpp\n\n# 最终镜像(最小化)\nFROM alpine:latest\nWORKDIR /app\n# 仅复制编译好的二进制文件\nCOPY --from=builder /app/server .\nEXPOSE 8080\nCMD ["./server"]
\n\n

构建镜像并推送到仓库(例如 Docker Hub):

\n
docker build -t yourusername/cpp-server:latest .\ndocker push yourusername/cpp-server:latest
\n\n

2. 编写 Kubernetes 清单

\n\n

要将 C++ 应用程序部署到 Kubernetes,我们至少需要两个对象:Deployment(用于管理 Pod)和 Service(用于提供对应用程序的访问)。

\n\n

Deployment 清单 (deployment.yaml)

\n
apiVersion: 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                

博客

书籍推荐