摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢?

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

原理介绍:

四层转发:

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

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

七层转发:

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

具体操作:

一、负载均衡 ( LoadBalancer )

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

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

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”,说明内核模块加载成功。

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.ko”为TOA内核模块文件的路径,客户需要将其替换为自己编译的TOA内核模块路径。

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

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

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

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

二、节点访问 ( NodePort )

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

图1 服务亲和选择节点级别

三、七层负载均衡(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。

点击关注,第一时间了解华为云新鲜技术~

干货:不同场景容器内获取客户端源IP的方法的更多相关文章

  1. F5 IIS Log获取客户端源IP

    1.配置F5启用X-Forwarded-For方法: 1:Local Traffic-Profiles-Http-改"Insert XForwarded For"为Enable 2 ...

  2. Istio 中实现客户端源 IP 的保持

    作者 尹烨,腾讯专家工程师, 腾讯云 TCM 产品负责人.在 K8s.Service Mesh 等方面有多年的实践经验. 导语 对于很多后端服务业务,我们都希望得到客户端源 IP.云上的负载均衡器,比 ...

  3. 干货:Java正确获取客户端真实IP方法整理

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  4. 服务端如何获取客户端请求IP地址

    服务端获取客户端请求IP地址,常见的包括:x-forwarded-for.client-ip等请求头,以及remote_addr参数. 一.remote_addr.x-forwarded-for.cl ...

  5. 【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!

    写在前面 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中.这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者 ...

  6. Kubernets中获取客户端真实IP总结

    1. 导言 绝大多数业务场景都是需要知道客户端IP的 在k8s中运行的业务项目,如何获取到客户端真实IP? 本文总结了通行的2种方式 要答案的直接看方式一.方式二和总结 SEO 关键字 nginx i ...

  7. 获取客户端的IP地址

    /// <summary> /// 获取客户端的IP地址 /// </summary> /// <returns></returns> public s ...

  8. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

  9. java nginx等代理或网关转发请求后获取客户端的ip地址,原理

    在没有网关或者反向代理软件情况下,java里获取客户端ip地址的方法是request.getRemoteAddr() 先解释下http协议和TCP协议: 网页默认是进行http连接了,http协议即超 ...

随机推荐

  1. 03-java实现循环链表

    03java实现循环链表 本人git https://github.com/bigeyes-debug/Algorithm 一丶单向循环链表 就是为尾节点指向头结点 二丶单向循环链表的接口设计 比较单 ...

  2. 文章要保存为TXT文件,其中的图片要怎么办?Python帮你解决

    前言 用 python 爬取你喜欢的 CSDN 的原创文章,保存为TXT文件,不仅查看不方便,而且还无法保存文章中的代码和图片. 今天教你制作成 PDF 慢慢看.万一作者的突然把号给删了,也会保存备份 ...

  3. C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3714 访问. 给定一个二进制数组, 计算其中最大连续1的个数. ...

  4. 使用Tensorflow搭建自编码器(Autoencoder)

    自编码器是一种数据压缩算法,其中数据的压缩和解压缩函数是数据相关的.从样本中训练而来的.大部分自编码器中,压缩和解压缩的函数是通过神经网络实现的. 1. 使用卷积神经网络搭建自编码器 导入MNIST数 ...

  5. Virtuoso 中如何优化 Library Manager 的显示

    https://www.cnblogs.com/yeungchie/ 主要从 cds.lib 文件去入手. 假设现在想把 Virtuoso 预装的库整理到 preload 分类(库)中. 首先创建一个 ...

  6. 28个漂亮的React.js后台管理模板

    React管理模板 为您的React Web应用程序开发一个管理区域可能非常耗时.它与设计所有前端页面一样重要. 这是2020年设计出色的顶级React.js后台管理模板的列表. 这些模板确实有价值, ...

  7. python接口自动化 - 断言(上)

    我们在做接口自动化的时候会用当unittest框架,这个框架中是有assert方法 当我们写好我们的case后 总要有个验证是否正确的东西,assert就给我们提供了非常强大的结果验证 序号 断言方法 ...

  8. JavaScript学习系列博客_23_JavaScript 构造函数

    构造函数 - 构造函数是专门用来创建对象的函数 创建一个对象时,通过构造函数的方式来创建.这是通过Object()这个构造函数来创建的一个实例obj. var obj=new Object(); - ...

  9. JavaScript学习系列博客_16_JavaScript中的函数(Function)简介

    函数(Function) - 函数也是一个对象,也具有普通对象的功能 - 函数中可以封装一些代码,在需要的时候可以去调用函数来执行这些代码:当调用函数时,函数中封装的代码会按照顺序执行. - 使用ty ...

  10. 精讲响应式WebClient第4篇-文件上传与下载

    本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...