Introdução: por que implantar JavaScript no Kubernetes?
\nO desenvolvimento web moderno em JavaScript (especialmente Node.js) cada vez mais exige não apenas executar a aplicação em um único servidor, mas sim organizar uma infraestrutura tolerante a falhas, escalável e facilmente gerenciável. Kubernetes (K8s) é o padrão de facto para orquestração de contêineres. Se você programa em Node.js e quer que sua aplicação suporte picos de carga, se recupere automaticamente de falhas e seja atualizada facilmente sem downtime — você precisa do Kubernetes.
\nNeste guia, vamos abordar o processo básico de implantação de uma aplicação Node.js simples em um cluster Kubernetes. Você aprenderá como preparar uma imagem Docker, escrever os manifestos YAML necessários (Deployment, Service, Ingress) e executar a aplicação. O artigo é voltado para desenvolvedores que já conhecem os fundamentos de Node.js e Docker, mas estão apenas começando sua jornada no mundo Kubernetes.
\n\n
1. Preparação da aplicação Node.js e da imagem Docker
\nPrimeiramente, precisamos de uma aplicação para implantar. Vamos criar um servidor HTTP simples com Express que responde a requisições GET.
\n1.1. Criação de um servidor simples (app.js)
\nconst express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n res.send('Hello from Node.js on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\n\nArquivo package.json (dependências):
{\n "name": "k8s-node-app",\n "version": "1.0.0",\n "main": "app.js",\n "scripts": {\n "start": "node app.js"\n },\n "dependencies": {\n "express": "^4.18.2"\n }\n}\n\n1.2. Dockerfile para Node.js
\nPara que o Kubernetes possa executar nossa aplicação, ela precisa ser empacotada em um contêiner. Usaremos a imagem oficial do Node.js (versão 18 LTS).
\n# Usa a imagem oficial do Node.js\nFROM node:18-alpine\n\n# Define o diretório de trabalho dentro do contêiner\nWORKDIR /usr/src/app\n\n# Copia package.json e package-lock.json\nCOPY package*.json ./\n\n# Instala as dependências\nRUN npm install --production\n\n# Copia o código fonte da aplicação\nCOPY . .\n\n# Indica a porta que a aplicação irá escutar\nEXPOSE 3000\n\n# Comando para executar a aplicação\nCMD ["node", "app.js"]\n\nConstrução da imagem e envio ao registro:
\n# Constrói a imagem\ndocker build -t my-registry/node-app:v1 .\n\n# Envia para o Docker Hub ou seu registro privado\ndocker push my-registry/node-app:v1\n\nSubstitua my-registry pelo nome do seu registro (ex: docker.io/username/node-app).
\n
2. Criação dos manifestos YAML para Kubernetes
\nO Kubernetes usa uma abordagem declarativa: descrevemos o estado desejado do sistema em arquivos YAML, e o K8s se encarrega de levar tudo a esse estado. Precisaremos de três recursos principais: Deployment, Service e Ingress.
\n2.1. Deployment (deployment.yaml)
\nO Deployment é responsável por executar e atualizar os pods (contêineres). Ele garante que o número necessário de réplicas esteja sempre em execução.
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: node-app-deployment\n labels:\n app: node-app\nspec:\n replicas: 3 # Número de réplicas (cópias) da aplicação\n selector:\n matchLabels:\n app: node-app\n template:\n metadata:\n labels:\n app: node-app\n spec:\n containers:\n - name: node-app\n image: my-registry/node-app:v1\n ports:\n - containerPort: 3000\n env:\n - name: PORT\n value: "3000"\n resources:\n requests:\n memory: "64Mi"\n cpu: "250m"\n limits:\n memory: "128Mi"\n cpu: "500m"\n\nPontos-chave:
\n- \n
replicas: 3— exec