
# 为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。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
该功能依赖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）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)、[创建有状态负载（StatefulSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0048.html)或[创建守护进程集（DaemonSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0216.html)部署工作负载。
- 为提供对外访问的工作负载配置Service，ELB Ingress支持的Service类型请参见[ELB Ingress支持的Service类型](https://support.huaweicloud.com/usermanual-cce/cce_10_0094.html#cce_10_0094__section3565202819276)。
 
#### 约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 该特性依赖ELB高级转发策略，开启后将不再根据域名/路径匹配确定优先级，请您根据实际需要[自定义转发策略优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_0939.html)。关于转发策略优先级详情请参见[ELB Ingress转发策略优先级说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。
 
#### 为Ingress配置Rewrite重写
您可以使用以下方式为Ingress配置Rewrite重写。
- [通过控制台配置]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 选择左侧导航栏的"服务"，在右侧选择"路由"页签，单击右上角"创建路由"。
  
  3. 设置Ingress参数。 
     ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
     本示例中展示配置Rewrite重写的关键参数，其余参数可按需配置，详情请参见[通过控制台创建ELB Ingress](https://support.huaweicloud.com/usermanual-cce/cce_10_0251.html)。
     表1关键参数说明 
     | 参数     | 配置说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     |:---|:---|:---|
     | 名称     | 自定义Ingress名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | ingress-test                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
     | 负载均衡器  | 选择对接的ELB实例或自动创建ELB实例。本例中仅支持选择"独享型"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 独享型ELB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
     | 监听器配置  | - 前端协议：可选择"HTTP"或"HTTPS"。  - 对外端口：ELB监听器的端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | - 前端协议："HTTP"  - 对外端口：80                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     | 转发策略配置 | - 域名：实际访问的域名地址，不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案，一旦配置了域名规则后，必须使用域名访问。  - 路径匹配规则：使用重写URL需要选择"正则匹配"。  - 路径：后端应用对外提供访问的路径，此处添加的访问路径要求后端应用内存在相同的路径，否则转发无法生效。  - 目标服务名称：请选择已有Service，页面列表中的查询结果已自动过滤不符合要求的Service。如果没有满足要求的Service请根据[Ingress支持的Service类型](https://support.huaweicloud.com/usermanual-cce/cce_10_0094.html#cce_10_0094__section1674954315446)新建。  - 目标服务访问端口：可选择目标Service的访问端口。    - 执行动作 - 动作：选择"重写URL"，当访问请求满足转发策略时，会根据匹配规则重写URL路径。支持使用正则表达式匹配的结果作为重写路径，您需要选择路径匹配规则为"正则匹配"。  - 路径：以 "/" 开头的合理的正则匹配规则。     | - 域名：example.com  - 路径匹配规则：正则匹配  - 路径：/first/(.\*)/(.\*)/end  - 目标服务名称：nginx  - 目标服务访问端口：80  - 执行动作： - 动作：重写URL  - 路径：/$1/$2     |
        
     图1配置重写URL规则   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001970096538.png "点击放大")
     
     
  
  4. 配置完成后，单击"创建"。
   
- [通过kubectl命令行配置]
  Ingress重写URL规则可通过注解实现，示例如下：
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 创建名为"**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转发规则生效，配置删除后自动清理对应的重写规则。 该注解不能和灰度发布的注解一起配置。 |
        
     
     
  
  3. 创建Ingress。 
     ```
     kubectl create -f ingress-test.yaml
     ```
     回显类似如下，表示Ingress服务已创建。
     ```
     ingress.networking.k8s.io/ingress-test created
     ```
     
     
  
  4. 查看已创建的Ingress。 
     ```
     kubectl get ingress
     ```
     回显如下，表示Ingress服务创建成功。
     ```
     NAME              CLASS    HOSTS     ADDRESS          PORTS   AGE
     test-rewrite-url  cce      *         121.**.**.**     80      10s
     ```
     
     
  
  5. 使用curl测试重写的能力，其中${ELB_IP}为Ingress访问的IP。 
     ```
     # curl -H "Host:example.com" ${ELB_IP}/first/aaa/bbb/end
     ```
     最终访问路径会被重写为 /aaa/bbb。
     
     
   
