【问题标题】:K8s Ingress resource does not add original URL prefix to Location response headerK8s Ingress 资源未将原始 URL 前缀添加到 Location 响应标头
【发布时间】:2022-01-06 20:02:24
【问题描述】:

我无法正确指定 Ingress 资源,因此应用的 Location 标头被重写以在前面包含原始 URL 路径。

使用配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-fanout-namespace-xyz
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  namespace: namespace-xyz
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /analytics/spark/master(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: spark-master-svc
                port:
                  number: 80
          - path: /analytics/jupyter/lab(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: jupyter-proxy-public
                port:
                  number: 80

请求网址:https://xx-xx.yyy.elb.amazonaws.com/analytics/jupyter/lab/

响应头:location: /hub/

重定向到https://xx-xx.yyy.elb.amazonaws.com/hub/,404s。

这应该改为为location: /analytics/jupyter/lab/发送重定向

这似乎是 add-base-url 的用途,现在已弃用。 什么是正确的替换,我怎样才能有效地使 Location 变为 /analytics/jupyter/lab/hub/ ?


如果我完全删除 rewrite-target,那么 http://xx-xx.yyy.elb.amazonaws.com/analytics/jupyter/lab/ 根本不会重定向,它只是 404s。


信息:

NGINX 入口控制器版本:

-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:       v1.0.5
  Build:         7ce96cbcf668f94a0d1ee0a674e96002948bff6f
  Repository:    https://github.com/kubernetes/ingress-nginx
  nginx version: nginx/1.19.9

-------------------------------------------------------------------------------

Kubernetes 版本(使用kubectl version):

Client Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.2-13+d2965f0db10712", GitCommit:"d2965f0db1071203c6f5bc662c2827c71fc8b20d", GitTreeState:"clean", BuildDate:"2021-06-26T01:02:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.2-eks-0389ca3", GitCommit:"8a4e27b9d88142bbdd21b997b532eb6d493df6d2", GitTreeState:"clean", BuildDate:"2021-07-31T01:34:46Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}

环境:

  • AWS EKS
  • 亚马逊 Linux 2

ingress-nginx-controller 是通过 ArgoCD / Helm 安装的,上面显示了版本信息,并且没有覆盖任何值。

$ kubectl describe ingressclasses
Name:         nginx
Labels:       app.kubernetes.io/component=controller
              app.kubernetes.io/instance=ingress-controller
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=ingress-nginx
              app.kubernetes.io/version=1.0.5
              helm.sh/chart=ingress-nginx-4.0.9
Annotations:  <none>
Controller:   k8s.io/ingress-nginx
Events:       <none>

【问题讨论】:

  • 我不确定 jupyter 代理到底是什么,但我认为您需要为该服务背后的工作负载设置某种 base_url。现在它不知道它是从子路径提供服务的事实,所以当它发送重定向时,它发送就好像它是(并且实际上是)从根 url 提供的一样。
  • 我看到有一个用于 jupyter 的 helm,其中包括 ingress 和 baseUrl 可以在 values 中设置。
  • 快速测试显示helm install my-jupyterhub jupyterhub/jupyterhub -n jupyterhub --create-namespace --set hub.baseUrl="/analytics/jupyter/lab" --set ingress.enabled=true --set ingress.pathType="ImplementationSpecific" --set proxy.service.type=NodePort --set ingress.annotations.'kubernetes\.io/ingress\.class'=nginx 为我部署了jupyter hub 和Ingress,我可以通过&lt;ip_address&gt;/analytics/jupyter/lab/ 访问它。

标签: nginx kubernetes reverse-proxy kubernetes-ingress nginx-ingress


【解决方案1】:

jupyter-proxy 需要为该服务背后的工作负载设置其 base_url。现在它不知道它是从子路径提供的,所以当它发送重定向时,它发送的好像它是(并且实际上是)从根 url 提供的一样。

快速测试表明

helm install my-jupyterhub jupyterhub/jupyterhub -n jupyterhub \
--create-namespace \
--set hub.baseUrl="/analytics/jupyter/lab" \
--set ingress.enabled=true \
--set ingress.pathType="ImplementationSpecific" \
--set proxy.service.type=NodePort \
--set ingress.annotations.'kubernetes\.io/ingress\.class'=nginx

使用Ingress 为我部署了jupyter hub,我可以通过&lt;X.X.X.X&gt;/analytics/jupyter/lab/ 访问它

【讨论】:

  • [从上面重新发布] 这行得通,但从设计的角度来看并不完全正确。我希望反向代理(Nginx)本身重写它从应用程序(Jupyter)返回的 Location 标头,而不是告诉应用程序层有关 baseUrl。这意味着 Jupyter 永远不需要直接知道它的 baseUrl。
  • 我认为(我在这里猜测)这种方法(进行 nginx 重写响应)的问题在于,它不仅是要重写的 Location Header,还有链接在 html/js 中。
  • 是的,确实如此 - 例如,当该 href 需要为 href="/analytics/spark/master/static/spark-logo-77x50px-hd.png" 时,使用类似 &lt;link rel="shortcut icon" href="/static/spark-logo-77x50px-hd.png" 的东西的 Spark 主 UI 也看到了这个问题。感觉 Ingress 肯定没有为我点击,而且我遗漏了一些明显的东西,因为并非每个 Helm 图表都提供相当于 baseUrl(Spark 没有)。
  • Internet 说 spark 还没有准备好从反向代理后面运行。有一个从未合并的 PR 和一个 article,他们在其中展示了 sub_filter 是如何实现的,这(顺便说一句)完全符合我们的讨论 - 重写发回的内容。
  • 呃,好吧。感谢您挖掘它。
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2023-01-26
  • 2012-04-10
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多