Introdução: Por que Kubernetes para Node.js?
Aplicações web modernas em JavaScript (Node.js) exigem alta disponibilidade, escalabilidade e tolerância a falhas. Quando sua aplicação vai além de um único servidor, o gerenciamento manual se torna um pesadelo. É aqui que o Kubernetes (K8s) entra em ação — um sistema de orquestração de contêineres que automatiza a implantação, o escalonamento e o gerenciamento de aplicações.
Neste guia, percorreremos o caminho completo: desde uma aplicação Node.js simples até sua execução em um ambiente semelhante ao de produção no Kubernetes. Você aprenderá como empacotar o código em uma imagem Docker, criar os recursos K8s necessários (Pod, Deployment, Service) e configurar o acesso externo.
1. Preparação da aplicação em Node.js
Para começar, vamos criar uma aplicação Express simples. Ela responderá a requisições HTTP e exibirá o nome do host do contêiner (útil para verificar o balanceamento de carga).
1.1. Arquivo app.js
const express = require('express');const os = require('os');
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!', hostname: os.hostname(), timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});1.2. Arquivo package.json
{ "name": "k8s-node-app", "version": "1.0.0", "dependencies": { "express": "^4.18.2" }, "scripts": { "start": "node app.js" }}2. Containerização: Imagem Docker
O Kubernetes trabalha com contêineres. Vamos criar um Dockerfile mínimo para nossa aplicação Node.js. Usaremos a imagem oficial do Node.js e uma construção em múltiplos estágios para otimizar o tamanho.
2.1. Dockerfile
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY . .EXPOSE 3000CMD ["node", "app.js"]Construa a imagem e envie-a para o Docker Hub ou outro registro:
docker build -t your-dockerhub/k8s-node-app:v1 .docker push your-dockerhub/k8s-node-app:v13. Implantação no Kubernetes
Agora vamos ao mais importante — a criação dos recursos do Kubernetes. Usaremos um Deployment (para gerenciar os Pods) e um Service (para acesso à rede).
3.1. Criação do Deployment
O Deployment garante que o número necessário de Pods com sua aplicação esteja sempre em execução. Crie o arquivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deployment labels: app: node-appspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: your-dockerhub/k8s-node-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"3.2. Criação do Service
O Service fornece um endereço IP estável e um nome DNS para acesso aos Pods. Crie o service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP3.3. Execução no cluster
Execute os comandos (certifique-se de que o kubectl está configurado e você tem acesso ao cluster):
kubectl apply -f deployment.yamlkubectl app