为ELB Ingress配置Rewrite重写
独享型ELB的Ingress支持为正则匹配的URL配置Rewrite重写的能力。规则如下:
- 为Ingress配置一个path为正则匹配的URL,如 /first/(.*)/(.*)/end
- 配置Rewrite重写的注解,匹配path中的正则表达式
例如 :
- path 配置为 /first/(.*)/(.*)/end,注解配置为 /$1/$2。当客户发送的请求为 /first/aaa/bbb/end 时,path会匹配到 /first/(.*)/(.*)/end,重写规则会把 $1 替换成 aaa,$2替换成 bbb,最终后端服务接收到的请求路径为 /aaa/bbb。
- path配置为 /first/(.*)/end,注解配置为 /newpath/$1。当客户发送的请求为 /first/aaa/end 时,path会匹配到 /first/(.*)/end,重写规则会把 $1 替换成 aaa,最终后端服务接收到的请求路径为 /newpath/aaa。
该功能依赖ELB能力,当前正陆续上线中,使用该功能前请根据当前区域的控制台选项确认是否支持。
前提条件
- 已创建一个CCE Standard或CCE Turbo集群,且集群版本满足以下要求:
- v1.23集群:v1.23.14-r0及以上
- v1.25集群:v1.25.9-r0及以上
- v1.27集群:v1.27.6-r0及以上
- v1.28集群:v1.28.4-r0及以上
- 其他更高版本的集群
- 集群中需提前部署可用的工作负载用于对外提供访问。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。
- 为提供对外访问的工作负载配置Service,ELB Ingress支持的Service类型请参见ELB Ingress支持的Service类型。
约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 该特性依赖ELB高级转发策略,开启后将不再根据域名/路径匹配确定优先级,请您根据实际需要自定义转发策略优先级。关于转发策略优先级详情请参见ELB Ingress转发策略优先级说明。
为Ingress配置Rewrite重写
您可以使用以下方式为Ingress配置Rewrite重写。
- 登录CCE控制台,单击集群名称进入集群。
- 选择左侧导航栏的“服务”,在右侧选择“路由”页签,单击右上角“创建路由”。
- 设置Ingress参数。
本示例中展示配置Rewrite重写的关键参数,其余参数可按需配置,详情请参见通过控制台创建ELB Ingress。
表1 关键参数说明 参数
配置说明
示例
名称
自定义Ingress名称。
ingress-test
负载均衡器
选择对接的ELB实例或自动创建ELB实例。本例中仅支持选择“独享型”。
独享型ELB
监听器配置
- 前端协议:可选择“HTTP”或“HTTPS”。
- 对外端口:ELB监听器的端口。
- 前端协议:“HTTP”
- 对外端口:80
转发策略配置
- 域名:实际访问的域名地址,不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
- 路径匹配规则:使用重写URL需要选择“正则匹配”。
- 路径:后端应用对外提供访问的路径,此处添加的访问路径要求后端应用内存在相同的路径,否则转发无法生效。
- 目标服务名称:请选择已有Service或新建Service。页面列表中的查询结果已自动过滤不符合要求的Service。
- 目标服务访问端口:可选择目标Service的访问端口。
- 执行动作
- 动作:选择“重写URL”,当访问请求满足转发策略时,会根据匹配规则重写URL路径。支持使用正则表达式匹配的结果作为重写路径,您需要选择路径匹配规则为“正则匹配”。
- 路径:以 "/" 开头的合理的正则匹配规则。
- 域名:example.com
- 路径匹配规则:正则匹配
- 路径:/first/(.*)/(.*)/end
- 目标服务名称:nginx
- 目标服务访问端口:80
- 执行动作:
- 动作:重写URL
- 路径:/$1/$2
图1 配置重写URL规则
- 配置完成后,单击“确定”。
Ingress重写URL规则可通过注解实现,示例如下:
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
以关联已有ELB为例,YAML配置文件如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-rewrite-url namespace: default annotations: kubernetes.io/elb.id: df76342f-e898-402a-bac8-bde5bf974da8 kubernetes.io/elb.class: performance kubernetes.io/elb.port: '80' kubernetes.io/elb.rewrite-target: /$1/$2 # 重写路径的配置 spec: rules: - host: "example.com" http: paths: - path: /first/(.*)/(.*)/end # 该path会被重写 backend: service: name: test-service port: number: 80 property: ingress.beta.kubernetes.io/url-match-mode: REGEX pathType: ImplementationSpecific ingressClassName: cce
表2 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/elb.rewrite-target
是
string
重写路径的信息。
格式说明:以 "/" 开头的合理的正则匹配规则。
参数说明:对单个Ingress下正则匹配的URL转发规则生效,配置删除后自动清理对应的重写规则。
该注解不能和灰度发布的注解一起配置。
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/test-rewrite-url created
- 查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功。
NAME CLASS HOSTS ADDRESS PORTS AGE test-rewrite-url cce * 121.**.**.** 80 10s
- 使用curl测试重写的能力,其中${ELB_IP}为Ingress访问的IP。
# curl -H "Host:example.com" ${ELB_IP}/first/aaa/bbb/end
最终访问路径会被重写为 /aaa/bbb。