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

等控制器

 

 

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

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

相关文章

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容: 第一期:【10天速通Navigation2】(一) 框架总览和概念解释第二期:【10天速通Navigation2】(二) :ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field 来访问或设置…

Visual Studio2022 Profile 工具使用

本篇研究下Visual Studio自带的性能分析工具,针对C代码,基于Visual Studio2022 文章目录 CPU使用率检测并发可视化工具使用率视图线程视图内核视图并发可视化工具SDK 参考资料 CPU使用率 对于CPU密集型程序,我们可以通过分析程序的CPU使用率…

【MySQL】MySQL数据库中密码加密和查询的解决方案

本篇博客是为了记录自己在遇到password函数无法生效时的解决方案。通过使用AES_ENCRYPT(str,key)和AES_DECRYPT(str,key)进行加密和解密。 一、问题 自己想创建一个user表,user表中有一个password属性列,自己想对密码进行加密后再存入数据库&#xff0c…

基于JAVA+SpringBoot+Vue的华府便利店信息管理系统

基于JAVASpringBootVue的华府便利店信息管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x1f3…

GCC 简介

Linux 中的编译器 GCC 的编译原理和使用详解 GCC 简介 GCC(GNU Compiler Collection)是一套由 GNU 开发的编程语言编译器,它支持多种编程语言,包括 C、C、Objective-C、Fortran、Ada 和 Go 等。GCC 是一个开源的工具集&#xff…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中,时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列(如 STM32F1、STM…

vue3+vite 部署npm 包

公司需要所以研究了一下怎么部署安装,比较简单 先下载个vue项目 不用安准路由,pinna 啥的,只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点,vue3中…

《Python游戏编程入门》注-第3章3

《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息,例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事,如图…

洛谷 P1226:【模板】快速幂

【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a,b,p,求 a^b mod p。【输入格式】 输入只有一行三个整数,分别代表 a,b,p。【输出格式】 输出一行一个字符串 a^b mod ps&a…

Centos7快速重置root密码

1、重新启动Centos7,5秒内按向下方向键,使其停留在开机界面,如下图。 2、按’e’键,进入如下界面,移动向下方向键至“linux16”开头的行。然后按向右的方向键移动,找到“ro”并将其修改为“rw init/sysroot/bin/bash…

编写一个简单的Iinput_dev框架

往期内容 本专栏往期内容: input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客 I2C子系统专栏: 专栏地址:IIC子系统_憧憬…

使用 NumPy 和 Matplotlib 进行高级数据可视化:实践指南

使用 NumPy 和 Matplotlib 进行高级数据可视化:实践指南 数据科学和工程实践中,NumPy 和 Matplotlib 是强大的组合工具。本文将进一步展示如何借助这两个库进行更复杂的可视化任务,例如创建多曲线、叠加图、动态可视化等场景。 一、环境准备…

Crowd Counting 系列NO4.—SwitchCNN(CVPR 2017)网络复现

文章目录 引言简介环境配置1、numpy 安装2、matplotlib 安装3、cv2 安装,即opencv-python安装4、scipy 安装5、theano安装7、flip_filters不再支持 数据问题密度图生成注意 引言 SwitchCNN是我看的比较早的一篇多列密集计数网络了,但是其网络实现因各种…

漏洞挖掘 | 基于mssql数据库的sql注入

前记 今天挖edu随意点开个站,发现存在mssql数据库的sql注入,在此分享下整个挖掘过程 目录 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之…

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 哨兵 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 哨兵 & 总结》(学习总结/最新最准/持续更新)《Redis & 哨兵…

【成长day】NeRF学习记录1:预备知识nerf论文算法学习

个人知乎文章链接:https://zhuanlan.zhihu.com/p/3383996241 预备知识 NeRF重建 NeRF的全称是Neural Radiance Fields,即将场景表示为视场合成的神经辐射场,用神经网络来拟合辐射场,实现对三维场景的隐式表示。本质是完成了图形…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引(BuildForwardIndex) 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章,我们将继续项…

Android——事件冲突处理

当我们给列表的item设置了点击事件后&#xff0c;又给item中的按钮设置了点击事件&#xff0c;此时item的点击事件会失效。 解决 给item的布局xml中设置以下属性 android:descendantFocusability"blocksDescendants"<LinearLayout xmlns:android"http://sc…

005:航空力学基础、无人机操纵、飞机性能

摘要&#xff1a;本文详细介绍无人机稳定性、操控性、飞机性能等概念。 一、飞机的稳定性 概念&#xff1a; 飞机的稳定性&#xff08;安定性&#xff09;&#xff0c;是指在飞机受到扰动后&#xff0c;不经飞行员操纵&#xff0c;能恢复到受扰动前的原始状态&#xff08;即原…