在 Google Kubernetes Engine 上部署 n8n#
Google Cloud 提供多种适用于部署 n8n 的选项,包括 Cloud Run(针对容器运行优化)、Compute Engine(虚拟机)和 Kubernetes Engine(基于 Kubernetes 的容器)。
本指南采用 Google Kubernetes Engine (GKE) 作为部署方案。若需使用 Cloud Run,请参阅相关说明。
本文大部分步骤使用 Google Cloud 图形界面操作,但您也可使用 gcloud 命令行工具 完成所有步骤。
前置要求#
- gcloud 命令行工具
- gke-gcloud-auth-plugin(需先安装 gcloud CLI)
自托管知识储备
自托管 n8n 需要具备以下技术知识:
- 服务器与容器的设置配置
- 应用资源管理与扩缩容
- 服务器与应用安全防护
- n8n 配置
n8n 建议仅专家用户进行自托管。操作失误可能导致数据丢失、安全隐患及服务中断。若缺乏服务器管理经验,n8n 推荐使用 n8n Cloud。
最新版与预览版
n8n 每周会发布新的次要版本。latest 为生产环境适用版本,next 是最新发布版本。您应将 next 视为测试版:可能存在不稳定情况。问题反馈请使用社区论坛。
当前 latest 版本:1.119.2
当前 next 版本:1.119.3
创建项目#
GCP 建议通过创建项目来逻辑组织资源与配置。请通过 Google Cloud 控制台为 n8n 部署创建新项目:选择项目下拉菜单后点击 新建项目 按钮,随后选中新建的项目。在进行后续步骤时,请确保已选择正确的项目。
启用 Kubernetes Engine API#
GKE 默认未启用。请在顶部搜索栏输入 "Kubernetes" 并从结果中选择 "Kubernetes Engine"。
点击 启用 为此项目激活 Kubernetes Engine API。
创建集群#
通过 GKE 服务页面 选择 集群 > 创建。请务必选择"标准"集群选项,n8n 不兼容"自动驾驶"集群。除非有特定需求(如区域设置),否则可保持集群默认配置。
设置 Kubectl 上下文#
本指南后续步骤需将 GCP 实例设为 Kubectl 上下文。通过打开集群实例详情页面并选择 连接 可查看连接信息。显示的代码片段包含 gcloud CLI 工具的连接命令。在 gcloud CLI 中粘贴并运行该代码片段,即可将本地 Kubernetes 设置切换至新的 gcloud 集群。
克隆配置仓库#
Kubernetes 和 n8n 需要一系列配置文件。您可从该仓库 本地克隆这些配置。后续步骤将说明文件配置方法及如何添加您的信息。
使用以下命令克隆仓库:
git clone https://github.com/n8n-io/n8n-hosting.git
并切换目录:
cd n8n-hosting/kubernetes
配置 Postgres#
对于大规模 n8n 部署,Postgres 提供了比 SQLite 更强大的数据库后端。
创建持久化存储卷#
为确保 Pod 重启时数据不丢失,Postgres 部署需要持久化存储卷。在 GCP 上运行 Postgres 需要使用特定的 Kubernetes 存储类。具体细节可参阅本指南,storage.yaml 清单文件已为您完成配置。您可能需要根据需求在 allowedTopologies > matchedLabelExpressions > values 键下修改存储卷的创建区域,默认设置为 us-central。
…
allowedTopologies:
- matchLabelExpressions:
- key: failure-domain.beta.kubernetes.io/zone
values:
- us-central1-b
- us-central1-c
Postgres 环境变量#
Postgres 需要设置若干环境变量以传递给容器内运行的应用程序。
示例文件 postgres-secret.yaml 包含需要替换为实际值的占位符。Postgres 在创建数据库时将使用这些详细信息。
随后,postgres-deployment.yaml 清单文件会使用该清单文件中的值传递给应用 Pod。
配置 n8n#
创建文件存储卷#
虽然并非运行 n8n 的必要条件,但使用持久化卷在以下场景中必不可少:
- 使用需要与文件交互的节点(例如二进制数据节点)
- 若需在重启时保持手动设置的 n8n 加密密钥持久化。这会在启动时将包含密钥的文件保存至文件存储中
n8n-claim0-persistentvolumeclaim.yaml 清单文件负责创建此存储卷,而 n8n 部署则通过 n8n-deployment.yaml 清单文件中的 volumes 章节挂载该声明。
…
volumes:
- name: n8n-claim0
persistentVolumeClaim:
claimName: n8n-claim0
…
Pod 资源配置#
Kubernetes 允许您选择性指定应用容器所需的最小资源量及其运行上限。上文克隆的示例 YAML 文件在 n8n-deployment.yaml 和 postgres-deployment.yaml 文件的 resources 配置段中包含以下内容:
…
resources:
requests:
memory: "250Mi"
limits:
memory: "500Mi"
…
此配置为每个容器定义了最低250MB、最高500MB的内存限制,并让Kubernetes自动管理CPU资源。您可以根据实际需求调整这些数值。以下提供n8n云服务的资源配置作为参考:
- 入门版:320MB内存,10毫核CPU(可突增)
- 专业版(1万次执行):640MB内存,20毫核CPU(可突增)
- 专业版(5万次执行):1280MB内存,80毫核CPU(可突增)
可选:环境变量#
您可以通过环境变量配置n8n的各项参数和行为。
创建 n8n-secret.yaml 文件,具体环境变量说明请参阅环境变量文档。
部署配置#
两个部署清单文件(n8n-deployment.yaml 和 postgres-deployment.yaml)用于向Kubernetes定义n8n和Postgres应用。
这些清单文件具体定义了:
- 向每个应用Pod传递已配置的环境变量
- 指定使用的容器镜像
- 通过
resources对象设置资源消耗限制 - 使用先前定义的
volumes和volumeMounts声明容器内的存储卷挂载路径 - 扩缩容与重启策略。示例清单中每个Pod仅定义单个实例,请根据实际需求进行调整
服务配置#
两个服务清单文件(postgres-service.yaml 和 n8n-service.yaml)通过Kubernetes负载均衡器分别使用5432和5678端口向外部暴露服务。
发送至Kubernetes集群#
使用以下命令将所有清单文件发送至集群:
kubectl apply -f .
命名空间错误
您可能会看到关于找不到“n8n”命名空间的错误提示,这是因为相关资源尚未准备就绪。您可以重新执行相同命令,或先通过以下命令应用命名空间清单:
kubectl apply -f namespace.yaml
配置DNS#
n8n通常在子域名上运行。请通过您的DNS服务商为该子域名创建一条DNS记录,并将其指向n8n服务的IP地址。在目标集群的服务与入口菜单项下,通过端点列可找到n8n服务的IP地址。
GKE与IP地址说明
阅读此GKE教程了解预留IP地址如何与GKE及Kubernetes资源协同工作的更多细节。
删除资源#
使用以下 命令删除清单文件创建的资源:
kubectl delete -f .