Implantação de TypeScript no Kubernetes: guia básico para iniciantes
\n\nO desenvolvimento web moderno é impensável sem conteinerização e orquestração. Se você programa em TypeScript e quer que sua aplicação funcione de forma estável, escale automaticamente e seja tolerante a falhas — o Kubernetes (K8s) será seu melhor amigo. Neste guia, vamos analisar passo a passo como empacotar uma aplicação TypeScript em Docker e implantá-la em um cluster Kubernetes. O material é voltado para iniciantes: sem mágica, apenas exemplos claros e explicações.
\n\n1. Preparação da aplicação TypeScript
\n\nAntes de pensar em Kubernetes, é preciso garantir que sua aplicação esteja pronta para funcionar em um contêiner. Vamos criar um servidor HTTP simples com Express e TypeScript.
\n\n1.1. Inicialização do projeto
\nCrie uma pasta para o projeto e execute a inicialização:
\nmkdir my-ts-app && cd my-ts-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon\n\n1.2. Configuração do TypeScript
\nCrie o arquivo tsconfig.json:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true,\n "skipLibCheck": true\n },\n "include": ["src/**/*"],\n "exclude": ["node_modules", "dist"]\n}\n\n1.3. Código da aplicação
\nCrie a pasta src e o arquivo index.ts:
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req: Request, res: Response) => {\n res.json({ message: 'Hello from TypeScript on Kubernetes!' });\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\n\n1.4. Compilação e execução
\nAdicione os scripts no package.json:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "ts-node src/index.ts"\n}\nVerifique a execução local: npm run dev e abra http://localhost:3000.
2. Conteinerização com Docker
\n\nO Kubernetes trabalha com contêineres. Precisamos criar uma imagem Docker da nossa aplicação TypeScript.
\n\n2.1. Dockerfile
\nCrie o arquivo Dockerfile na raiz do projeto:
FROM node:18-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM node:18-alpine AS production\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/package*.json ./\nRUN npm ci --only=production\nEXPOSE 3000\nCMD ["node", "dist/index.js"]\nUsamos uma compilação multi-estágio: primeiro compilamos o TypeScript, depois criamos uma imagem final leve.
\n\n2.2. Compilação da imagem
\ndocker build -t my-ts-app:latest .\nVerifique localmente:
\ndocker run -p 3000:3000 my-ts-app:latest\n\n2.3. .dockerignore
\nPara não copiar arquivos desnecessários, crie o .dockerignore:
node_modules\ndist\n.git\n*.md\n\n3. Implantação no Kubernetes
\n\nAgora que temos a imagem Docker, podemos passar para o Kubernetes. Para testes locais, recomendo Minikube ou Kind.
\n\n3.1. Iniciando o Minikube
\nminikube start --driver=docker\nminikube status\n\n3.2. Carregando a imagem no Minikube
\nPara que o Kubernetes encontre nossa imagem, carregue-a no ambiente do Minikube:
\nminikube image load my-ts-app:latest\n\n3.3. Criando o Deployment
\nCrie o arquivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: my-ts-app-deployment\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: my-ts