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

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

说明

该功能为 ALB 产品的邀测功能,如需使用,请联系您的客户经理。

前提条件

使用限制

注意

ALB 提供基础版和标准版两种实例版本,VKE 仅支持对接 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(/|$)(.*)。详情请参见 创建转发规则