暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes进阶:Ingress Nginx URL重写实战

Linux运维智行录 2024-09-08
31

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


ingress-nginx


01
为什么需要Rewrite?

Rewrite(重写)通常指的是在网络层面上对数据包进行修改的过程。在Web应用和网络安全领域,重写技术被广泛应用于多种场景,原因包括但不限于:

  1. 安全性增强:通过重写,可以添加或修改HTTP头部,例如添加安全相关的头部(如X-Frame-Options、Content-Security-Policy等),以防止跨站脚本攻击(XSS)、点击劫持等安全威胁。

  2. 性能优化:重写可以帮助优化负载均衡器的路由规则,或者修改请求和响应,以提高应用性能。

  3. 内容转换:在不同平台或设备间转换内容格式,例如将HTTP重定向到HTTPS,或者将旧的URL模式转换为新的模式。

  4. 负载均衡:在负载均衡器中,重写可以用来确保流量按照特定的规则分发到不同的服务器。

  5. 会话保持:在某些应用中,需要保持用户会话的一致性,重写可以帮助实现会话粘性。

  6. 缓存优化:通过重写URL或查询参数,可以控制缓存的行为,例如避免缓存污染或实现更有效的缓存利用。


02
配置Ingress Rewrite实战

URL重写通常有三种:

  1. 访问URL过长,访问应用不方便

  2. 通过一个域名访问多个模块,域名后面多加一层模块标识

  3. 应用主页是在/xxx,想把主页设置成/

Tip:本文章分别讨论以上三种情况




减少URL路径


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-7864c
cf7c9-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地址




增加URL路径


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地址


03
参考文章

ingress配置参考地址:

  • https://kubernetes.github.io/ingress-nginx/examples/rewrite

  • https://www.kancloud.cn/jiaxzeng/kubernetes/3125882


04
问题背景

通过合理的配置Ingress Nginx Controller中的重写规则,不仅可以简化应用程序的URL结构,还能提高系统的可维护性和扩展性。希望本文能够帮助读者更好地理解和运用这一功能。

END

文章转载自Linux运维智行录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论