将 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: LoadBalancer3. 部署到集群并进行验证
假设您已经有一个正在运行的集群(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