Fresh — это современный фреймворк для построения веб-приложений на JavaScript и Deno, который ориентирован на высокую производительность и минимальный runtime. При работе с Kubernetes деплой 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"]
Ключевые моменты:
deno cache позволяет кешировать зависимости,
что ускоряет запуск контейнера.Для развертывания приложения создаётся объект
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:
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.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
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
Значение:
averageUtilization задаёт порог нагрузки для
масштабирования.Для Fresh приложений важно собирать логи и метрики:
stdout/stderr), который Kubernetes собирает
через kubectl logs.Для минимизации простоя при обновлениях используют:
Fresh приложения, работающие в Kubernetes, должны учитывать:
Для улучшения производительности:
Все шаги позволяют добиться стабильного и масштабируемого деплоя Fresh приложений в Kubernetes.