Kubernetes 上的 Traefik 不会保留重定向路径

Traefik on Kubernetes does not keep path over redirect

我在 Kubernetes 上有一个 Traefik,它充当入口和负载均衡器。 我有这样的入口设置:

{
    "apiVersion": "extensions/v1beta1",
    "kind": "Ingress",
    "metadata": {
        "name": "nppl-ingress",
        "annotations": {
            "kubernetes.io/ingress.class": "traefik",
            "traefik.frontend.rule.type": "PathPrefixStrip"
        }
    },
    "spec": {
        "rules": [
            {
                "host": "" ,
                "http": {
                    "paths": [
                        {
                            "path": "/discover-service",
                            "backend": {
                                "serviceName": "discover-service",
                                "servicePort": "discover-port"
                            }
                        },
                        {
                            "path": "/config-server",
                            "backend": {
                                "serviceName": "config-server",
                                "servicePort": "config-port"
                            }
                        }

                    ]
                }
            }
        ]
    }
}

例如,当我点击“http://IP/config-server", because I have a basic auth on that service, the service does a redirect over "http://IP/login" so I get a 404 but I was expecting "http://IP/config-server/login”时。 我的配置有什么问题?我还在规则类型下尝试了 "PathPrefix" 和 "Path" 但它不起作用。 当我的服务执行重定向时,我需要保留我的基本路径。

这里的问题是 PathPrefixStrip 删除了 /config-server 并且它最初仅使用 / 将请求转发到您的后端。但是,当您的后端重定向时,它是一个新请求,而 Ingress 不理解对 //login 的请求。您可以为每个后端创建两个 Ingress(es),并在每个后端中使用单个后端,路径为 /。但这将意味着添加一个新的 ingress-class 和 the good news is that Traefik supports it. You could also try an nginx 具有 --ingress-class 选项的入口。

您可以找到有关如何创建多个入口控制器的更多信息here

如果您想要单个 Ingress,这也很棘手,因为您可能必须在应用中添加逻辑才能理解 /config-server 路径。