N8n Helm: Полное руководство по развертыванию и управлению в Kubernetes
N8n (pronounced «n-eight-n») — это инструмент с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), который позволяет соединять различные приложения, API и сервисы без необходимости писать код. Для развертывания n8n в кластере Kubernetes наиболее эффективным и стандартизированным методом является использование Helm — менеджера пакетов для Kubernetes. Helm-чарт для n8n предоставляет декларативный, настраиваемый и воспроизводимый способ установки, настройки и обновления всех компонентов n8n в кластере.
Архитектура развертывания n8n через Helm
Helm-чарт n8n разворачивает приложение как StatefulSet или Deployment, в зависимости от конфигурации хранилища. Основные компоненты, управляемые чартом, включают:
- Web Server: Основной компонент n8n, предоставляющий пользовательский интерфейс и API.
- Workflow Executor: Обрабатывает выполнение рабочих процессов, может масштабироваться.
- PostgreSQL Database: Встроенная или внешняя база данных для хранения рабочих процессов, учетных данных, выполненных заданий и настроек. Чарт может развертывать отдельный сервис PostgreSQL в виде побочного контейнера (sidecar) или использовать внешний инстанс.
- Redis (опционально): Используется для очередей сообщений и управления событиями в высоконагруженных сценариях.
- Service: Kubernetes Service для доступа к веб-интерфейсу n8n.
- Ingress: Конфигурация для предоставления внешнего доступа к n8n через HTTP/HTTPS маршруты.
- Persistent Volume Claims (PVC): Обеспечивают постоянное хранение для файлов (например, загруженных изображений) и, опционально, для данных PostgreSQL.
- image.repository / image.tag: Определяет образ контейнера и его версию.
- replicaCount: Количество реплик Pod для веб-сервера. Для сценариев высокой доступности требуется внешняя база данных и общее хранилище.
- strategyType: Стратегия обновления (например, RollingUpdate).
- postgresql.enabled: Если true, развертывает PostgreSQL в качестве sidecar-контейнера в том же Pod. Подходит для разработки и тестирования.
- externalDatabase: Параметры для подключения к внешнему PostgreSQL (обязателен для продакшена).
- persistence.enabled: Включить постоянное хранилище для файлов n8n.
- persistence.size: Размер тома (например, 10Gi).
- persistence.storageClass: Использовать определенный StorageClass. Если оставить пустым, используется класс по умолчанию.
- ingress.enabled: Включить создание ресурса Ingress.
- ingress.hosts: Список хостов для маршрутизации трафика.
- ingress.tls: Конфигурация TLS-сертификатов (например, через Let’s Encrypt с помощью cert-manager).
helm repo add n8n https://helm.n8n.io/helm repo update
Ключевые параметры конфигурации values.yaml
Конфигурация развертывания полностью управляется файлом values.yaml. Ниже приведены наиболее важные секции и параметры.
Базовая конфигурация
Конфигурация базы данных
Чарт предлагает гибкие варианты: использовать встроенную базу данных (режим sidecar) или внешнюю.
| Параметр | Описание | Пример значения |
|---|---|---|
| postgresql.enabled | Включить развертывание PostgreSQL как sidecar | true |
| externalDatabase.host | Хост внешней БД PostgreSQL | my-postgresql.cloudprovider.com |
| externalDatabase.port | Порт внешней БД | 5432 |
| externalDatabase.database | Имя базы данных | n8n |
| externalDatabase.user | Пользователь БД | n8n_user |
| externalDatabase.passwordSecret | Имя Secret, содержащего пароль | n8n-external-db-password |
Конфигурация хранилища (Persistent Storage)
Конфигурация Ingress и TLS
Конфигурация среды n8n (environment variables)
Наиболее критичная часть настройки. Параметры передаются как переменные среды в контейнер.
| Переменная среды (через values.yaml) | Назначение | Важность |
|---|---|---|
| N8N_PROTOCOL | Протокол (http/https) | Высокая |
| N8N_HOST | Публичный хостнейм приложения | Высокая |
| N8N_PORT | Внутренний порт (обычно 5678) | Средняя |
| N8N_ENCRYPTION_KEY | Ключ для шифрования учетных данных в БД. Должен быть постоянным и длинным (минимум 16 символов). | Критическая |
| GENERIC_TIMEZONE | Часовой пояс (например, Europe/Moscow) | Средняя |
| EXECUTIONS_DATA_PRUNE | Включить автоматическую очистку старых данных выполнений (true/false) | Средняя |
| EXECUTIONS_DATA_MAX_AGE | Максимальный возраст данных выполнений в часах перед очисткой | Средняя |
| N8N_USER_MANAGEMENT_JWT_SECRET | Секрет для JWT-токенов аутентификации. Должен быть задан при включенном управлении пользователями. | Критическая |
| WEBHOOK_URL | Публичный URL для вебхуков, если отличается от N8N_HOST (например, при использовании туннеля). | Высокая |
Пошаговый процесс установки и настройки
1. Добавление репозитория Helm
Первым шагом необходимо добавить репозиторий, содержащий официальный чарт n8n.
2. Подготовка файла конфигурации values.yaml
Создайте файл custom-values.yaml. Ниже приведен пример минимальной конфигурации для продакшена с внешней БД.
custom-values.yaml
replicaCount: 2
image:
repository: n8nio/n8n
tag: latest
postgresql:
enabled: false Используем внешнюю БД
externalDatabase:
host: "prod-postgresql.example.com"
port: 5432
database: "n8n_db"
user: "n8n_service_user"
passwordSecret: "n8n-db-secret" Создать заранее через kubectl create secret generic n8n-db-secret --from-literal=password='YourStrongPassword123'
persistence:
enabled: true
size: 20Gi
storageClass: "fast-ssd"
env:
- name: N8N_PROTOCOL
value: "https"
- name: N8N_HOST
value: "n8n.yourcompany.com"
- name: N8N_ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: n8n-encryption-key
key: key
- name: EXECUTIONS_DATA_PRUNE
value: "true"
- name: EXECUTIONS_DATA_MAX_AGE
value: "168" 7 дней
ingress:
enabled: true
className: "nginx"
hosts:
- host: "n8n.yourcompany.com"
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: n8n-tls-secret
hosts:
- n8n.yourcompany.com
3. Установка чарта в кластер Kubernetes
Выполните команду установки, указав подготовленный файл values.
helm install my-n8n n8n/n8n -f custom-values.yaml --namespace automation --create-namespace
Для обновления конфигурации после изменений используйте команду:
helm upgrade my-n8n n8n/n8n -f custom-values.yaml --namespace automation
Управление секретами (Secrets)
Критически важные данные, такие как пароли и ключи шифрования, никогда не должны храниться в values.yaml в открытом виде. Используйте Kubernetes Secrets.
- Создание Secret для пароля БД:
kubectl create secret generic n8n-db-secret --from-literal=password='YourPassword' -n automation - Создание Secret для ключа шифрования:
kubectl create secret generic n8n-encryption-key --from-literal=key='Your32CharLongEncryptionKey!!' -n automation
В values.yaml ссылайтесь на эти секреты, как показано в примере выше, используя valueFrom.secretKeyRef.
Резервное копирование и восстановление
Резервное копирование состояния n8n, развернутого через Helm, включает несколько компонентов:
- База данных: Регулярно создавайте дампы PostgreSQL с помощью утилит (pg_dump) или используйте функции резервного копирования вашего облачного провайдера.
- Файлы: Данные, хранящиеся в Persistent Volume (загруженные файлы, приватные ключи SSH), должны быть включены в процесс резервного копирования томов Kubernetes.
- Конфигурация Helm: Сохраняйте финальный файл values.yaml в системе контроля версий (Git).
Для восстановления разверните новый релиск Helm с тем же файлом values.yaml, восстановите дамп БД и смонтируйте резервную копию тома.
Масштабирование и высокодоступность (High Availability)
Для обеспечения отказоустойчивости и обработки повышенной нагрузки необходимо:
- Использовать внешнюю, реплицируемую базу данных PostgreSQL (например, AWS RDS, Google Cloud SQL или развернутую в кластере через операторы). Встроенный sidecar PostgreSQL не является отказоустойчивым.
- Установить replicaCount > 1. Несколько Pod n8n могут работать параллельно, если они подключены к одной общей БД и используют общее хранилище файлов (например, NFS, S3-совместимое объектное хранилище, настроенное через соответствующий узел n8n).
- Настроить Redis в качестве брокера сообщений для координации выполнения рабочих процессов между несколькими экземплярами. Это предотвращает дублирование выполнения.
- Настроить горизонтальное автомасштабирование Pod (HPA) на основе метрик CPU или памяти.
Мониторинг и логи
Для наблюдения за работой n8n в Kubernetes используйте:
- Логи (Logs):
kubectl logs deployment/my-n8n -n automationили агрегаторы логов (Fluentd, Loki). - Метрики: N8n предоставляет эндпоинт Prometheus-метрик (
/metrics). Настройте ServiceMonitor для Prometheus Operator для сбора метрик о количестве рабочих процессов, успешных/неудачных выполнениях и времени ответа. - Трассировка выполнения: Внутренние логи n8n, доступные через веб-интерфейс, также хранятся в базе данных.
Часто задаваемые вопросы (FAQ)
Как обновить версию n8n при использовании Helm?
Обновите поле image.tag в вашем файле values.yaml до нужной версии (например, 1.40.0) и выполните команду helm upgrade. Перед обновлением в продакшен-окружении обязательно проверьте changelog n8n на наличие критических изменений и создайте резервную копию базы данных.
Как настроить SMTP для отправки электронных писем из n8n?
Добавьте в секцию env вашего values.yaml следующие переменные:
N8N_EMAIL_MODE=smtpN8N_SMTP_HOST=smtp.gmail.comN8N_SMTP_PORT=587N8N_SMTP_USER(задать через Secret)N8N_SMTP_PASS(задать через Secret)N8N_SMTP_SENDER=n8n@yourdomain.com
Как включить аутентификацию пользователей в развертывании Helm?
Установите переменные среды для базовой аутентификации или аутентификации через JWT. Для JWT необходимо задать:
N8N_USER_MANAGEMENT_JWT_SECRET(через Secret)N8N_USER_MANAGEMENT_JWT_AUTH_AGE=604800(время жизни токена)
После установки первого пользователя создается через веб-интерфейс. Для автоматизации можно использовать настройки по умолчанию через переменные N8N_USER_MANAGEMENT_SKIN_INSTALLATION и N8N_ADMIN_EMAIL.
Почему вебхуки n8n не работают после развертывания в Kubernetes?
Наиболее вероятные причины:
- Неправильно задана переменная
WEBHOOK_URLилиN8N_HOST. Они должны указывать на публичный URL, по которому кластер доступен извне. - Ingress-контроллер не настроен корректно для передачи оригинального IP-адреса и заголовков. В аннотациях Ingress может потребоваться установить
nginx.ingress.kubernetes.io/enable-cors: "true"и настройки для proxy. - Брандмауэр или сетевые политики Kubernetes блокируют входящий трафик.
Как перейти со встроенной PostgreSQL (sidecar) на внешнюю базу данных?
1. Создайте дамп данных из текущей базы данных sidecar с помощью kubectl exec.
2. Разверните и настройте внешний инстанс PostgreSQL (например, RDS). Восстановите в него дамп.
3. Отредактируйте values.yaml: установите postgresql.enabled: false, заполните параметры externalDatabase.
4. Выполните helm upgrade. Pod n8n будет перезапущен с подключением к новой базе.
5. После успешного запуска удалите старые Persistent Volume Claims, связанные со sidecar PostgreSQL.
Как управлять обновлением рабочих процессов при развертывании через GitOps?
Рекомендуется использовать подход «конфигурация как код» для самих рабочих процессов n8n. Для этого:
- Настройте в n8n использование файловой системы для сохранения рабочих процессов (переменная
N8N_WORKFLOWS_STORAGE=filesystem). - Смонтируйте Git-репозиторий как том в Pod с помощью инструментов вроде Git-sync или используйте Init Container для клонирования репозитория.
- Настройте CI/CD пайплайн, который при пуше в репозиторий обновляет файлы в Pod или инициирует перезагрузку n8n для чтения новых версий рабочих процессов.
Комментарии