Деплой TypeScript на Kubernetes: базовое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Деплой TypeScript на Kubernetes: базовое руководство

Современная веб-разработка всё чаще требует не только написания качественного кода, но и грамотного развёртывания приложений. TypeScript, благодаря строгой типизации и мощным инструментам, стал популярным выбором для бэкенд-сервисов на Node.js. Однако без правильного деплоя даже идеальный код останется на локальной машине. Kubernetes — стандарт оркестрации контейнеров — позволяет автоматизировать развёртывание, масштабирование и управление приложениями. В этом руководстве мы разберём пошаговый процесс деплоя TypeScript-приложения на Kubernetes.

1. Подготовка TypeScript-приложения к контейнеризации

Прежде чем отправлять код в кластер, необходимо убедиться, что приложение готово к работе в контейнере. Рассмотрим типичный проект на Express.js с TypeScript.

Структура проекта

my-ts-app/
├── src/
│   ├── index.ts
│   └── routes/
├── dist/
├── package.json
├── tsconfig.json
└── Dockerfile

Настройка tsconfig.json

Убедитесь, что компилятор TypeScript собирает проект в папку dist:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"]
}

Простой сервер (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}`);
});

Добавьте скрипты в package.json:

"scripts": {
  "build": "tsc",
  "start": "node dist/index.js",
  "dev": "ts-node src/index.ts"
}

2. Сборка Docker-образа для TypeScript

Контейнеризация — ключевой шаг перед деплоем в Kubernetes. Используем многоступенчатую сборку (multi-stage build), чтобы уменьшить размер образа.

Dockerfile

# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY tsconfig.json ./
COPY src/ ./src/
RUN npm run build

# Stage 2: Production
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"]

Соберите образ и отправьте его в реестр (например, Docker Hub):

docker build -t yourusername/my-ts-app:v1 .
docker push yourusername/my-ts-app:v1

3. Написание манифестов Kubernetes

Для развёртывания в Kubernetes потребуются как минимум два ресурса: Deployment (управление подам) и Service (доступ к приложению).

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-ts-app
  labels:
    app: my-ts-app
spec:
  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: 5

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 deployment.yaml
kubectl apply -f service.yaml

Проверьте статус подов и сервиса:

kubectl get pods
kubectl get svc my-ts-app-service

4. Настройка CI/CD и автоматизация деплоя

Ручной деплой — не лучшая практика. Интегрируем процесс в пайплайн с использованием GitHub Actions.

Пример .github/workflows/deploy.yml

name: Deploy to Kubernetes

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Build and push Docker image
      run: |
        docker build -t yourusername/my-ts-app:${{ github.sha }} .
        docker push yourusername/my-ts-app:${{ github.sha }}

    - name: Update deployment image
      run: |
        kubectl set image deployment/my-ts-app app=yourusername/my-ts-app:${{ github.sha }}
        kubectl rollout status deployment/my-ts-app

Не забудьте настроить секреты в репозитории GitHub и подключиться к кластеру (например, через kubeconfig).

Заключение

Мы прошли полный цикл деплоя TypeScript-приложения на Kubernetes: от подготовки кода и контейнеризации до написания манифестов и автоматизации с помощью CI/CD. Такой подход обеспечивает стабильность, масштабируемость и лёгкость обновления сервисов. Начните с небольшого проекта, постепенно добавляя мониторинг, логирование и управление конфигурациями через ConfigMap и Secrets. Kubernetes и TypeScript — мощное сочетание для построения современных облачных приложений.

Блоги

Рекомендаций по книгам