在现代应用开发中,随着服务端点的不断增多,有效地管理和优化这些端点变得尤为重要。Kubernetes 提供了一种强大的解决方案——Ingress Nginx Controller,它不仅能够帮助我们实现负载均衡和服务发现,还允许我们对请求进行复杂的路由控制。其中,URL重写是一个非常实用的功能,它可以让我们改变请求的路径,从而达到隐藏内部结构、简化URL或者实现永久重定向的目的。

ingress-nginx
安全性增强:通过重写,可以添加或修改HTTP头部,例如添加安全相关的头部(如X-Frame-Options、Content-Security-Policy等),以防止跨站脚本攻击(XSS)、点击劫持等安全威胁。
性能优化:重写可以帮助优化负载均衡器的路由规则,或者修改请求和响应,以提高应用性能。
内容转换:在不同平台或设备间转换内容格式,例如将HTTP重定向到HTTPS,或者将旧的URL模式转换为新的模式。
负载均衡:在负载均衡器中,重写可以用来确保流量按照特定的规则分发到不同的服务器。
会话保持:在某些应用中,需要保持用户会话的一致性,重写可以帮助实现会话粘性。
缓存优化:通过重写URL或查询参数,可以控制缓存的行为,例如避免缓存污染或实现更有效的缓存利用。
URL重写通常有三种:
访问URL过长,访问应用不方便
通过一个域名访问多个模块,域名后面多加一层模块标识
应用主页是在/xxx,想把主页设置成/
Tip:本文章分别讨论以上三种情况
1、测试业务的服务以及路径
$ kubectl get service simple
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
simple ClusterIP 10.97.177.81 <none> 9999/TCP 5d11h
$ curl 10.97.177.81:9999/who/hostname
simple-7864ccf7c9-s5dmz
2、创建ingress资源
$ cat <<'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /who/$1
spec:
ingressClassName: nginx
rules:
- host: simple.jiaxzeng.com
http:
paths:
- backend:
service:
name: simple
port:
number: 9999
path: /(.*)
pathType: Prefix
EOF
3、验证服务
$ curl -H "host: simple.jiaxzeng.com" 172.139.20.100/hostname
simple-7864ccf7c9-s5dmz
Tip:
1、simple应用从 who/hostname 改写成 hostname
2、172.139.20.100 是 ingress地址
1、测试业务的服务以及路径
$ kubectl get service simple
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
simple ClusterIP 10.97.177.81 <none> 9999/TCP 5d11h
$ curl 10.97.177.81:9999/header
{
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.29.0"
]
}
2、创建ingress资源
$ cat <<'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: simple.jiaxzeng.com
http:
paths:
- backend:
service:
name: simple
port:
number: 9999
path: /request(/|$)(.*)
pathType: Prefix
EOF
3、验证服务
$ curl -H "host: simple.jiaxzeng.com" 172.139.20.100/request/header
{
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.29.0"
],
"X-Forwarded-For": [
"172.139.20.92"
],
"X-Forwarded-Host": [
"simple.jiaxzeng.com"
],
"X-Forwarded-Port": [
"80"
],
"X-Forwarded-Proto": [
"http"
],
"X-Forwarded-Scheme": [
"http"
],
"X-Real-Ip": [
"172.139.20.92"
],
"X-Request-Id": [
"7c057e4e1bb4683a4ef72879e0789ebb"
],
"X-Scheme": [
"http"
]
}
Tip:
1、simple应用从 header 改写成 request/header
2、172.139.20.100 是 ingress地址
1、测试业务的服务以及路径
$ kubectl get service simple
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
simple ClusterIP 10.97.177.81 <none> 9999/TCP 5d11h
$ curl 10.97.177.81:9999/hello
hello go server.
2、创建ingress资源
$ cat <<'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple
namespace: default
annotations:
nginx.ingress.kubernetes.io/app-root: /hello
spec:
ingressClassName: nginx
rules:
- host: simple.jiaxzeng.com
http:
paths:
- backend:
service:
name: simple
port:
number: 9999
path: /
pathType: Prefix
EOF
3、验证服务
$ curl -I -L -H "host: simple.jiaxzeng.com" 172.139.20.100/
HTTP/1.1 302 Moved Temporarily
Date: Sun, 08 Sep 2024 14:55:14 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: http://simple.jiaxzeng.com/hello
HTTP/1.1 200 OK
Date: Sun, 08 Sep 2024 14:55:14 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 17
Connection: keep-alive
Tip:
1、simple应用 /hello 改成 / 访问
2、172.139.20.100 是 ingress地址
ingress配置参考地址:
https://kubernetes.github.io/ingress-nginx/examples/rewrite
https://www.kancloud.cn/jiaxzeng/kubernetes/3125882
通过合理的配置Ingress Nginx Controller中的重写规则,不仅可以简化应用程序的URL结构,还能提高系统的可维护性和扩展性。希望本文能够帮助读者更好地理解和运用这一功能。





