I have an Odoo 14 app running on GKE cluster. The multiprocessor mode has been enabled by setting workers = 2
. I chose the default GKE ingress to route the requests that match /longpolling/*
to the longpolling port and the rest to the normal port.
Here's how I configure my GKE ingress.
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
}
The Kubernetes Service looks like this.
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"
}
}
}
The custom backend config long-polling-be-config
is as follows.
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
The health check for port 8069
is defined in the Kubernetes Deployment as follows.
readiness_probe {
http_get {
path = "/web/database/selector"
port = "8069"
}
initial_delay_seconds = 15
period_seconds = 30
}
The backend is healthy but I am still seeing this error once every minute or so.
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, *args, **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, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", 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
I followed the solution from this question, which is via nginx reverse proxy. How can I replicate that using GKE ingress?