Kubernetes入口Nginx与子路径不匹配

时间:2018-10-19 14:31:10

标签: kubernetes kubernetes-ingress nginx-ingress

我正在尝试在Google云上创建一个ingress-nginx的简单示例,但是它与子路径不匹配:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /one
          backend:
            serviceName: test-one-backend
            servicePort: 80
        - path: /two
          backend:
            serviceName: test-two-backend
            servicePort: 80

当我打电话时,http://server/one有效,但是当我打电话给http://server/one/path时,我得到404。 我曾经尝试过使用正则表达式之类的几种方法,但根本无法正常工作

后端是公正的回显服务器,始终在任何路径上进行回复。

3 个答案:

答案 0 :(得分:1)

您需要在路径末尾使用/*

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /one/*
          backend:
            serviceName: test-one-backend
            servicePort: 80
        - path: /two
          backend:
            serviceName: test-two-backend
            servicePort: 80

这实际上不是documented widely as of today,但实际上path转换为nginx.conf中的location {}

答案 1 :(得分:0)

此定义与路径的确切字符串匹配。如果要包括子目录,可以使用通配符*。您修改后的定义应如下所示:

- path: /one/*
  backend:
    serviceName: test-one-backend
    servicePort: 80

我不确定http://server/one(末尾没有斜杠)是否仍然有效。在这种情况下,您必须保留原来的定义,然后再添加一个如上的定义。

答案 2 :(得分:0)

请注意,它在ingress-nginx的0.22.0版本中进行了更改。 https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md处的结帐示例 现在,您必须与捕获的组一起使用才能将子路径传递给重写目标。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /something(/|$)(.*)