GKE Ingress负载均衡下Odoo 15.0长轮询异常求助
问题描述
在GKE(Google Kubernetes Engine)中部署Odoo 15.0,通过GKE Ingress负载均衡暴露服务,遇到以下异常:
- 无实时聊天活动时,
/longpolling/poll接口在50秒后返回502错误 - 模拟实时消息收发时,该接口返回200正常响应
本地Docker部署时,无活动状态下/longpolling/poll也能正常返回200,希望继续使用GKE Ingress以集成Google托管证书,寻求解决方案。
Odoo配置(odoo.conf)
[options] addons_path = /mnt/extra-addons admin_passwd = csv_internal_sep = , data_dir = /var/lib/odoo db_host = 172.20.x.x db_maxconn = 64 db_name = odoo db_password = odoo db_port = 5432 db_sslmode = prefer db_template = template0 db_user = odoo ;dbfilter = demo = {} email_from = False geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb http_enable = True # http_interface = 127.0.0.1 http_port = 8069 import_partial = limit_memory_hard = 2684354560 limit_memory_soft = 2147483648 limit_request = 8192 limit_time_cpu = 60 limit_time_real = 120 limit_time_real_cron = -1 list_db = False log_db = False log_db_level = warning log_handler = :INFO log_level = debug logfile = longpolling_port = 8072 # xmlrpc_port = 8069 # xmlrpc_interface = 127.0.0.1 # netrpc_interface = 127.0.0.1 max_cron_threads = 2 osv_memory_age_limit = False osv_memory_count_limit = False pidfile = None proxy_mode = True reportgz = False screencasts = None screenshots = /tmp/odoo_tests ;server_wide_modules = openupgrade_framework smtp_password = False smtp_port = 25 smtp_server = localhost smtp_ssl = False smtp_user = False ;syslog = False test_enable = False test_file = False test_tags = None translate_modules = ['all'] unaccent = False ;upgrades_paths = without_demo = True workers = 0
GKE Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: ingress.gcp.kubernetes.io/pre-shared-cert: ssl-odoo kubernetes.io/ingress.class: gce kubernetes.io/ingress.global-static-ip-name: gcp-lb-static-odoo labels: app: odoo-ingress app.kubernetes.io/component: odoo-ingress app.kubernetes.io/instance: odoo-ingress name: odoo-ingress namespace: odoo spec: defaultBackend: service: name: odoo-cls-service port: number: 8069 rules: - host: odoo.dummyodoo.com http: paths: - path: /longpolling pathType: Prefix backend: service: name: odoolp-cls-service # tried with dedicated or same as / port: number: 8072 - path: / pathType: Prefix backend: service: name: odoo-cls-service port: number: 8069
解决方案建议
1. 调整GKE后端服务超时时间
GKE Ingress默认后端服务超时为30秒,而Odoo longpolling无活动时会保持连接约60秒,导致负载均衡提前断开返回502。需为longpolling对应的后端服务设置更长超时:
- 使用
gcloud命令更新(替换为你的服务名):
gcloud compute backend-services update odoolp-cls-service --global --timeout=70s
- 或通过BackendConfig资源配置:
先创建BackendConfig:
apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: longpolling-backend-config spec: timeoutSec: 70
再为longpolling服务添加注解:
metadata: annotations: cloud.google.com/backend-config: '{"default": "longpolling-backend-config"}'
2. 同步Odoo的超时参数
在odoo.conf中调整超时设置,确保小于GKE后端服务超时:
# 全局请求超时,建议比GKE超时少5-10秒 limit_time_real = 60 # 单独设置longpolling超时(Odoo 15支持) longpolling_timeout = 60
3. 启用会话保持(可选)
为longpolling接口启用会话保持,确保同一客户端请求路由到同一Odoo实例,避免连接异常:
在Ingress注解中添加:
metadata: annotations: ingress.gcp.kubernetes.io/affinity: "cookie" ingress.gcp.kubernetes.io/session-cookie-name: "GKE-AFFINITY" ingress.gcp.kubernetes.io/session-cookie-max-age: "86400"
4. 优化Odoo进程配置
当前workers=0为单进程模式,高并发下可能导致longpolling处理不及时,建议调整:
workers = 4 longpolling_workers = 2
分离HTTP请求与longpolling请求的处理进程,提升稳定性。
5. 修正健康检查配置
确保longpolling服务的健康检查路径正确,避免实例被误剔除:
- 使用
gcloud更新健康检查:
gcloud compute health-checks update http longpolling-health-check --request-path=/longpolling/health --port=8072 --global
内容的提问来源于stack exchange,提问作者Erlangga Er
相关产品推荐
相关产品推荐

