全部产品
Search
文档中心

如何获取 ECS 实例的真实IP?

更新时间: 2019-10-22

问题描述

在 EDAS 中创建的应用绑定 SLB ( EDAS 应用基本信息 -> 应用设置页面里面的负载均衡-外网、负载均衡-内网这两种在获取客户端 IP 这个问题上可相同对待)后,客户端通过 SLB 访问时,如何在后端 Java 代码中获取到客户端的真实 IP 哪 ?

解决办法

  • 对于部署到 ECS 集群、Swarm 集群的应用

    可直接在后端 Java 代码中使用下面的方式获取即可。

    1. String client_ip = request.getHeader("x-forwarded-for");

    另外,还可以通过获取 Http Header 中的 x-real-ip、wl-proxy-client-ip 参数来得到客户端的真实 IP 。

  • 对于部署到在 EDAS Console 页面直接创建的 Kubernetes 集群(托管 master 节点版)

    部署到该种类型的 Kubernetes 集群中的应用,由于未开放对该集群的管控功能,所以暂无法获取到客户端的真实 IP 。

    而且该种类型的集群已经被 “容器服务 - Kubernetes” 中的 “Kubernetes 托管版” 替代并处于限制使用期,新用户在 EDAS Console 中已经无法直接创建该种类型的 Kubernetes 集群,所以,建议使用 “容器服务 - Kubernetes” 中的 “Kubernetes 托管版” 集群,在 “容器服务 - Kubernetes” Console中创建 “Kubernetes 托管版” 集群后,然后在 EDAS Console 的 “资源管理” -> “集群” -> “容器服务 K8S 集群” 导入新创建的 “Kubernetes 托管版”集群,接着参考下面的内容即可获取到客户端 IP 。

  • 对于部署到在容器服务 - Kubernetes Console 中创建,导入到 EDAS 集群中的 Kubernetes(完整节点)集群和 Kubernetes 托管版(托管 master 节点)集群

    这两种类型的 Kubernetes 集群在获取客户端真实 IP 之前(假设你已经通过 EDAS Console 向该 Kubernetes 集群部署了应用),首先需要在容器服务 - Kubernetes Console 的集群列表中找到你创建的 Kubernetes 集群,并点击该集群对应的 “控制台” 进入该集群的控制台页面。 Kubernetes集群控制台入口 在该集群的控制台页面,点击“服务发现与负载均衡” -> “服务”,然后在服务列表中找到通过 EDAS Console 部署的应用并点击进入该应用服务的详细信息页面。 Kubernetes集群服务页面 在应用服务的详细信息页面点击右上角的“编辑”按钮,即会弹出修改该服务的窗口,然后找到 externalTrafficPolicy 配置参数,将该参数值由默认的 Cluster 改为 Local ,然后点击该窗口右下角的“更新”按钮,即会动态更新该服务的配置,动态生效。 Kubernetes集群服务编辑页面 接下来,在后端 Java 代码中可通过下面的方式获取到客户端的真实 IP :

    1. String client_ip = request.getRemoteAddr();

    结合上面 ECS 集群和 Docker Swarm 集群部署的应用获取客户端 IP 的方法,可通过三元运算符将这两种方式变为一行代码:

    1. String client_ip = request.getHeader("x-forwarded-for") == null ? request.getRemoteAddr() : request.getHeader("x-forwarded-for");

    即可适配 EDAS 中不同的集群类型。

    另外,该参数的修改还可以通过 kubectl 命令的方式(前提是已经参见 Kubernetes 集群基本信息页面的“通过 kubectl 连接 Kubernetes 集群”部分配置好了KubeConfig):

    1. kubectl patch svc <service_name> -p '{"spec":{"externalTrafficPolicy":"Local"}}'