需要帮助 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 部署的主要内容,如果未能解决你的问题,请参考以下文章

Terraform gcp 与共享 vpc、gke

将现有 GKE 集群添加到 terraform stat 文件

在具有私有 GKE 集群的 Terraform 上使用 Kubernetes 提供程序

GKE Terraformed 集群发布通道设置

使用 terraform 将公共 GKE 更改为私有 GKE 集群

使用 Terraform 管理 GKE 及其部署