需要使用 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 添加注释,因此您需要对其进行修改以支持添加注释。
我尝试将 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 添加注释,因此您需要对其进行修改以支持添加注释。