Kubernetes Nginx Ingress删除部分URL

Sam*_*gan 1 nginx kubernetes kubernetes-ingress

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

例如,我的Ingress是使用http://app.client.com的URL设置的,并且/ app1g的路径为http://app.client.com/app1可以正常工作。但是,如果我尝试转到http://app.client.com/app1/service1,而我最终只能访问http://app.client.com/app1,那么它似乎剥夺了路径之后的所有内容。

我的入口看起来像这样:

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:
    - {}
Run Code Online (Sandbox Code Playgroud)

如果我移植到该服务并直接点击该服务,它将起作用。

Sam*_*gan 6

所以我找到了答案。从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: /$1
  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:
    - {}
Run Code Online (Sandbox Code Playgroud)