kubenetes--kube-proxy实现负载均衡

一、Linux网络收包

要了解kube-proxy如何实现负载均衡,要先了解Linux网络收包机制,kube-proxy利用Linux的内核实现的负载均衡。

在TCP/IP网络分层模型里,整个协议栈被分成了物理层、链路层、网络层,传输层和应用层。物理层对应的是网卡和网线,应用层对应的是我们常见的Nginx,FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。内核对更上层的应用层提供socket接口来供用户进程访问。我们用Linux的视角来看到的TCP/IP网络分层模型是下面这个样子的。
在这里插入图片描述

从硬件的视角看:

在这里插入图片描述
当网卡上收到数据以后,首先会以DMA的方式把网卡上收到的帧写到内存里。再向CPU发起一个中断,以通知CPU有数据到达。当CPU收到中断请求后,会去调用网络驱动注册的中断处理函数。 网卡的中断处理函数并不做过多工作,发出软中断请求,然后尽快释放CPU。ksoftirqd检测到有软中断请求到达,调用poll开始轮询收包,收到后交由各级协议栈处理。最后数据包会被放到用户socket的接收队列中。

二、Netfilter 框架

Netfilter 是 Linux 内核数据包处理框架。该框架在Linux处理数据包的关键流程中定义了一系列Hook钩子点(如PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING),并在这些钩子点中注册一系列函数对数据包进行处理。换句话说,这些函数的处理结果决定了这些网络数据包的“命运”。
在这里插入图片描述

  1. PREROUTING:数据包进入路由表之前。
  2. INPUT:通过路由表后目的地为本机。
  3. FORWARD:通过路由表后,目的地不为本机。
  4. OUTPUT:由本机产生,向外发送。
  5. POSTROUTIONG:发送到网卡接口之前。

Netfilter在网络层上拦截和处理来自网络的数据包,根据配置的规则进行过滤和操作,然后将数据包交由上层协议栈进行进一步的处理和传递。

三、Iptables

Netfilter是Linux内核中的一个框架,而iptables是一个用户空间的工具,用于配置和操作Netfilter的规则。iptables利用Netfilter的hook函数,根据配置的规则来处理网络数据包。通过这种方式,Netfilter和iptables共同协作实现了Linux中的网络过滤和操作功能。
在这里插入图片描述

四、kube-proxy工作原理

在这里插入图片描述
kube-proxy利用iptables命令生成一些规则,来达到dnat的作用。

4.1 iptables示例

在这里插入图片描述
在这里插入图片描述

定义了一个service和分别对应三个pod,并通过命令查看本机iptable配置规则:

iptables-save -t nat

在这里插入图片描述
配置的意思是:
有一条KUBE-SERVICES的规则,如果数据包的目标ip是10.105.164.239,那么转到KUBE-SVC-WWRFY3PZ7W3FGMQW规则。
KUBE-SVC-WWRFY3PZ7W3FGMQW以33%的概率转到192.168.166.164:80,以50%概率转到192.168.166.165:80,如果概率都没有命中,最后以100%的概率转到192.168.166.167:80.iptable规则是自上而下执行的。
那么KUBE-SERVICES规则又是加在哪里的呢
在这里插入图片描述
可以看到配到了PREROUTING和OUTPUT这两个hook点。也就是说所有进入和发出主机的数据包都要经过这个规则。
还有一个需要注意的是,service ip 10.105.164.239是一个虚ip,主机上并没有一个设备去响应,是ping不通的
但是,iptable有很明显的问题,一个是负载均衡的策略需要用很多的规则去堆叠起来,还有一个是按照概率去命中执行注定转发的效率不会很高,如果集群比较大,pod数量较多,这种问题就更明显了。

4.2 IPVS

在这里插入图片描述
需要注意的是,Netfilter的IPVS模式没有PREROUTING这个hook点,只有LOCAL_IN、LOCAL_OUT和FORWARD这三个hook点。
也就是说经过路由判决的时候,数据包的目的ip还是service ip,不像iptable那样,在经过PREROUTING的时候就把数据包的目标ip换成了pod的ip,所以service ip必须挂在主机的某个设备上,否则经过路由判决的时候会被认为是一个无效的地址。
在这里插入图片描述
kube-proxy会在主机上创建一个类似kube-ipvs0这样的设备,所有的service ip都绑在这个设备上,这个ip是能ping通的,这也是ipvs模式和iptable模式的一个区别。

查看IPVS转发规则:
在这里插入图片描述
IPVS转发规则比较清晰简洁。所以,一般建议能使用IPVS尽量使用IPVS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/196470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP Multi-Room Music 方案:支持音频实时同步播放 实现音乐互联共享

项目背景 随着无线通信技术的发展,针对不同音频应用领域的无线音频产品正不断涌现。近日,乐鑫科技推出了基于 Wi-Fi 的多扬声器互联共享音乐通信协议——ESP Multi-Room Music 方案。该方案使用乐鑫自研的基于 Wi-Fi 局域网的音频同步播放技术&#xff…

基于SSM框架的合同服务管理系统设计与实现

基于SSM框架的合同服务管理系统的设计与实现 摘要:当今社会,各行各业都离不开计算机软件的推广,销售,运营各方面,有些中小型企业没有技术与能力开发和维护一款软件来运营,这时催生很多软件外包公司的产生。…

【Electron】上下键切换消息

需求: 如图,需要监听上下键切换消息 Electron 注册 全局快捷键【globalShortcut】监听 在focus注册 在blur 注销 如苹果系统在使用某个软件(focus)时 右上角会有应用标题 Electron 代码: win.on(focus, ()>{globalShortcut.register(U…

建筑木模板厂家批发

在建筑施工中,木模板是一种常见且重要的施工材料,用于搭建混凝土浇筑的支撑结构。选择合适的建筑木模板厂家进行批发,对于施工质量和效率至关重要。本文将介绍建筑木模板厂家批发的重要性,并推荐贵港市能强优品木业作为专业的建筑…

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解主打基础

专栏:数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】,我们接着复习 树和二叉树,这篇文章我写的非常详细且通俗易懂,看完保证会带给你不一样的收获。如果对你有帮助,看在我这么辛苦整理…

阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?

10月23 日14:00左右,蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障,在线文档和官网都无法打开。直到当天晚上22:24,语雀服务才全部恢复正常。从故障发生到完全恢复正常,语雀整个宕机时间将近 8 小时,如此长…

深度学习毕设项目 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求&am…

PS最新磨皮软件Portraiture4.1.2

Portraiture是一款好用的PS磨皮滤镜插件,拥有磨皮美白的功能,操作也很简单,一键点击即可实现美白效果,软件还保留了人物的皮肤质感让照片看起来更加真实。portraiture体积小巧,不会占用过多的电脑内存哦。 内置了多种…

交流负载测试使用场景

交流负载测试是一种在特定环境下,对电力设备、汽车电子部件,工业自动化设备、网络设备、家电产品,航空航天设备以及医疗器械等产品进行测试的方法,该测试的目的是评估这些设备在实际运行条件下的性能和可靠性。 1电力设备测试 交…

基于SSM实现的叮当书城

一、系统架构 前端:jsp | jquery | layui 后端:spring | springmvc | mybatis 环境:jdk1.7以上 | mysql | maven 二、代码与数据库 三、功能介绍 01. 系统首页 02. 商品分类 03. 热销 04. 新品 05. 注册 06. 登录 07. 购物车 08. 后台-首页 …

HTTP协议,Web框架回顾

HTTP 请求协议详情 -请求首行---》请求方式,请求地址,请求协议版本 -请求头---》key:value形式 -referer:上一次访问的地址 -user-agenet:客户端类型 -name:lqz -cookie&…

c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

c语言&#xff0c;输入整数n(行数&#xff0c;本例为4&#xff09;&#xff0c;按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 以下是使用C语言编写的程序&#xff0c;根据输入的行数打印数字图片的规则&#xff1a; #include <stdio.h>int main() …

lack——主页前后端开发优化(精华:java多线程实现数据插入)

lack——主页前后端开发优化 前端开发主页 最容易的方式&#xff1a;list列表<template><van-cardv-for"user in props.userList":desc"user.profile":title"${user.username} (${user.planetCode})":thumb"user.avatarUrl"…

静态方法和属性的经典使用-单例设计模式

单例设计模式 一、设计模式二、单例模式1、饿汉式2、懒汉式3、区别 单例设计模式是静态方法和属性的经典使用。 一、设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱&#xff0c;不同的棋局&…

基于隐马尔可夫模型的一种流水印

文章信息 论文题目&#xff1a;An Invisible Flow Watermarking for Traffic Tracking: A Hidden Markov Model Approach 期刊&#xff08;会议&#xff09;&#xff1a;ICC 2019 - 2019 IEEE International Conference on Communications (ICC) 时间&#xff1a;2019 级别&am…

linux调用github代码文件

一&#xff0c;建库 默认建好库 默认linux已安装好git 二&#xff0c;生成SSH公钥 1&#xff0c;选这 2进教程&#xff0c;看怎么生成公钥的 根据下图教程&#xff0c;得到key&#xff0c;添加到github中&#xff01;具体教程&#xff0c;进github看 三。调用 gitssh链…

深度学习实战61-基于知识图谱与BiLSTM网络实现疾病相关智能问答系统,并支持数据扩展

大家好,我是微学AI,今天给大家介绍一下深度学习实战61-深度学习在医疗领域的应用:疾病相关智能问答系统,并支持数据扩展。本文将详细介绍如何使用Py2neo这个Python库来构建一个医疗领域知识图谱,并将数据导入Neo4j图数据库。我们将提供一些医疗领域的数据样例,并展示如何…

解决electron-build打包后运行app报错:cannot find module xxx

现象&#xff1a; 关于这个问题查了很多资料&#xff0c;也问了chatgpt都没有找到答案。 最后只能靠自己了。 于是冷静下来回想一下细节。突然发现了一个特别点。 eletron-builder打包时&#xff0c;强制要求eletron-builder和eletron必须都放在devDependencies 否则&#…

Spring的创建

文章目录 前言 一、创建一个Maven项目 二、添加spring框架支持 2.1在项目的pom.xml添加spring框架支持&#xff0c;xml配置如下  2.2添加包 总结 前言 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&a…

Win10电脑用U盘重装系统的步骤

在Win10电脑中&#xff0c;用户遇到了无法解决的系统问题&#xff0c;用户这时候就可以考虑重装Win10系统&#xff0c;这样即可轻松解决问题&#xff0c;从而满足自己的操作需求。接下来小编给大家详细介绍关于Win10电脑中用U盘重装系统的教程步骤。 准备工作 1. 一台正常联网可…