ingress-nginx请求改写

Ingress-nginx 的 uri 改写功能

对于 ingress-nginx 来说配置请求麻烦一点,一些复杂的需求需要通过 Ingressannotation 来实现,比如我们需要实现一个 url rewrite 的功能。

URL 路径做一个 Rewrite, 在 ingress-nginx 官方文档中也给出了说明:

配置目标应用的 ingress

创建一个 ingress,path 匹配规则为 /abb(/|$)(.*),rewrite-target 中可以使用 path 中的正则匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tomcat-test
namespace: test
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: 'true'
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: test.sy.com
http:
paths:
- path: /abb(/|$)(.*)
backend:
serviceName: tomcat-test
servicePort: 6080
tls:
- hosts:
- test.sy.com
secretName: tls-secret

需要注意 rewrite-target 对 ingress 中的所有 path 有效。

效果

1
2
3
4
5
6
7
8
9
10
[root@ingress]# curl --cacert  ca.crt https://test.sy.com/abc/check_health.jsp
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.15.8.1</center>
</body>
</html>
[root@ingress]# curl --cacert ca.crt https://test.sy.com/abb/abc/check_health.jsp
hello 2020-03-19

如果要是代理外部url怎么办呢,这边先导入下service和endpoints

外部服务导入到 kubernetes 中

创建一个service

1
2
3
4
5
6
7
8
9
10
[root@ingress]# cat service.yaml 
kind: Service
apiVersion: v1
metadata:
name: tengine-nginx
spec:
type: ClusterIP
ports:
- port: 8000
targetPort: 8000

创建一个 与 Service 同名的 endpoint

1
2
3
4
5
6
7
8
9
kind: Endpoints
apiVersion: v1
metadata:
name: tengine-nginx
subsets:
- addresses:
- ip: 10.48.22.145
ports:
- port: 8000

创建ingress

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tengine-nginx
spec:
rules:
- host: test.sy.com
http:
paths:
- backend:
serviceName: tengine-nginx
servicePort: 8000
path: /

访问:

假设前面我们再加上一个跳转,让他默认跳转到10.48.22.145, 们可以通过 configuration-snippet 配置来完成,如下 Ingress 对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tengine-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/app-root: /10.48.22.145
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/10.48.22.145)$ $1/ redirect;
spec:
rules:
- host: test.sy.com
http:
paths:
- backend:
serviceName: tengine-nginx
servicePort: 8000
path: /10.48.22.145(/|$)(.*)

访问效果:

参考链接

Donate