Implantação de TypeScript no Kubernetes: guia básico
O desenvolvimento web moderno cada vez mais exige não apenas escrever código de qualidade, mas também uma implantação adequada de aplicações. TypeScript, graças à tipagem estrita e ferramentas poderosas, tornou-se uma escolha popular para serviços backend em Node.js. No entanto, sem uma implantação correta, mesmo o código ideal permanecerá na máquina local. Kubernetes — o padrão de orquestração de contêineres — permite automatizar a implantação, escalonamento e gerenciamento de aplicações. Neste guia, vamos detalhar o processo passo a passo de implantação de uma aplicação TypeScript no Kubernetes.
1. Preparando a aplicação TypeScript para conteinerização
Antes de enviar o código para o cluster, é necessário garantir que a aplicação esteja pronta para funcionar em um contêiner. Vamos considerar um projeto típico com Express.js e TypeScript.
Estrutura do projeto
my-ts-app/├── src/│ ├── index.ts│ └── routes/├── dist/├── package.json├── tsconfig.json└── DockerfileConfiguração do tsconfig.json
Certifique-se de que o compilador TypeScript compile o projeto na pasta dist:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src/**/*"]}Servidor simples (src/index.ts)
import express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/health', (_req: Request, res: Response) => { res.json({ status: 'ok', timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});Adicione scripts no package.json:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts"}2. Construindo a imagem Docker para TypeScript
A conteinerização é uma etapa fundamental antes da implantação no Kubernetes. Usaremos multi-stage build para reduzir o tamanho da imagem.
Dockerfile
# Stage 1: BuildFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY tsconfig.json ./COPY src/ ./src/RUN npm run build
# Stage 2: ProductionFROM node:18-alpine AS productionWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package*.json ./RUN npm ci --only=productionEXPOSE 3000CMD ["node", "dist/index.js"]Construa a imagem e envie para um registro (por exemplo, Docker Hub):
docker build -t yourusername/my-ts-app:v1 .docker push yourusername/my-ts-app:v13. Escrevendo manifestos Kubernetes
Para implantar no Kubernetes, serão necessários pelo menos dois recursos: Deployment (gerenciamento de pods) e Service (acesso à aplicação).
deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: my-ts-app labels: app: my-ts-appspec: replicas: 2 selector: matchLabels: app: my-ts-app template: metadata: labels: app: my-ts-app spec: containers: - name: app image: yourusername/my-ts-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 3 periodSeconds: 5service.yaml
apiVersion: v1kind: Servicemetadata: name: my-ts-app-servicespec: selector: app: my-ts-app ports: - protocol: T