不同场景容器内获取客户端源IP的方法

举报
云技术搬运工 发表于 2020/09/24 11:42:19 2020/09/24
【摘要】 k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢?下面我们就几种场景类型如何能获取到源ip进行讨论。

 

k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢?下面我们就几种场景类型如何能获取到源ip进行讨论。

 

原理介绍:

1.png


四层转发:

Nodeport:nodeport访问方式,是将容器端口映射到节点端口,如果“服务亲和”选择“集群级别”需要经过一次服务转发,无法实现获取客户端源ip,而“节点模式”不经过转发,可以获取客户端源ip。

 

ELB:ELB访问方式,是通过华为云ELB产品来实现负载均衡,“服务亲和”也是需要选择“节点级别”,其中“共享型”ELB需要在节点安装TOA插件,而“独享型”ELB默认透传源ip,不需要安装TOA插件。

 

七层转发:

Ingress:应用在七层访问时,客户端源ip默认保存在HTTP头部的“X-Forwarded-For”字段,无需做其他操作。

 

具体操作:

一、负载均衡 ( LoadBalancer )

负载均衡( LoadBalancer )Service模式下,支持容器中获取源IP需要满足以下前提条件:

1. 服务亲和选择节点级别而不是集群级别

2.png


2. pod所在的节点安装TOA插件。(“独享型”ELB无需进行以下操作)

安装TOA插件步骤如下:

1) 准备编译环境:

执行如下命令,安装gcc编译器。

]# yum install gcc

执行如下命令,安装make工具。

]# yum install make


2)编译内核模块

a) 下载TOA内核模块源代码。

]# wget https://github.com/Huawei/TCP_option_address/archive/master.zip b)     执行如下命令,进入源码目录,编译模块。

]# unzip master.zip

]# cd TCP_option_address-master/src/

]# make

编译过程未提示warning或者error,说明编译成功,检查当前目录下是否已经生成toa.ko文件。

说明:如果报错提示“config_retpoline=y but not supported by the compiler Compiler update recommended”,表明gcc版本过老,建议将gcc升级为较新版本。


3)加载内核模块

执行如下命令,加载内核模块。

]# insmod toa.ko

执行如下命令,验证模块加载情况,查看内核输出信息。

]# dmesg | grep TOA

若提示信息包含“TOA: toa loaded”,说明内核模块加载成功。

3.png


4)     自动加载内核模块

为了使TOA内核模块在系统启动时生效,可以将加载TOA内核模块的命令加到客户的启动脚本中。

“/etc/sysconfig/modules/”目录下新建toa.modules文件。该文件包含了TOA内核模块的加载脚本,请参考如下示例:

#!/bin/sh

/sbin/modinfo -F filename /root/toa/toa.ko > /dev/null 2>&1

if [ $? -eq 0 ]; then

/sbin/insmod /root/TCP_option_address-master/src/toa.ko

fi

注意:其中/root/TCP_option_address-master/src/toa.koTOA内核模块文件的路径,客户需要将其替换为自己编译的TOA内核模块路径。

执行以下命令,为toa.modules启动脚本添加可执行权限。

]# chmod +x /etc/sysconfig/modules/toa.modules

这种情况下可以从四层负载均衡上获取到客户端的源IP(可以通过netstat查看)。

测试要点:这种情况下可以使用netstat看到客户端连接到PODIP地址。

 

二、节点访问 ( NodePort )

节点访问(NodePort)类型的Service的服务亲和选择节点级别而不是集群级别,即Service spec.externalTrafficPolicy 需要设置为 Local

服务亲和选择节点级别
4.png


三、七层负载均衡(Ingress

七层负载均衡的模式下,不能在四层负载均衡上获取客户端IP(不能通过netstat查看客户端IP),需要对应用服务器进行配置,然后通过七层负载均衡的http头中的x-forward-for获取。

真实的来访者IP会被负载均衡放在HTTP头部的X-Forwarded-For字段,格式如下:

X-Forwarded-For: 来访者真实IP, 代理服务器1-IP,  代理服务器2-IP, ...

测试要点:从容器中获取http请求头”x-forward-for”,获取的IP为客户端的IP



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。