我正在尝试将 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 的组合来解决,但没有成功。
我该如何解决这个问题?
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
。