我正在尝试重写服务路径,同时使用 kubernetes 上的 nginx ingress 保留浏览器 url。
我需要的是这个:
http://example.com/path
=>http://service
http://example.com/path/bar
=>http://service/bar
http://example.com/path/file.css
=>http://service/file.css
也就是说,使其/path
成为上游服务器中的根(或某个不同的 URL)。
据我所见这里,这是使用 proxy_pass 上的尾随斜杠完成的,但 nginx ingress 似乎没有这个选项。
这是可能的 nginx 入口吗?
答案1
在 Nginx Ingress 上可行吗?
是的,为了实现它,你可以使用
rewrite-target
。它将创建一个捕获组并将其发送到适当的服务。这是一个 Ingress 示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: "rewrite"
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http: example.com
paths:
- path: /foo(/|$)(.*)
backend:
serviceName: echo-svc
servicePort: 80
在这个入口定义中,任何被捕获的字符都
(.*)
将被分配给占位符$2
,然后将其用作注释中的参数rewrite-target
。
这个入口将执行以下操作:
- 请求/foo将作为/
- 请求/foo/bar将作为/酒吧
- 请求/foo/file.css将作为/文件.css
- Nginx Ingress 用途路径优先级:
在 NGINX 中,正则表达式遵循首次匹配策略。为了实现更准确的路径匹配,ingress-nginx 首先按长度降序排列路径,然后将其作为位置块写入 NGINX 模板。
例子:
$ kubectl apply -f echo-ingress.yaml
ingress.networking.k8s.io/echo-ingress created
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
echo-ingress mydomain.com 35.188.7.149 80 48s
$ tail -n 1 /etc/hosts
35.188.7.149 mydomain.com
$ curl mydomain.com/foo/bar
{"path": "/bar",
...suppressed output...
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
$ curl mydomain.com/foo
{"path": "/",
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
如果您有任何问题,请在评论中告诉我。
答案2
简而言之:是的。请确保不要混淆 nginx-ingress(您在问题中将其用作标签)和 ingress-nginx,它们是不同的。它通过根据文档安装 ingress-nginx 来工作。@Will ROF 提供的答案显示了如何操作,文档可以在这里找到: https://kubernetes.github.io/ingress-nginx/user-guide/ingress-path-matching/