本文主要介绍外部请求通过 Ingress 访问工作负载时,工作负载后端 Pod 获取外部请求的真实 IP 地址的方法。
Flannel 网络集群
- 登录 容器服务控制台。
- 单击左侧导航栏中的 集群,找到目标集群,然后单击集群名称,进入集群管理页面。
- 配置 ingress-nginx-controller 对应服务(Service)的转发外部流量策略
Spec.externalTrafficPolicy
为Local
。说明
- ingress-nginx-controller 是安装 ingress-nginx 组件后,生成的 Ingress 控制器对应的 Service。
- Flannel 容器网络模型的集群,其后端业务 Pod 获取客户端真实 IP 时,需要将 LoadBalancer Service 的
externalTrafficPolicy
设置为Local
,用于将节点的 IPVS 只转发给本节点的 Nginx Ingress Pod。
- 在集群管理页面的左侧导航栏中,选择 服务与路由 > 服务。
- 在 kube-system 命名空间下,找到 ingress-nginx-controller,并在对应 操作 列中选择
...
> 编辑 Yaml。

- 修改
Spec.externalTrafficPolicy
的值为Local
,然后单击 确定 保存配置。

- 配置 ingress-nginx-controller 对应配置项(ConfigMap),增加获取真实客户端 IP 时必要的字段。
- 在集群管理页面的左侧导航栏中,选择 配置管理 > 配置项。
- 在 kube-system 命名空间下,找到 ingress-nginx-controller,并在对应 操作 列中选择
...
> 编辑 Yaml。

- 在配置项中的
data
代码块中增加如下三行字段,然后单击 确定,保存配置。data:
use-forwarded-headers: "true"
compute-full-forwarded-for: "true"
forwarded-for-header: X-Forwarded-For
...

- 配置完成后,在 无状态负载 列表中,找到并重启 ingress-nginx-controller,使配置生效。

VPC-CNI 网络集群
- 登录 容器服务控制台。
- 单击左侧导航栏中的 集群,找到目标集群,然后单击集群名称,进入集群管理页面。
- 配置 ingress-nginx-controller 对应配置项(ConfigMap),增加获取真实客户端 IP 时必要的字段。
- 在集群管理页面的左侧导航栏中,选择 配置管理 > 配置项。
- 在 kube-system 命名空间下,找到 ingress-nginx-controller,并在对应 操作 列中选择
...
> 编辑 Yaml。

- 在配置项中的
data
代码块中增加如下三行字段,然后单击 确定,保存配置。data:
use-forwarded-headers: "true"
compute-full-forwarded-for: "true"
forwarded-for-header: X-Forwarded-For
...

- 配置完成后,在 无状态负载 列表中,找到并重启 ingress-nginx-controller,使配置生效。

结果验证
前提条件
本文通过 Nginx 镜像模拟真实客户端,因此验证操作前,您还需要准备如下工作:
- 在集群中安装 ingress-nginx 组件。详情请参见 安装组件。
- 在镜像仓库中上传开源 nginx 镜像,用于验证操作结果时模拟后端服务。详情请参见 推送和拉取镜像。
- 准备一台可以访问公网的主机,模拟外部真实客户端。该客户端必须在 Ingress 所在集群外。
说明
您可以创建一个可以访问公网的云服务器(ECS)实例,作为执行机器。详细操作,请参见 通过向导购买实例。
步骤一:部署应用和服务
说明
Flannel 容器网络模型的集群,将 LoadBalancer Service 的 externalTrafficPolicy 设置为 Local 后,若节点上没有 Nginx Ingress Pod,则该 LoadBalancer 地址无法被访问且会被会被当作 Service 的扩展 IP 地址,被 IPVS 拦截并转发,发生网络不通的问题。相关问题的更多信息,请参见 社区文档。
因此下文使用无状态负载模拟后端服务的 Nginx Ingress Pod。
- 使用 Nginx 镜像,创建用于模拟后端服务的无状态负载。详情请参见 创建无状态负载。

- 创建 LoadBalancer 类型的服务(Service),绑定步骤 1 中创建的无状态负载。

步骤二:创建 Ingress
创建路由规则(Ingress),关联步骤 2 中创建的 LoadBalancer 类型服务。详细操作,请参见 通过控制台创建 Nginx Ingress。
注意
路由规则的所属命名空间,需要与无状态负载所在的命名空间保持一致。

步骤三:访问验证
- 登录公网主机。
- 执行如下命令,访问 Ingress 上配置的域名。其中,
14.**.**.**
为 ingress 的公网 IP 地址。curl -H "Host: example.com" http://14.**.**.**
预期返回结果如下,可以正确访问到后端服务。

- 返回到步骤一中创建的后端无状态负载(本例中为 nginx),进入工作负载的详情页面,选择 日志 页签,查看后端服务的 Pod 日志,可以看到日志的 X-Forwarded-For IP 即为真实客户端 IP。
