热门标签 | 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的路由表做下一跳路由选择。

 


推荐阅读
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • `chkconfig` 命令主要用于管理和查询系统服务在不同运行级别中的启动状态。该命令不仅能够更新服务的启动配置,还能检查特定服务的当前状态。通过 `chkconfig`,管理员可以轻松地控制服务在系统启动时的行为,确保关键服务正常运行,同时禁用不必要的服务以提高系统性能和安全性。本文将详细介绍 `chkconfig` 的各项参数及其使用方法,帮助读者更好地理解和应用这一强大的系统管理工具。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • Linux 文件对比与补丁操作详解
    本文详细介绍了在Linux系统中进行文件对比和补丁操作的方法,包括生成补丁、打补丁以及撤销补丁的具体步骤。重点强调了打补丁时的注意事项,以确保操作的准确性和安全性。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 本文介绍了如何在 macOS 上安装 HL-340 USB 转串口驱动,并提供了详细的步骤和注意事项。包括下载驱动、关闭系统完整性保护、安装驱动以及验证安装的方法。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
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社区 版权所有