在Kubernetes上部署C++:基础指南

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

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

开始课程

介绍:为什么C++和Kubernetes是强大的组合



现代云基础设施越来越多地建立在微服务架构和容器化之上。Kubernetes已成为容器编排的事实标准。然而,许多开发者错误地认为Kubernetes只适用于解释型语言(Python、JavaScript)或JVM。实际上,在Kubernetes中部署C++应用程序不仅可行,而且具有显著优势:高性能、极低的内存消耗以及对资源的完全控制。



在本指南中,我们将讲解如何将C++服务器打包成Docker镜像,创建Kubernetes所需的清单文件,并在集群中运行它。您将学习如何处理配置和密钥,以及如何正确设置Health Checks以确保应用程序的可靠运行。



1. 准备用于容器化的C++应用程序



在讨论Kubernetes之前,需要先准备好C++应用程序本身。作为示例,我们将基于libmicrohttpd库创建一个简单的HTTP服务器。该服务器将响应请求并从环境变量中读取配置——这是12-factor应用程序的标准方法。



1.1. C++简单HTTP服务器代码



创建文件main.cpp:



#include <iostream>#include <string>#include <microhttpd.h>#include <cstdlib>

static enum MHD_Result answer_to_connection(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls) { const char *page = "<html><body>Hello from C++ on Kubernetes!</body></html>"; struct MHD_Response *response = MHD_create_response_from_buffer(strlen(page), (void*)page, MHD_RESPMEM_PERSISTENT); int ret = MHD_queue_response(connection, MHD_HTTP_OK, response); MHD_destroy_response(response); return ret == MHD_YES ? MHD_OK : MHD_NO;}

int main() { const char* port_str = std::getenv("PORT"); unsigned int port = port_str ? std::stoul(port_str) : 8080;

std::cout << "Starting server on port " << port << std::endl; struct MHD_Daemon *daemon = MHD_start_daemon(MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD, port, nullptr, nullptr, &answer_to_connection, nullptr, MHD_OPTION_END); if (nullptr == daemon) { std::cerr << "Failed to start daemon" << std::endl; return 1; }

// 无限等待 while (true) { sleep(1); }

MHD_stop_daemon(daemon); return 0;}


这段代码从环境变量PORT中读取端口(默认值为8080)并启动HTTP服务器。请注意:我们使用了无限循环,以确保进程不会终止——这对于在容器中运行非常重要。



1.2. 构建应用程序



构建需要CMake。创建CMakeLists.txt:



cmake_minimum_required(VERSION 3.10)project(cpp-k8s-server)

find_package(libmicrohttpd REQUIRED)

add_executable(server main.cpp)target_link_libraries(server ${LIBMICROHTTPD_LIBRARIES})target_include_directories(server PRIVATE ${LIBMICROHTTPD_INCLUDE_DIRS})


现在应用程序已准备好进行容器化。



2. 为C++应用程序创建Docker镜像



Kubernetes使用容器运行,因此我们需要一个Docker镜像。对于C

博客

书籍推荐