SSL 终止负载均衡器后面的 Traefik return 404
Traefik behind ssl terminating load balancer return 404
我有一个 K8s 设置,traefik 是这样暴露的
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 but not https://my-host.com 导致它找不到匹配的路由?或者可能在 ssl 终止时,主机名丢失,导致 traefik 找不到路由?
遇到这种情况我该怎么办?
我对 ALB 不是很熟悉,但可能发生的情况是负载均衡器收到的请求包含 header Host: my-host.com
,当它转发到您的入口控制器时,header 替换为 Host: 43.43.43.43
。如果是这种情况,我看到 3 个解决方案:
- ALB 可能能够将原始主机 header 传递给目标。 (如果可能的话,您必须查看文档)
- 如果入口后面的应用程序不检查主机 header,您可以编写一个不检查特定主机的入口。例如,在这些 examples 上,您可以看到未指定主机字段。
- 如果名称解析在内部起作用,您可以为您的目标定义一个名称,在您的 ALB 和入口中使用这个名称。
我有一个 K8s 设置,traefik 是这样暴露的
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 but not https://my-host.com 导致它找不到匹配的路由?或者可能在 ssl 终止时,主机名丢失,导致 traefik 找不到路由?
遇到这种情况我该怎么办?
我对 ALB 不是很熟悉,但可能发生的情况是负载均衡器收到的请求包含 header Host: my-host.com
,当它转发到您的入口控制器时,header 替换为 Host: 43.43.43.43
。如果是这种情况,我看到 3 个解决方案:
- ALB 可能能够将原始主机 header 传递给目标。 (如果可能的话,您必须查看文档)
- 如果入口后面的应用程序不检查主机 header,您可以编写一个不检查特定主机的入口。例如,在这些 examples 上,您可以看到未指定主机字段。
- 如果名称解析在内部起作用,您可以为您的目标定义一个名称,在您的 ALB 和入口中使用这个名称。