
# 网关访问保留源IP
![](https://support.huaweicloud.com/bestpractice-asm/public_sys-resources/caution_3.0-zh-cn.png)
设置成节点亲和在某些场景下可能导致无法访问ELB，具体情况请查看 [集群内部无法使用ELB地址访问负载](https://support.huaweicloud.com/cce_faq/cce_faq_00390.html)。
#### 操作场景
服务通过网关访问时，默认情况下，目标容器中看到的不是客户端的源IP，如果需要保留源IP，请参考本节指导操作。
#### 配置方法
请在CCE控制台"服务发现"页面，istio-system命名空间下，更新服务所关联的网关服务，将服务亲和改成"节点级别"。前提是已开启ELB的获取客户端IP功能（当前为默认开启）。
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933302794.png)
externalTrafficPolicy：表示此Service是否希望将外部流量路由到节点本地或集群范围的端点。有两个可用选项：Cluster（默认）和Local。Cluster隐藏了客户端IP，可能导致第二跳到另一个节点，但具有良好的整体负载分布。Local保留客户端源IP并避免LoadBalancer和NodePort类型服务的第二跳，但存在潜在的不均衡流量传播风险。
#### 验证方式
结合httpbin镜像在"x-forward-for"字段中可以看到源IP，httpbin是一个HTTP Request \& Response Service，可以向他发送请求，他将会按照指定的规则将请求返回。httpbin镜像可在SWR中搜索。使用httpbin镜像进行验证时请确保集群已开通网格。
1. 登录ASM应用服务网格控制台，选择一个可用的测试网格并单击进入。
2. 选择左侧"网格配置"查看其关联的集群。 
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933304982.png)
   
3. 单击集群名称进入集群详情页，单击"工作负载-无状态工作负载"，单击右上角"创建工作负载"按钮。
4. 配置工作负载的信息。 **基本信息**
   - 负载类型：选择无状态工作负载Deployment。
   
   - 负载名称：命名工作负载为httpbin。
   
   - 命名空间：选择工作负载的命名空间，默认为default。
   
   - 其余参数使用默认值。
   
   
   
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933312634.png)
   **容器配置**
   - 基本信息：
     - 容器名称：为容器自定义一个名称
     
     
     
     - 镜像名称：单击后方"选择镜像"，在右上角搜索框搜索"httpbin"镜像并选择，单击"确认"。
     
     - 镜像版本：选择一个镜像版本
     
     - 其余参数使用默认值。
     
     
     
     ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001960393769.png)
     
   
   
   **服务配置**
   服务（Service）是用来解决Pod访问问题的。每个Service有一个固定IP地址，Service将访问流量转发给Pod，而且Service可以给这些Pod做负载均衡。
   单击服务配置参数下面的"+"进入创建服务页面。
   - Service名称：Service名称为工作负载名称。
   
   - 访问类型：选择集群内访问。
   
   - 端口设置：
     - 协议：TCP
     
     - 容器端口：80（以实际访问端口为准）
     
     - 服务端口：80（以实际访问端口为准） 
       ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933320654.png)
       
       
      
     
5. 单击右下角"确定"完成服务创建。
6. 单击右下角"创建工作负载"完成工作负载创建。
7. 在集群详情页选择左侧"服务"页签，可在服务列表中查看到所创建的httpbin服务。 
   
   
8. 返回ASM应用服务网格，选择左侧"服务管理"页签，在服务管理中可查看到httpbin的配置诊断显示为异常。 
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001960434229.png)
   
   
9. 单击此服务配置诊断中的"处理"按钮，按照弹出"配置诊断"页面对应的修复指导进行修复。 
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933199636.png)
   以"Service的端口名称是否符合Istio规范"为例，选择协议为"http"，单击"一键修复"。
   
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933201056.png)
   
10. 选择左侧"网关管理"页签，单击右上角"添加网关"，在弹出"添加网关"页面输入配置信息。
    **配置信息**
    - 网关名称：httpbin。
    
    - 集群选择：网格所关联使用的集群。
    
    - 负载均衡：选择公网、选择一个elb公网。
    
    - 对外协议：选择HTTP。
    
    - 对外端口：自定义端口。
    
    - 外部访问地址：负载均衡中所选elb公网地址。
     
    
    ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933362556.png)
    - 单击"路由配置"下方的"+"在弹出"添加路由"页面添加路由。
      - URL：选择完全匹配并输入映射。
      
      - 命名空间：服务所在命名空间。
      
      - 目标服务：默认设置。
       
    
    
    
    ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933657676.png)
    配置完成后单击"确定"。
    
11. 单击"确定"完成网关添加。
12. 选择左侧"服务管理"页签，可以在"访问地址"查看到所创建路由的外部访问地址。 
    ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001933524416.png)
    
    
13. 在映射的外部访问地址后加上"?show_env=1"，访问添加字段后的外部访问地址，例如：http://xxx.xxx.xxx:80/get?show_env=1。可以在"x-forward-for"字段中查看网关获取的IP为容器段IP。
    ```
    ...
    ...
    ...
    x-forward-for: xxxx
    ```
    
14. 返回集群详情页，选择左侧导航栏"服务发现"，更改服务所关联的网关服务的配置。方法如下： 下拉上方"命名空间"列表选择"istio-system"。
    
    展开服务后方"更多"选项，单击"更新"，在弹出"更新服务"页面将"服务亲和"更改为"节点级别"，勾选"我已阅读《负载均衡使用须知》"，单击"确定"。
    
    ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001960895921.png)
    
15. 返回[13]中访问的外部地址并刷新，若设置之后"x-forward-for"字段中显示的网关获取IP的结果为本机源IP，则完成验证。
    ```
    ...
    ...
    ...
    x-forward-for: xxxx
    ```
    
 
