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

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

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

开始课程

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



Kubernetes (K8s) 已成为容器编排的事实标准。虽然通常人们会将其与 Go、Java 或 Python 关联,但 C++ 也广泛用于对性能要求高、内存消耗低的高负载服务。在本文中,我们将讲解将 C++ 应用部署到 Kubernetes 集群的实际流程:从编写一个简单的 HTTP 服务器,到创建清单和进行扩展。



1. 准备 C++ 应用和 Docker 镜像

首先,我们创建一个最小的 C++ 应用,用于监听 HTTP 请求。为简单起见,我们使用 cpp-httplib 库(仅头文件)。



源代码 (server.cpp)

#include <httplib.h>#include <iostream>

int main() { using namespace httplib; Server svr;

svr.Get("/", [](const Request& req, Response& res) { res.set_content("Hello from C++ on Kubernetes!", "text/plain"); });

svr.Get("/health", [](const Request& req, Response& res) { res.set_content("OK", "text/plain"); });

std::cout << "Server started on port 8080" << std::endl; svr.listen("0.0.0.0", 8080); return 0;}


Dockerfile (多阶段构建)

为了使镜像小巧且安全,我们使用多阶段构建:

# 构建阶段FROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server

# 最终镜像FROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]


构建镜像:

docker build -t cpp-k8s-demo:latest .


本地验证:

docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/


2. 编写 Kubernetes 清单

部署需要两个主要资源:Deployment(管理 Pod)和 Service(网络访问)。



Deployment (deployment.yaml)

定义要运行的副本数、更新策略和容器镜像。

apiVersion: apps/v1kind: Deploymentmetadata:  name: cpp-app-deployment  labels:    app: cpp-appspec:  replicas: 3  selector:    matchLabels:      app: cpp-app  template:    metadata:      labels:        app: cpp-app    spec:      containers:      - name: cpp-app        image: cpp-k8s-demo:latest        imagePullPolicy: IfNotPresent        ports:        - containerPort: 8080        livenessProbe:          httpGet:            path: /health            port: 8080          initialDelaySeconds: 5          periodSeconds: 10        resources:          requests:            memory: "64Mi"            cpu: "100m"          limits:            memory: "128Mi"            cpu: "200m"


重要提示: imagePullPolicy: IfNotPresent 适用于本地测试。对于生产环境,请使用 Always 或指定版本标签。



Service (service.yaml)

提供对集群内部 (ClusterIP) 或外部 (NodePort/LoadBalancer) Pod 的访问。

apiVersion: v1kind: Servicemetadata:  name: cpp-app-servicespec:  selector:    app: cpp-app  ports:  - protocol: TCP    port: 80    targetPort: 8080  type: LoadBalancer


3. 部署到集群并进行验证

假设您已经有一个正在运行的集群(Minikube、kind 或云集群)。执行以下命令:



# 将镜像加载到集群中(适用于 Minikube)minikube image load cpp-k8s-demo:latest

# 应用清单kubectl apply -f deployment.yamlkubectl apply -f service.yaml

# 检查状态kubectl get pods -l app=cpp-appkubectl get svc cpp-app-service

博客

书籍推荐