我正在尝试在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。 我曾经尝试过使用正则表达式之类的几种方法,但根本无法正常工作
后端是公正的回显服务器,始终在任何路径上进行回复。
答案 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(/|$)(.*)