Odoo 14 长轮询总线在 GKE Ingress 后面运行的总线不可用

问题描述

我在 GKE 集群上运行了一个 odoo 14 应用。已通过设置 workers = 2 启用多处理器模式。我选择了认的 GKE 入口将匹配 /longpolling/* 的请求路由到长轮询端口,其余的路由到普通端口。

这是我配置 GKE 入口的方法

ingress.tf

resource "kubernetes_ingress" "ingress_service" {
  Metadata {
    name = "ingress-service"
    annotations = {
      "networking.gke.io/managed-certificates": "subdomain-company-com"
      "networking.gke.io/v1beta1.FrontendConfig": "frontend-config" # for https redirection
    }
  }
  spec {
    rule {
      host = "dev.company.com"
      http {
        path {
          path = "/*"
          backend {
            service_name = kubernetes_service.core_service.Metadata.0.name
            service_port = kubernetes_service.core_service.spec.0.port.0.port
          }
        }
      }
    }

    rule {
      host = "dev.company.com"
      http {
        path {
          path = "/longpolling/*"
          backend {
            service_name = kubernetes_service.core_service.Metadata.0.name
            service_port = kubernetes_service.core_service.spec.0.port.1.port
          }
        }
      }
    }
  }

  wait_for_load_balancer = true
}

Kubernetes 服务如下所示。

resource "kubernetes_service" "core_service" {
  Metadata {
    name = "core-service"
    annotations = {
      "cloud.google.com/backend-config" = jsonencode({
        "ports" = {
          "longpolling" = "long-polling-be-config"
        }
      })
    }
  }
  spec {
    type = "NodePort"
    selector = {
      app = "core"
    }
    port {
      name = "normal"
      port = 8080
      protocol = "TCP"
      target_port = "8069"
    }
    port {
      name = "longpolling"
      port = 8081
      protocol = "TCP"
      target_port = "8072"
    }
  }
}

自定义后端配置 long-polling-be-config 如下。

apiVersion: cloud.google.com/v1
kind: BackendConfig
Metadata:
  name: long-polling-be-config
spec:
  healthCheck:
    checkIntervalSec: 30
    healthyThreshold: 5
    type: HTTP
    requestPath: /web/database/selector
    port: 8081

端口 8069 的运行状况检查在 Kubernetes Deployment 中定义如下。

          readiness_probe {
            http_get {
              path = "/web/database/selector"
              port = "8069"
            }
            initial_delay_seconds = 15
            period_seconds = 30
          }

后端运行良好,但我仍然每分钟左右看到一次此错误

2021-07-10 12:41:24,014 15 INFO odoo werkzeug: 10.2.0.1 - - [10/Jul/2021 12:41:24] "POST /longpolling/poll HTTP/1.1" 200 - 1 0.001 0.010
2021-07-10 12:41:24,739 15 INFO ? werkzeug: 10.2.0.1 - - [10/Jul/2021 12:41:24] "GET /web/database/selector HTTP/1.1" 200 - 6 0.008 0.102
2021-07-10 12:41:29,106 15 INFO ? werkzeug: 10.2.0.1 - - [10/Jul/2021 12:41:29] "GET /web/database/selector HTTP/1.1" 200 - 6 0.009 0.076
2021-07-10 12:41:54,054 14 ERROR odoo odoo.http: Exception during JSON request handling.
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py",line 237,in _dispatch
    result = request.dispatch()
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 683,in dispatch
    result = self._call_function(**self.params)
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 359,in _call_function
    return checked_call(self.db,*args,**kwargs)
  File "/usr/lib/python3/dist-packages/odoo/service/model.py",line 94,in wrapper
    return f(dbname,**kwargs)
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 347,in checked_call
    result = self.endpoint(*a,**kw)
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 912,in __call__
    return self.method(*args,line 531,in response_wrap
    response = f(*args,**kw)
  File "/usr/lib/python3/dist-packages/odoo/addons/bus/controllers/main.py",line 35,in poll
    raise Exception("bus.Bus unavailable")
Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 639,in _handle_exception
    return super(JsonRequest,self)._handle_exception(exception)
  File "/usr/lib/python3/dist-packages/odoo/http.py",line 315,in _handle_exception
    raise exception.with_traceback(None) from new_cause
Exception: bus.Bus unavailable

我遵循了 question 中的解决方案,这是通过 Nginx 反向代理。我如何使用 GKE 入口复制它?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)