繁体   English   中英

使用 nginx.ingress.kubernetes.io/rewrite-target 给出“默认后端 - 404”

[英]Using nginx.ingress.kubernetes.io/rewrite-target gives “default backend - 404”

我有一个在 kubernetes 中运行的应用程序,我可以从我的浏览器访问集群外部:

http://myapp.internal/myapp/content

使用以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    app.kubernetes.io/instance: myapp
    app.kubernetes.io/name: myapp
  name: myapp
  namespace: samples
spec:
  rules:
  - host: myapp.internal
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 8080
        path: /myapp/content
status:
  loadBalancer:
    ingress:
    - {}

现在我想访问它:

http://myapp.internal/content

相反,但没有修改我的应用程序(目前这不是一个选项)。

基于:

https://kubernetes.github.io/ingress-nginx/examples/rewrite/

看来我可以这样做:

nginx.ingress.kubernetes.io/rewrite-target: /myapp/content

所以我更新了我的入口,看起来像这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /myapp/content
  labels:
    app.kubernetes.io/instance: myapp
    app.kubernetes.io/name: myapp
  name: myapp
  namespace: samples
spec:
  rules:
  - host: myapp.internal
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 8080
        path: /content
status:
  loadBalancer:
    ingress:
    - {}

我现在假设当我输入时:

http://myapp.internal/content

在我的浏览器中,上面的rewrite-target规则然后将其转换为:

http://myapp.internal//myapp/content

它实际上是这样做的。 但我没有看到我的内容,而是得到:

default backend - 404

基本上我需要这个例子的反面:

https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/rewrite

所以原始示例说:

rewrite.bar.com/something/new rewrites to rewrite.bar.com/new

我需要的地方:

rewrite.bar.com/new rewrites to rewrite.bar.com/something/new

我错过了什么?

实际上你不需要设置nginx.ingress.kubernetes.io/rewrite-target: /myapp/content 了解流程,通过路径/myapp/content您正在访问myapp服务,因此您应该只替换路径(因为您想重定向路径) path: /content ,它会正常工作。 现在,如果您点击/content路径,那么它将 go 到相同的服务(名为myapp ),就像之前的/myapp/content一样。

yaml 应该是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    app.kubernetes.io/instance: myapp
    app.kubernetes.io/name: myapp
  name: myapp
  namespace: samples
spec:
  rules:
  - host: myapp.internal
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 8080
        path: /content
status:
  loadBalancer:
    ingress:

更新

实际上您的问题并不清楚,您想点击http://myapp.internal/content并重定向到http://myapp.internal/myapp/content吗? If it is what you are looking then it's not possible by changing ingress, because your ingresd will match till http://myapp.internal and rest of the part /content will go to your service backed pod, now if in your service backed pod你有 myapp/content 那么你如何发送内容来获得它呢?

您可以做的一件事是:运行一个 pod,您需要在其中使用/content路径运行另一个应用程序,它只会重定向到myapp/content pod,这两个 pod 都可以由myapp服务支持

我想你会奏效的。 重写目标是指应重定向流量的 URL。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/app-root: /myapp/content
  labels:
    app.kubernetes.io/instance: myapp
    app.kubernetes.io/name: myapp
  name: myapp
  namespace: samples
spec:
  rules:
  - host: myapp.internal
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 8080
        path: /content
status:
  loadBalancer:
    ingress:
    - {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM