Деплой TypeScript на Kubernetes: базовое руководство для начинающих

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

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

Начать курс

Деплой 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 не может скачать образ. Проверьте имя обра

Блоги

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