我有一个K8s设置,交通流量是这样暴露的
kubernetes:
ingressClass: traefik
service:
nodePorts:
http: 32080
serviceType: NodePort
后面,我将一些请求转发给不同的服务
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-name
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: my-host.com
http:
paths:
- path: /my-first-path
backend:
serviceName: my-nodeJs-services
servicePort: 3000
当DNS直接设置为解析到我的ip时,应用程序可以正常使用HTTP
http://my-host.com: 32080/my-first-path
但是当有人通过AWS ALB/API网关添加SSL时,应用程序无法访问404-NotFound错误
路线是这样的https://my-host.com/my-first-path
在AWS规模上,他们配置了这样的东西
https://my-host.com => SSL Termination and => Forward all to 43.43.43.43:32080
我认为这个失败是因为traefik期待http://my-host.com而不是https://my-host.com,这导致它无法找到匹配的路线?或者在ssl终止时,主机名丢失了,因此trafik无法找到路由?
在这种情况下我该怎么做?我不是很熟悉ALB,但可能发生的是负载均衡器收到的请求包含头Host: my-host.com
,当它被转发到您的入口控制器时,头被Host: 43.43.43.43
取代。如果是这种情况,我看到3个解决方案:
- ALB可能能够将原始主机头传递给目标。(如果可能的话,你必须在文件中检查)
- 如果你的入口背后的应用程序不检查主机头,你可以写一个不检查特定主机的入口。例如,在这些示例中,您可以看到未指定主机字段。
- 如果名称解析在内部工作,您可以为目标定义一个名称,并在您的ALB和入口中使用该名称。