热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s集群网络service之ipvsclusterip实现原理

在之前文章中我们介绍了基于iptable方式实现的k8s集群中clusterip类型和nodeport类型service的负载均衡。其本质上是当网络数据包从pod的networkn

在之前文章中我们介绍了基于iptable方式实现的k8s集群中cluster ip类型node port类型service负载均衡。其本质上是当网络数据包从podnetwork namespace中通过linux veth pair设备进入到host宿主中的network namespace时,经过iptable一系列的NAT转换,把servicecluster ip和端口DNATpodip和端口。同时leverage linux iptablerandom模块,实现了对pod的负载均衡,然后再交由host对目标pod的路由策略来实现将数据包发往pod。当然,这一切都是在linux内核空间实现的,和应用程序的用户空间没有关系。在这里我们主要介绍基于ipvscluster ip类型service的实现原理。如果对于ipvs不熟悉的同学可以浏览一下网站http://www.linuxvirtualserver.org/,大名鼎鼎的LVS负载均衡就是基于ipvs来实现的。

要实现基于ipvsk8s网络负载均衡需要如下:

  • Linux内核高于2.4.x,参考如下: https://en.wikipedia.org/wiki/IP_Virtual_Server

  • 在kube-proxy网络组件的启动参数中加入--proxy-mode=ipvs,在以前文章中有所介绍
  • 安装ipvsadm工具,本质是ipvsadm是用户空间的程序,用来操作和管理ipvs

安装ipvsadm工具:

yum install ipvsadm

whereis ipvsadm

我们这里是介绍cluster ip类型的service,所以我们基于以前文章里安装的应用,显示k8s集群中的cluster ip

kubectl get service --all-namespaces

根据以前文章,数据包会从podnetwork namespace通过linux veth pair设备进入hostnetwork namespacehost开启了路由转发功能,数据先进入到了iptablePREROUTING chain中,我们查看这个chain

iptables -nL -t nat

据这个chain,数据包会进入到KUBE-SERVICES这个targe中。

查看KUBE-SERVICES这个target

iptables -nL -t nat

根据KUBE-SERVICES target,数据包匹配ipset KUBE-CLUSTER-IPipsetlinux的内核数据结构,可以存储一些ip和端口的信息,ipvs模式的集群通过在iptable中匹配ipset,这样减少了iptable中的entry数量。在这里匹配了这个ipset之后进入了KUBE-MARK-MASQ这个target

查看KUBE-CLUSTER-IP这个ipset

ipset list KUBE-CLUSTER-IP

这里我们看到KUBE-CLUSTER-IP这个ipset里一共有9entry,而且也匹配了集群中cluster ip类型serviceip和端口。

根据KUBE-SERVICES target,匹配KUBE-CLUSTER-IP这个ipsetitems(也就是cluster ip类型的service)会进入到KUBE-MARK-MASQ这个target中,我们查看这个target

我们观察这个target是对所有的items做了mark标记。

经过了PREROUTING chain以及相关的target之后数据会来到INPUT chain,这是因为对于ipvs模式,会在hostnetwork namespace里创建kube-ipvs0网络设备,并且绑定了所有的cluster ip,这样数据就可以进入到INPUT chain

ip addr|grep kube

对于k8s集群的ipvs负载均衡来说,其核心工作就是在INPUT chain,采用NAT模式(http://www.linuxvirtualserver.org/VS-NAT.html,当然ipvs不仅仅只有NAT模式,还有更多模式,详细的资料可以到LVS项目的官方网站参考www.linuxvirtualserver.org/Documents.html)linux操作系统网络内核会对目标ip来做转DNAT换。这里我们以service service-nginx-app做为例子,它的cluster ip10.254.226.173,我们查看ipvs如何做DNAT

kubectl describe service service-nginx-app --namespace default

ipvsadm -L

我们看到service service-nginx-app cluster ip10.254.226.173:80,对应两个endpoint10.1.86.6:8010.1.86.7:80。然后通过ipvsadm工具查看确实是ipvs将其映射成两个endpoints,并且使用round robin的分配方式,分配权重为11,也就是均匀的实现负载均衡。

ipvsINPUT chain完成上述DNAT操作,然后将数据送入POSTROUTING chain,我们查看这个chain

iptables -nL -t nat

这里我们发现数据在POSTROUTING chain会进入KUBE-POSTROUTING这个target中。

查看KUBE-POSTROUTING target

iptables -nL -t nat

这里我们发现是对数据包做了MASQUERADE伪装,并且匹配的就是在KUBE-MARK-MASQ target中做的标记,也就是用下一跳路由所使用网路设备的ip做了SNAT操作。所以到这里我们的数据包源ip为下一跳路由所使用网路设备的ip,目标ip10.1.86.6或者10.1.86.7(RR 1:1的负载均衡方式),然后根据host network namespace的路由表做下一跳路由选择。

总结对于ipvs下的cluster ip的通讯方式为:

  • 数据包从pod network namespace发出,进入host的network namespace,源ip为pod ip,源端口为随机端口,目标ip为cluster ip,目标port为指定port。
  • 数据包在host network namespace中进入PREROUTING chain。
  • 在PREROUTING chain中经过匹配ipset KUBE-CLUSTER-IP做mask标记操作。
  • 在host network namespace中创建网络设备kube-ipvs0,并且绑定所有cluster ip,这样从pod发出的数据包目标ip为cluster ip,有kube-ipvs0网络设备对应,数据进入INPUT chain中。
  • 数据在INPUT chain中被ipvs的内核规则修改(可由ipvsadm查看规则),完成DNAT,然后将数据直接送入POSTROUTING chain。这时源ip为pod ip,源端口为随机端口,目标ip为映射选择的pod ip,目标port为映射选择的port。
  • 数据在POSTROUTING chain中,经过KUBE-POSTROUTING target完成MASQUERADE SNAT。这时源ip为下一跳路由所使用网路设备的ip,源端口为随机端口,目标ip为映射选择的pod ip,目标port为映射选择的port。
  • 数据包根据host network namespace的路由表做下一跳路由选择。

 


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
author-avatar
mobiledu2502876467
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有