【问题标题】:Traefik behind ssl terminating load balancer return 404ssl 后面的 Traefik 终止负载均衡器返回 404
【发布时间】:2021-04-25 13:54:32
【问题描述】:

我有一个 traefik 像这样暴露的 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 Gateway 添加 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 终止时,主机名丢失,导致 traefik 找不到路由?

在这种情况下我该怎么办?

【问题讨论】:

    标签: kubernetes kubernetes-ingress traefik


    【解决方案1】:

    我对 ALB 不是很熟悉,但可能发生的情况是负载均衡器收到的请求包含标头 Host: my-host.com,当它被转发到您的入口控制器时,标头被 Host: 43.43.43.43 替换。如果是这种情况,我看到了 3 个解决方案:

    1. ALB 可能能够将原始 Host 标头传递给目标。 (如果可能,您必须检查文档)
    2. 如果您的入口后面的应用程序不检查主机标头,您可以编写一个不检查特定主机的入口。例如在这些examples 上,您可以看到没有指定主机字段。
    3. 如果名称解析在内部工作,您可以为您的目标定义一个名称,在您的 ALB 和入口中使用此名称。

    【讨论】:

    • 谢谢。我遵循您的建议并更改/转发正确的主机标头。我也做了很多小事,所以我不知道哪个特定部分解决了我的问题,但它现在可以工作了,转发正确的主机当然是正确的事情!
    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 2020-06-28
    • 1970-01-01
    • 2017-04-01
    • 2018-02-21
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多