使用 Kong 作为负载均衡器部署 Tiledesk 后,脚本和 css 无法访问

问题描述 投票:0回答:1

我正在尝试将 tiledesk 部署到我的 Kubernetes。 Helm Chart 使用 Nginx 作为负载均衡器,但我在集群中使用 Kong,所以,我尝试适应。

Helm 图表入口定义如下:

ingress:
  enabled: true  
  annotations:
    kubernetes.io/ingress.class: nginx #deprecated
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/firebase-messaging-sw.js /chat/firebase-messaging-sw.js last;
  hosts:
    hostip: 
      name:
      enabled: true
      paths: 
        - path: /api/(.*)
          service: server
        - path: /ws/(.*)
          service: server
        - path: /dashboard/(.*)
          service: dashboard
        - path: /cds/(.*)
          service: cds
        - path: /chat/(.*)
          service: ionic
        - path: /widget/(.*)
          service: webwidget
        - path: /widget-config.json
          service: webwidget
        - path: /mqws/(.*)
          service: rabbitmq
          servicePort: 15675
        # - path: /mq
        #   service: rabbitmq
        - path: /chatapi/(.*)
          service: c21httpsrv
    hostconsole:
      name: console.tiledesk.local
      enabled: true
      paths: 
        - path: /api/(.*)
          service: server
        - path: /ws/(.*)
          service: server
        - path: /dashboard/(.*)
          service: dashboard
        - path: /cds/(.*)
          service: cds
        - path: /chat/(.*)
          service: ionic
        - path: /widget/(.*)
          service: webwidget
        - path: /widget-config.json
          service: webwidget
        - path: /mqws/(.*)
          service: rabbitmq
          servicePort: 15675
        # - path: /mq/(.*)
        #   service: rabbitmq
        - path: /chatapi/(.*)
          service: c21httpsrv
    hostapi: 
      name: api.tiledesk.local
      enabled: false
      paths: 
        - path: /(.*)
          service: server
    hostrtm: 
      name: rtm.tiledesk.local
      enabled: false
      paths: 
        - path: /(.*)
          service: server
    hostwidget:
      name: widget.tiledesk.local 
      enabled: false
      paths: 
        - path: /(.*)
          service: webwidget
  tls: []
    #  - secretName: tiledesk-tls-secret
    #    hosts:
    #      - console.tiledesk.local
    #      - api.tiledesk.local

然后,我尝试编写一个具有相同路由的 Kong Ingress 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tiledesk-proxy-kong
  annotations:
    kubernetes.io/tls-acme: "true"
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: kong
    konghq.com/override: tiledesk-proxy-kong
    konghq.com/strip-path: "true"
    konghq.com/preserve-host: "true"
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: tiledesk-server
            port:
              number: 80
        path: /api
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-server
            port:
              number: 80
        path: /ws
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-dashboard
            port:
              number: 80
        path: /dashboard
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-cds
            port:
              number: 80
        path: /cds
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-ionic
            port:
              number: 80
        path: /chat
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-webwidget
            port:
              number: 80
        path: /widget
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-webwidget
            port:
              number: 80
        path: /widget-config.json
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-rabbitmq
            port:
              number: 15675
        path: /mqws
        pathType: Prefix
      - backend:
          service:
            name: tiledesk-c21httpsrv
            port:
              number: 80
        path: /chatapi
        pathType: Prefix

但是,应用后,tiledesk 可以访问 throw [address]/dashboard/ 但无法正确加载。经过一些调试后,我发现 javascript 和 css 没有加载。我尝试使用 strip-path 和preserve-host 的组合来解决,但没有成功。

我该如何解决这个问题?

kubernetes nginx kubernetes-helm kong
1个回答
0
投票

在 Nginx 配置中,使用

rewrite-target
和特定的重写规则对于正确提供静态内容非常重要,如果不进行一些调整,可能无法直接在 Kong Ingress Controller 中复制。

在适应 Kong 时,您尝试镜像此设置,但遇到静态内容未加载的问题。我认为 Kong 的

strip-path
preserve-host
注释虽然有些相似,但并没有提供与 Nginx 重写规则相同级别的对请求路径的控制。如果默认行为不符合您的需求,您可能还需要使用更具体的路径路由,甚至自定义 Kong 插件(如issue 568中所示)。

strip-path
设置为
true
时,Kong会在将请求转发到上游服务之前删除路径的匹配部分。如果应用程序需要原始路径,这可能会导致问题。尝试将提供静态内容的路由的
strip-path
设置为
false
,看看是否可以解决问题(通常默认禁用)。

如果特定静态内容未加载,请考虑在 Kong Ingress 中为这些资产添加更多特定路由。这可能意味着为经常丢失的资产文件夹(如

/css
/js
等)创建专用路由,并确保它们指向能够为其提供服务的正确服务。

例如,如果您遇到特定类型的静态内容的问题(例如,CSS 文件未从特定路径加载),您可以向 Kong Ingress 添加更具体的路由,如下所示:

- backend:
    service:
      name: tiledesk-webwidget
      port:
        number: 80
  path: /widget/css
  pathType: Prefix

并确保为此路线正确配置

strip-path

© www.soinside.com 2019 - 2024. All rights reserved.