Kubernetes Nginx Ingress 删除了 URL 的一部分

Kubernetes Nginx Ingress removing part of URL

我正在 Kubernetes(在 AKS 上)部署一个简单的应用程序,它位于使用 Nginx 的 Ingress 后面,使用 Nginx helm chart 部署。我有一个问题,由于某种原因,Nginx 似乎没有将完整的 URL 传递给后端服务。

例如,我的 Ingress 设置了 http://app.client.com and a path of /app1g going http://app.client.com/app1 works fine. However if I try to go to http://app.client.com/app1/service1 I just end up at http://app.client.com/app1 的 URL,它似乎正在剥离路径后的所有内容。

我的 Ingress 是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  creationTimestamp: "2019-04-03T12:44:22Z"
  generation: 1
  labels:
    chart: app-1.1
    component: app
    hostName: app.client.com
    release: app
  name: app-ingress
  namespace: default
  resourceVersion: "1789269"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
  uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
  rules:
  - host: app.client.com
    http:
      paths:
      - backend:
          serviceName: app-service
          servicePort: 8080
        path: /app1
  tls:
  - hosts:
    - app.client.com
    secretName: app-prod
status:
  loadBalancer:
    ingress:
    - {}

如果我转发到服务并直接点击它就可以了。

删除此行应该可以解决您的问题:

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

重写目标注释将完全按照它所说的进行操作:重写您的请求以命中“/”位置。参见 nginx-ingress docs for rewrite target

所以我找到了这个问题的答案。从 Nginx v0.22.0 开始,您似乎需要使用捕获组来捕获请求 URI 中的任何子字符串。在 0.22.0 之前,仅使用 nginx.ingress.kubernetes.io/rewrite-target: / 对任何子字符串都有效。现在它没有。我需要修改我的入口才能使用它:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  creationTimestamp: "2019-04-03T12:44:22Z"
  generation: 1
  labels:
    chart: app-1.1
    component: app
    hostName: app.client.com
    release: app
  name: app-ingress
  namespace: default
  resourceVersion: "1789269"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
  uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
  rules:
  - host: app.client.com
    http:
      paths:
      - backend:
          serviceName: app-service
          servicePort: 8080
        path: /app1/?(.*)
  tls:
  - hosts:
    - app.client.com
    secretName: app-prod
status:
  loadBalancer:
    ingress:
    - {}