Деплой TypeScript на Kubernetes: базовое руководство для начинающих
Современная веб-разработка немыслима без контейнеризации и оркестрации. Если вы пишете на TypeScript и хотите, чтобы ваше приложение работало стабильно, масштабировалось автоматически и было отказоустойчивым — Kubernetes (K8s) станет вашим лучшим другом. В этом руководстве мы шаг за шагом разберем, как упаковать TypeScript-приложение в Docker и развернуть его в кластере Kubernetes. Материал рассчитан на новичков: никакой магии, только понятные примеры и объяснения.
1. Подготовка TypeScript-приложения
Прежде чем думать о Kubernetes, нужно убедиться, что ваше приложение готово к работе в контейнере. Создадим простой HTTP-сервер на Express с TypeScript.
1.1. Инициализация проекта
Создайте папку проекта и выполните инициализацию:
mkdir my-ts-app && cd my-ts-app
npm init -y
npm install express
npm install -D typescript @types/node @types/express ts-node nodemon
1.2. Конфигурация TypeScript
Создайте файл tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
1.3. Код приложения
Создайте папку src и файл index.ts:
import express, { Request, Response } from 'express';
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req: Request, res: Response) => {
res.json({ message: 'Hello from TypeScript on Kubernetes!' });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
1.4. Сборка и запуск
Добавьте скрипты в package.json:
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "ts-node src/index.ts"
}
Проверьте локальный запуск: npm run dev и откройте http://localhost:3000.
2. Контейнеризация с Docker
Kubernetes работает с контейнерами. Нам нужно создать Docker-образ нашего TypeScript-приложения.
2.1. Dockerfile
Создайте файл Dockerfile в корне проекта:
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Мы используем multi-stage сборку: сначала компилируем TypeScript, затем создаем легковесный финальный образ.
2.2. Сборка образа
docker build -t my-ts-app:latest .
Проверьте локально:
docker run -p 3000:3000 my-ts-app:latest
2.3. .dockerignore
Чтобы не копировать лишние файлы, создайте .dockerignore:
node_modules
dist
.git
*.md
3. Развертывание в Kubernetes
Теперь, когда у нас есть Docker-образ, можно переходить к Kubernetes. Для локального тестирования рекомендую Minikube или Kind.
3.1. Запуск Minikube
minikube start --driver=docker
minikube status
3.2. Загрузка образа в Minikube
Чтобы Kubernetes мог найти наш образ, загрузим его в окружение Minikube:
minikube image load my-ts-app:latest
3.3. Создание Deployment
Создайте файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-ts-app-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-ts-app
template:
metadata:
labels:
app: my-ts-app
spec:
containers:
- name: my-ts-app
image: my-ts-app:latest
imagePullPolicy: Never
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
Примените манифест:
kubectl apply -f deployment.yaml
3.4. Создание Service
Чтобы приложение было доступно внутри кластера и снаружи, создайте service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-ts-app-service
spec:
selector:
app: my-ts-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
Примените:
kubectl apply -f service.yaml
3.5. Проверка работы
Получите URL сервиса:
minikube service my-ts-app-service --url
Откройте полученный адрес в браузере — вы должны увидеть JSON-ответ от вашего TypeScript-приложения.
4. Полезные команды и устранение ошибок
Вот несколько команд, которые пригодятся при деплое:
kubectl get pods— список всех подовkubectl logs <pod-name>— логи конкретного подаkubectl describe pod <pod-name>— детальная информация о подеkubectl delete deployment my-ts-app-deployment— удаление деплоймента
Типичные ошибки новичков:
- ImagePullBackOff — Kubernetes не может скачать образ. Проверьте имя обра