【问题标题】:Need help for GKE ingress with terraform for n8n deployment需要帮助 GKE 入口与 terraform 进行 n8n 部署
【发布时间】: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

【问题讨论】:

    标签: terraform google-kubernetes-engine nginx-ingress gke-networking n8n


    【解决方案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 分钟。
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2014-04-23
    • 2023-03-22
    相关资源
    最近更新 更多