Kubernetes деплой

Fresh — это современный фреймворк для построения веб-приложений на JavaScript и Deno, который ориентирован на высокую производительность и минимальный runtime. При работе с Kubernetes деплой Fresh приложений требует понимания как контейнеризации, так и принципов работы кластера.


Контейнеризация Fresh приложений

Первый шаг при деплое — подготовка контейнера. Fresh приложения могут быть упакованы с помощью Docker или альтернативных средств контейнеризации, таких как Podman. Структура Dockerfile для Fresh выглядит следующим образом:

# Используем официальный образ Deno
FROM denoland/deno:alpine-1.37.0

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем файлы проекта
COPY . .

# Разрешаем необходимые права для выполнения
RUN deno cache main.ts

# Экспонируем порт приложения
EXPOSE 8000

# Старт приложения
CMD ["run", "--allow-net", "--allow-read", "main.ts"]

Ключевые моменты:

  • Используется легкий Alpine-образ с предустановленным Deno.
  • Команда deno cache позволяет кешировать зависимости, что ускоряет запуск контейнера.
  • Порт 8000 соответствует стандартному порту Fresh сервера.

Настройка Kubernetes Deployment

Для развертывания приложения создаётся объект Deployment, который управляет количеством реплик и стратегией обновления. Пример YAML-файла:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fresh-app
  labels:
    app: fresh
spec:
  replicas: 3
  selector:
    matchLabels:
      app: fresh
  template:
    metadata:
      labels:
        app: fresh
    spec:
      containers:
        - name: fresh-container
          image: myregistry/fresh-app:latest
          ports:
            - containerPort: 8000
          resources:
            limits:
              cpu: "500m"
              memory: "256Mi"
            requests:
              cpu: "250m"
              memory: "128Mi"

Особенности конфигурации:

  • replicas задаёт количество экземпляров приложения для балансировки нагрузки.
  • resources определяет лимиты и запросы для CPU и памяти, что предотвращает перегрузку узлов.
  • selector.matchLabels связывает Deployment с Pod’ами.

Настройка Service для доступа

Чтобы внешние пользователи могли обращаться к приложению, создаётся объект Service:

apiVersion: v1
kind: Service
metadata:
  name: fresh-service
spec:
  type: LoadBalancer
  selector:
    app: fresh
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000

Пояснения:

  • type: LoadBalancer позволяет автоматически создавать балансировщик трафика (в облачных провайдерах).
  • targetPort указывает на порт внутри контейнера, где работает Fresh приложение.
  • selector связывает Service с Pod’ами Deployment.

Настройка конфигурации через ConfigMap и Secrets

Fresh приложения могут использовать переменные окружения для настройки. Kubernetes предоставляет ConfigMap и Secrets:

apiVersion: v1
kind: ConfigMap
metadata:
  name: fresh-config
data:
  API_URL: "https://api.example.com"

---
apiVersion: v1
kind: Secret
metadata:
  name: fresh-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQ= # base64

В Deployment переменные подключаются через env:

env:
  - name: API_URL
    valueFrom:
      configMapKeyRef:
        name: fresh-config
        key: API_URL
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: fresh-secret
        key: DB_PASSWORD

Настройка горизонтального автоскейлинга (HPA)

Kubernetes позволяет масштабировать приложение в зависимости от нагрузки. Пример HorizontalPodAutoscaler:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: fresh-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: fresh-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

Значение:

  • HPA автоматически увеличивает или уменьшает количество реплик в зависимости от загруженности CPU.
  • averageUtilization задаёт порог нагрузки для масштабирования.

Логи и мониторинг

Для Fresh приложений важно собирать логи и метрики:

  • Логи: можно использовать стандартный вывод контейнера (stdout/stderr), который Kubernetes собирает через kubectl logs.
  • Мониторинг: интеграция с Prometheus через экспорт метрик Deno приложений позволяет отслеживать использование ресурсов и производительность.

Стратегии обновления

Для минимизации простоя при обновлениях используют:

  • Rolling Update — стандартная стратегия Deployment, которая постепенно заменяет старые Pod’ы на новые.
  • Blue-Green Deployment — создаются параллельные версии приложения, и трафик переключается с одной на другую после успешного тестирования.
  • Canary Deployment — обновление небольшой части Pod’ов для проверки стабильности перед массовым релизом.

Сетевые аспекты

Fresh приложения, работающие в Kubernetes, должны учитывать:

  • Ingress для маршрутизации внешнего трафика.
  • NetworkPolicy для ограничения доступа между Pod’ами.
  • Поддержка HTTPS через сертификаты, часто с использованием Cert-Manager.

Кэширование и производительность

Для улучшения производительности:

  • Использовать CDN для статических ресурсов Fresh.
  • Включить серверный кэш на уровне приложения.
  • Настроить ресурсы Pod’ов для предотвращения OOMKill при пиковых нагрузках.

Итоговый процесс деплоя

  1. Сборка Docker-образа Fresh приложения.
  2. Развёртывание Deployment и Service.
  3. Настройка конфигураций через ConfigMap и Secrets.
  4. Настройка автоскейлинга и мониторинга.
  5. Применение сетевых правил и оптимизация производительности.

Все шаги позволяют добиться стабильного и масштабируемого деплоя Fresh приложений в Kubernetes.