需要帮助 GKE 入口与 terraform 进行 n8n 部署
Posted
技术标签:
【中文标题】需要帮助 GKE 入口与 terraform 进行 n8n 部署【英文标题】:Need help for GKE ingress with terraform for n8n deployment 【发布时间】:2021-10-17 06:17:35 【问题描述】:我尝试将 n8n 及其掌舵图 (https://github.com/8gears/n8n-helm-chart) 部署到 GKE 集群。 我现在面临的问题是,当我将入口设置为指向应用程序时,它会不断丢失会话。我已经发现它必须与入口有关,因为当我直接访问 pod 时,一切正常。
我现在尝试在入口上设置会话亲和性,但我找不到任何有关如何使用 terraform 执行此操作的资源。我的第二个选择是设置一个 nginx 入口,但我没有经验如何做到这一点。我希望有人可以帮助我找出这个问题,或者为我指出一个更好的入口解决方案。谢谢!
这是我的 n8n terraform 配置:
resource "google_compute_managed_ssl_certificate" "n8n_ssl"
name = "$var.release_name-ssl"
managed
domains = ["n8n.$var.host"]
resource "helm_release" "n8n"
count = 1
depends_on = [kubernetes_namespace.n8n, google_sql_database.n8n, google_sql_user.n8n, google_compute_managed_ssl_certificate.n8n_ssl]
repository = "https://8gears.container-registry.com/chartrepo/library"
chart = "n8n"
version = var.helm_version
name = var.release_name
namespace = var.namespace
recreate_pods = true
values = [
"$file("n8n_values.yaml")"
]
set_sensitive
name = "n8n.encryption_key"
value = var.n8n_encryption_key
set
name = "config.database.postgresdb.host"
value = data.terraform_remote_state.cluster.outputs.database_connection
set
name = "config.database.postgresdb.user"
value = var.db_username
set_sensitive
name = "secret.database.postgresdb.password"
value = var.db_password
set
name = "config.security.basicAuth.user"
value = var.username
set_sensitive
name = "config.security.basicAuth.password"
value = var.password
resource "kubernetes_ingress" "n8n_ingress"
wait_for_load_balancer = true
depends_on = [google_compute_managed_ssl_certificate.n8n_ssl]
metadata
name = "$var.release_name-ingress"
namespace = helm_release.n8n[0].namespace
annotations =
"ingress.kubernetes.io/compress-enable" = "false",
"ingress.gcp.kubernetes.io/pre-shared-cert" = google_compute_managed_ssl_certificate.n8n_ssl.name
spec
backend
service_name = helm_release.n8n[0].name
service_port = 80
还有我的 n8n_values.yml:
config:
port: 5678
generic:
timezone: Europe/London
database:
type: postgresdb
security:
basicAuth:
active: true
secret:
database:
postgresdb:
password: ""
extraEnv:
VUE_APP_URL_BASE_API: https://n8n.***/
WEBHOOK_TUNNEL_URL: https://n8n.***/
image:
repository: n8nio/n8n
pullPolicy: IfNotPresent
tag: latest
service:
type: ClusterIP
port: 80
【问题讨论】:
【参考方案1】:要启用与 GKE Ingress 的会话亲和性,您需要创建一个 BackendConfig 资源。 GKE Ingress 支持客户端 IP 或基于 cookie 的亲和性。
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "CLIENT_IP"
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "GENERATED_COOKIE"
affinityCookieTtlSec: 50
使用 terraform 时,我认为您需要使用 kubernetes_manifest 资源来部署 BackendConfig 资源。
然后,您需要将 BackendConfig 添加为 Service 资源的注释。查看 helm chart 提供的 service.yaml ,您似乎无法通过 values.yaml 添加注释,因此您需要对其进行修改以支持添加注释。
【讨论】:
非常感谢@gari-singh,kubernetes_manifest 正是我所需要的,我完全错过了它。实际问题是,当入口关闭连接时,n8n 终止了会话,导致工作流失败。希望我们的工作流运行时间不会超过 5 分钟。以上是关于需要帮助 GKE 入口与 terraform 进行 n8n 部署的主要内容,如果未能解决你的问题,请参考以下文章
将现有 GKE 集群添加到 terraform stat 文件
在具有私有 GKE 集群的 Terraform 上使用 Kubernetes 提供程序