需要使用 terraform 进行 GKE ingress 的帮助以进行 n8n 部署

Need help for GKE ingress with terraform for n8n deployment

我尝试将 n8n with its helm chart (https://github.com/8gears/n8n-helm-chart) 部署到 GKE 集群。 我现在面临的问题是,当我将入口设置为指向应用程序时,它会不断丢失会话。我已经发现它必须与入口有关,因为当我直接访问 pod 时一切正常。

我现在尝试在入口上设置会话关联,但我找不到任何关于如何使用 terraform 执行此操作的资源。我的第二个选择是设置一个 Nginx 入口,但我没有经验如何做到这一点。我希望有人可以帮助我找出这个问题,或者为我指出更好的入口解决方案。谢谢!

这是我的 n8n 地形配置:


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

要启用与 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 添加为服务资源上的注释。查看 helm chart 提供的 service.yaml,似乎无法通过 values.yaml 添加注释,因此您需要对其进行修改以支持添加注释。