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
注解中的参数说明如下表所示。
字段 | 类型 | 描述 | 默认值 |
---|---|---|---|
host | String | 匹配重写规则的转发域名。该配置需要与spec 中需要进行重写的域名一致。 | 无 |
path | String | 匹配重写规则的转发路径。该配置需要与 说明 支持使用正则表达式进行匹配,详情请参见 正则表达式匹配。 | 无 |
rewriteURI | String | 重写后的转发路径。 | 无 |
说明
验证功能前,您需要在集群中部署后端应用和服务。本例中以 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
必须与 spec
中的 host
完全一致。spec
中的 path
为静态路径(如 /demo
),则 Annotation 中的 path
直接填写相同值 /demo
。spec
中的 path
为正则表达式(如 /~/(.*)
),则 Annotation 中的 path
需要去掉开头的 /
,修改为 ~/(.*)
。静态路径:直接填写目标路径,例如 /aaa
。
动态路径
path
中填写一个或多个正则表达式,同时支持填写多个变量()
。然后在 rewriteURI
中通过 ${1}
、${2}
或 ${3}
获取一个或多个变量,最多支持获取三个变量。()
,且rewriteURI
注解中含有变量 ${1}
、${2}
和 ${3}
中的一个或多个。说明
例如:当您在 Annotation 中将 path
配置为 ~gateway/(.*)/(.*)/aaa
,rewriteURI
配置为 /${1}/${2}
时。如果客户端发送请求的路径为 /gateway/ccc/bbb/aaa
,则 path
会匹配到 ~gateway/(.*)/(.*)/aaa
,rewriteURI
会把 ${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(/|$)(.*)
。详情请参见 创建转发规则。