You need to enable JavaScript to run this app.
导航
为 ALB Ingress 配置转发规则重写
最近更新时间:2025.03.31 16:29:27首次发布时间:2025.01.23 11:49:18
我的收藏
有用
有用
无用
无用

ALB Ingress 支持重写转发规则,当请求经过 ALB 时,ALB 可以直接改写请求路径,向后端服务器请求新路径内容,帮助您灵活地变更后端业务。

前提条件

使用限制

指定进行重写的转发规则,不能同时被指定重定向。

操作步骤

说明

更多使用限制和注意事项,请参见 配置重写转发规则

ALB Ingress 支持通过 Annotation 重写转发规则,向后端服务器请求新路径的内容。示例和注解说明如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 自定义路由规则名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-rules-configs-rewrite: |
      [
            {
                "host": "first.example.com",
                "path": "/",
                "rewriteURI": "/aaa"
            }
      ]
spec:
  ingressClassName: alb # ALBInstance 的资源名称
  rules:
  - host: first.example.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: service-demo-a
            port:
              number: 80
  - host: second.example.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: service-demo-b
            port:
              number: 80

ingress.vke.volcengine.com/loadbalancer-rules-configs-rewrite注解中的参数说明如下表所示。

字段类型描述默认值
hostString匹配重写规则的转发域名。该配置需要与spec中需要进行重写的域名一致。

path

String

匹配重写规则的转发路径。该配置需要与spec中需要进行重写的路径一致。

说明

支持使用正则表达式进行匹配,详情请参见 正则表达式匹配

rewriteURIString重写后的转发路径。

结果验证

查看配置

  1. 登录 应用型负载均衡控制台
  2. 单击左侧导航栏中 实例管理,在实例列表中选择目标 ALB 实例,在 操作 栏中单击 配置监听器
    alt
  3. 在 监听器 页面中,选择目标监听器,在 操作 栏中单击 编辑转发规则,查看当前监听器的转发规则。可以看到在 ALB 监听器中新增了两条转发规则,仅对 Annotation 中 Host 和 Path 匹配的转发规则进行了重写。而其他规则未被重写。
    alt
  4. 单击转发规则中的 alt,支持查看规则详情。规则配置详情,应该与下发的规则一致。
    alt

访问验证

说明

验证功能前,您需要在集群中部署后端应用和服务。本例中以 nginx 镜像,服务提供路径为/aaa为例。部署方式可参见 使用 ALB Ingress 实现业务发布

使用 ALB Ingress 中配置的域名访问服务。其中14.***.***.***为 ALB 公网 IP 地址。

curl -H "Host: first.example.com" http://14.***.***.***

预期结果如下,当访问请求的域名为first.example.com,原始路径为/时,路径被改写为/aaa,能够通过 ALB Ingress 正确访问到后端的服务。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

正则表达式匹配

匹配规则

ALB Ingress 转发规则重写支持正则表达式匹配和替换,基本规则如下:

  • Host 一致性:Annotation 中的 host 必须与 spec 中的 host 完全一致。
  • Path 格式处理
    • 若 spec 中的 path 为静态路径(如 /demo),则 Annotation 中的 path 直接填写相同值 /demo
    • 若 spec 中的 path 为正则表达式(如 /~/(.*)),则 Annotation 中的 path 需要去掉开头的 /,修改为 ~/(.*)
  • URI 重写规则
    • 静态路径:直接填写目标路径,例如 /aaa

    • 动态路径

      • 允许在 Ingress 的path中填写一个或多个正则表达式,同时支持填写多个变量()。然后在 rewriteURI 中通过 ${1}${2}${3} 获取一个或多个变量,最多支持获取三个变量。
      • 支持基于正则表达式匹配的结果作为参数自由组合,拼接出您想要的重写规则。
      • 通过正则表达式替换的逻辑为:客户端的请求匹配到正则表达式,正则表达式中有多个(),且rewriteURI注解中含有变量 ${1}${2}${3}中的一个或多个。

      说明

      例如:当您在 Annotation 中将 path 配置为 ~gateway/(.*)/(.*)/aaarewriteURI 配置为 /${1}/${2} 时。如果客户端发送请求的路径为 /gateway/ccc/bbb/aaa,则 path 会匹配到 ~gateway/(.*)/(.*)/aaarewriteURI 会把 ${1} 替换为 ccc${2} 替换为 bbb,最终后端服务器接收到的请求路径为 /ccc/bbb

匹配示例

在 ALB Ingress 中基于正则表达式配置转发规则重写的示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 自定义路由规则名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-rules-configs-rewrite: |
      [
            {
                "host": "example.com",
                "path": "~gateway(/|$)(.*)",
                "rewriteURI": "/${2}"
            }
      ]
spec:
  ingressClassName: alb # ALBInstance 的资源名称
  rules:
  - host: example.com
    http:
      paths:
      - pathType: Prefix
        path: /~gateway(/|$)(.*)
        backend:
          service:
            name: service-demo
            port:
              number: 80

说明

由于 ALB 产品中规定正则表达式必须以~开头,同时 Kubernetes 要求 Ingress 的spec中的 path 必须带有前缀 /。为同时兼容两者的要求,因此在spec 中的 path 的正则表达式写为 /~gateway(/|$)(.*) 的形式,实际上生效的字段为 ~gateway(/|$)(.*)。详情请参见 创建转发规则