Implantação de C++ no Kubernetes: guia prático básico
Kubernetes (K8s) tornou-se o padrão de facto para orquestração de contêineres. Embora seja mais frequentemente associado a Go, Java ou Python, C++ também é ativamente utilizado para serviços de alta carga, onde o desempenho e o baixo consumo de memória são críticos. Neste artigo, abordaremos o processo prático de implantação de uma aplicação C++ em um cluster Kubernetes: desde a escrita de um servidor HTTP simples até a criação de manifestos e escalonamento.
1. Preparação da aplicação C++ e da imagem Docker
Para começar, criaremos uma aplicação C++ mínima que escutará requisições HTTP. Usaremos a biblioteca cpp-httplib (header-only) para simplificar.
Código-fonte (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 (construção em múltiplos estágios)
Para que a imagem seja compacta e segura, usamos multi-stage build:
# Estágio de construçãoFROM gcc:13-bookworm AS builderWORKDIR /appCOPY server.cpp .RUN g++ -std=c++17 -O2 -lpthread server.cpp -o server
# Imagem finalFROM debian:bookworm-slimWORKDIR /appCOPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Construa a imagem:
docker build -t cpp-k8s-demo:latest .Verifique localmente:
docker run -p 8080:8080 cpp-k8s-democurl http://localhost:8080/2. Escrita dos manifestos Kubernetes
Para a implantação, precisaremos de dois recursos principais: Deployment (gerenciamento de pods) e Service (acesso de rede).
Deployment (deployment.yaml)
Define quantas réplicas executar, a política de atualização e a imagem do contêiner.
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"Importante: imagePullPolicy: IfNotPresent é adequado para testes locais. Para produção, use Always ou especifique uma tag de versão.
Service (service.yaml)
Disponibiliza acesso aos pods dentro do cluster (ClusterIP) ou externamente (NodePort/LoadBalancer).
apiVersion: v1kind: Servicemetadata: name: cpp-app-servicespec: selector: app: cpp-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer3. Implantação no cluster e verificação
Supondo que você já tenha um cluster em funcionamento (Minikube, kind ou em nuvem). Execute os comandos:
# Carregue a imagem no cluster (para Minikube)minikube image load cpp-k8s-demo:latest
# Aplique os manifestoskubectl apply -f deployment.yamlkubectl apply -f service.yaml
# Verifique o statuskubectl get pods -l app=cpp-appkubectl get svc cpp-app-service