k8s和ipvs、lvs、ipvsadm,iptables,底层梳理,具体是如何实现的

计算节点的功能:

提供容器运行的环境

kube-proxy的主要功能:

术业有专攻,

kube-proxy的主要功能可以概括为4个字

网络规则

那么kube-proxy自己其实是个daemonset控制器跑的

每个节点上都有个的pod

它负责网络规则

其实呢

它还是个小领导

它不直接去搞网络规则

而是告诉别人,网络规则要怎么搞

你来搞

告诉谁?

1.14版本之前是iptables

1.14版本之后是ipvs

iptables是个命令行工具,装系统的时候一般默认就有

如果没有就装一个软件包就可以,ubuntu和centos系列的包名都是iptables

centos默认用了firewalld,如果管理员更习惯用iptables,可以暂时把firewalld先停掉

因为firewalld也是为了用户配置更简单吧,给了用户更友好的交互方式,然后用户的

配置指令,firewalld也是翻译给iptables, iptables再找内核模块netfilter去在内核层面执行

可以这么说,一般把iptables称为防火墙,是因为iptables调用

netfilter模块来进行流量过滤,利用netfilter内核模块的五个钩子点

也称为iptables的五条链

其实称为五个钩子点 ,可能更好理解一点

因为区别是,到底是链还是点?

prerouting

postrouting

input

output

forward

也就是数据到内核这了

内核有五个管理处来管理数据包

prerouting,数据包进入路由表之前,要怎么处理

postrouting,数据包离开路由表,往外发的时候,要怎么处理

                    (这里说一下,常用的snat源地址网络地址转换,内网机器上外网就是在这个点做改变,把数据包的源ip,本来是内网ip,出站的时候改成公网ip,就可以访问公网服务了,这个操作,的点,就是在内核模块netfilter的postrouting这个点上来执行的,具体操作方式是netfilter内核模块的提供的命令行工具iptables,然后在命令行设置规则,netfilter在内核层面就是运用这些规则)

input,数据包到达本地,这个管理处看怎么处理

output  出站

forward  数据包转发给其他主机

总结的是,iptables调用netfilter模块,可以实现流量更精细的控制,等于说,功能多。

而一般情况是功能多,其中单个功能的性能就一般。

相对来说

ipvs的方式,专注于负载均衡

核心是一个lvs虚拟服务器

所谓lvs,就是linux virtual service

linux虚拟服务器

这个虚拟服务器

跟传统的服务有点不一样

传统的服务大多是在应用层提供服务的

比如常见的web服务,比如nginx、apache、tomcat

openjdk跑个java运行环境

jenkins服务

maven

ide

等开发工具

更直观来讲

我们在图形界面

比如windows操作系统

安装的绝大多数软件都是工作在应用层的

开发人员写代码,也是在应用层IDE上写

写好了去调用编译器解释器去翻译给机器看

事实是,编译的结果是二进制文件

那么既然是文件,且能够在目录中查询到

基本上也都是应用层的服务交互的结果。

------------------------------------------------------------------------

说回ipvs内核模块

工作在内核层面,

所谓的lvs虚拟服务器

不像传统的装包配置起服务,

也不像容器化的用镜像跑容器,在容器里面运行进程

如果说需要软件包,就是ipvsadm,然后用户在

命令行界面用这个命令行工具去部署ipvs的规则

但是在k8s,这个不用

先不说过程

先说结果

结果就是

系统调用ipvs内核模块

来生成具体的负载均衡路由方式

由一个虚拟服务器的虚拟ip地址接待流量

是vip,不是按个尊贵的vip,是一个virtual ip,是一个虚拟的ip地址

这个虚拟的ip地址接待访问流量

然后通过arp内核抑制的方法

把后端服务器的arp隐藏掉

客户端的访问请求到达vip

vip这里再搞个操作,把访问请求报文

的目标mac地址,给到抑制了arp的后端真实服务器

------------------------------------------------------------------------

对于客户端来讲,客户要访问的ip是那个谁谁谁

而lvs集群告诉客户端的信息是,我就是那个谁谁谁

我的ip就是你要找的ip

客户端说是吗?

我先找人的时候,先搞arp地址请求

在网上问,我要找的ip是谁谁谁,这个谁谁谁,你把你的mac地址给我

我们对一下号

lvs集群怎么搞的

它就是让后端真实服务器的兄弟们悄悄的

别人发arp广播的时候,你们别吱声

这个功能是怎么实现的,是调整内核参数,arp_ingore = 1

忽略arp请求

再往深了讲,先不说了

先把k8s这一套怎么操作的说清楚

lvs的dr模式的内部原理

还有一个内核参数arp_anounce = 2

------------------------------------------------------------------------------------------

简单理解就是说

客户端的请求报文来到lvs集群的时候

lvs虚拟服务器让后端真实服务器arp_ignore = 1

就是别人来问的时候,你们别吱声

lvs虚拟服务说,本机器就是你要找的服务器

所以客户端的请求报文就到达lvs虚拟服务器了

然后lvs虚拟服务器通过修改报文的mac地址

把流量分配给后端干活的真实服务器

真实服务器完成计算任务后,将响应报文返回给客户端的时候

一般来讲,还是给lvs虚拟服务器,lvs虚拟服务器再给回客户端

就有点像nginx的反向代理了

但是

lvs的性能优秀就优秀在这个地方的与众不同

它集群的后端真实服务器返回数据的时候

不经过lvs虚拟服务器,

而是直接给客户端返回去。

管理员会有疑问,

根据同源策略,这样的报文回去,客户端不认啊

那能行吗

lvs就是这样搞的

用arp_anounce = 2

声明自己的另一张网卡

有意思的是,后端服务器的这个另一张网卡

是虚拟网卡,这个虚拟网卡的ip就是lvs接待流量的ip

后端真实服务器跑完应用程序生成响应报文了

回传数据的时候,报文的目标ip还是客户端的ip

为什么呢?

因为lvs虚拟服务器接待了流量转发给后端真实服务器的时候

只是改变了数据帧层面的帧头,也就是mac地址

而源目ip是包裹在数据帧之内的,所以

lvs虚拟服务器并没有改变报文的源目ip

它没有拆包

而数据包到了后端真实服务器那里

它就拆包,工作

然后搞完之后

返回响应报文

自然是目标ip就是客户端的ip

有意思的是

后端真实服务器进行了一个花操作

就是用arp_anounce = 2

让内核在返回响应报文的时候

给这个数据包的源ip用自己的

能够与客户端通信的ip地址

也就是那个虚拟ip地址

这个虚拟ip地址,lvs虚拟服务器和后端真实服务器都有,而且是一样的

那么这个数据包到达客户端那里

也不会有疑问

因为客户端访问的就是这个虚拟ip,vip

返回的数据包的源ip也是这个虚拟ip,vip

客户端觉得是ok的

是没问题的。

---------------------------------------------------------------------------------------------

服务端集群这么一套搞下来,

就是lvs-dr模式了

linux vitual server - direct routing

linux虚拟服务器 - 直连 路由

这个好处是lvs虚拟服务器不用拆包

而且只管进来的流量,出去的流量不经手

所以负载减轻了好多

所以

就有了管理员常说的,lvs负载均衡性能好

它比nginx从性能方面来讲,就有这么一点了

出站的流量是后端服务器自己给出去的

那清闲了一半

这个也挺主要的。

---------------------------------------------------------------------------

总的来说

lvs的模式,可以用两句话大概概括

1.  客户端来找服务器的时候,后端服务器说“不是我,不是我”

2.  后端服务器给客户端返回数据的时候,后端服务器说“嘿嘿,就是我,我来啦”

----------------------------------------------------------------------------------------------------------

那么lvs功能少,性能好,工作在四层

k8s集群创建服务的流程是这样的:

用户kubectl  apply -f  service_name.yaml

意思是告诉apiserver,我要创建一个service,名称叫service_name

apiserver会创建出来一个service

service的ip地址也是apiserver给提供的

kubeproxy主要是去找内核模块ipvs,说lvs虚拟服务器的ip就是这个了

也就是service的ip地址,后端的pod的ip

作为后端真实服务器和service的ip

组成一个lvs负载均衡集群。

那么ipvs内核模块就可以按照需求来创建一个lvs负载均衡集群

从整体来看,k8s集群可以视为一个大型的负载均衡集群

加上deployment、daemonset、statefulset、HPA

等控制器

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven本地打jar包依赖

本地工程的pom文件中引入了mysql依赖,但是在maven库中没有拉下来,可以到mysql官网下载jar包,使用maven手动打包到本地仓库中: 官网地址:MySQL :: Download MySQL Connector/J (Archived Versions) 在jar包所在位置的路…

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 🚀0.前言 🚈1.string 构造函数 🚝1.1string构造函数 🚝1.2string拷贝构造函数 🚈2.string类的使用 🚝2.1.查询元素个数或空间 返回字符串中有效字符的个数:size lenth 返回字符串目…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,现已广泛应用于农林生态,资源环境等方面,成为Science、Nature论文的…

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp(如果安装了则跳过)启动xrdp服务 3.3 远程服务…

混个1024勋章

一眨眼毕业工作已经一年了,偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候,本来以为自己这一年没学到多少东西,但是看看自己的博客其实也有在进步,虽然比不上博客里的众多大佬,但是回头看也算是自己的…

如果自建 ChatGPT,我会如何从 Model、Inference runtime 构建整个系统

ChatGPT 是一个基于 LLM 的对话系统。本文将介绍如何构建一个类似 ChatGPT 的系统,包括从模型、推理引擎到整体架构的构建过程。 系统概览 让我们关注最核心的对话部分。 如上图所示,web 负责与用户进行交互,server 接受用户的对话请求&…

算法的学习笔记—数组中只出现一次的数字(牛客JZ56)

😀前言 在数组中寻找只出现一次的两个数字是一道经典的问题,通常可以通过位运算来有效解决。本文将详细介绍这一问题的解法,深入解析其背后的思路。 🏠个人主页:尘觉主页 文章目录 🥰数组中只出现一次的数字…

【移动应用开发】界面设计(二)实现水果列表页面

续上一篇博客 【移动应用开发】界面设计(一)实现登录页面-CSDN博客 目录 一、采用ViewBinding实现一个RecyclerView 1.1 在app/build.gradle中添加recyclerview依赖,并打开viewBinding (1)在app/build.gradle中添加…

Servlet(三)-------Cookie和session

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用…

金融工程--pine-script 入门

背景 脚本基本组成 策略实现 实现马丁格尔策略 初始化变量:定义初始资本、初始头寸大小、止损百分比、止盈百分比以及当前资本和当前头寸大小等变量。 更新头寸:创建一个函数来更新头寸大小、止损价格和止盈价格。在马丁格尔策略中,每次亏…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改,直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

leetcode-75-颜色分类

题解(方案二): 1、初始化变量n0,代表数组nums中0的个数; 2、初始化变量n1,代表数组nums中0和1的个数; 3、遍历数组nums,首先将每个元素赋值为2,然后对该元素进行判断统…

【开源项目】经典开源项目数字孪生工地——开源工程及源码

飞渡科技数字孪生工地管理平台,以物联网、移动互联网技术为基础,充分应用人工智能等信息技术,通过AI赋能建筑行业,对住建项目内人员、车辆、安全、设备、材料等进行智能化管理,实现工地现场生产作业协调、智能处理和科…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前,先介绍一个概念设计模式&#xff…

stm32入门教程--ADC模拟-数字转换器

ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转你换位内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC,1us转换时间 输入电压范围:0-3.3V转换结果范围…

Pyramidal Flow使用指南:快手、北大、北邮,开源可免费商用视频生成模型,快速上手教程

什么是 Pyramidal Flow? Pyramidal Flow 是由快手科技、北京大学和北京邮电大学联合推出的开源视频生成模型,它是完全开源的,发布在 MIT 许可证下,允许商业使用、修改和再分发。该模型能够通过文本描述生成最高10秒、分辨率为128…

Embedding 模型和Model 批量推理和多卡部署

批量推理 多卡部署 使用huggingface 【AI大模型】Transformers大模型库(七):单机多卡推理之device_map_transformers多卡推理-CSDN博客 首先用 CUDA_VISIBLE_DEVICES1,2,3 python 或者os.environ["CUDA_VISIBLE_DEVICES"] &q…

风力发电场的“守护神”

摘要:作为清洁能源之一,风力发电场近几年装机容量快速增长。8月17日,国家能源局发布1-7月份全国电力工业统计数据。截至7月底,全国累计发电装机容量约27.4亿千瓦,同比增长11.5%。其中,太阳能发电装机容量约…