深入理解k8s kube-proxy
1、概述
我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的,真正的流量由iptables/ipvs来转发就可以了。
网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。
kube-proxy就是K8s网络的核心组件。它把我们应用使用的service翻译为网络规则。
kube-proxy这个名气会有让人产生一点歧义,因为有技术背景的朋友们看到后不了解之前就会想到用户的流量是先经过kube-proxy,然后kube-proxy转发到集群的,其实并不是这样的。kube-proxy只负责网络规则的创建,修改和删除,真正的流量还是依赖于Linux/Windows来接受和转发。如果从这个角度来理解,kube-proxy在Linux环境上主要控制和配置iptables或ipvs, 在windows则控制和配置kernelspec。 从这个角度来看kube-proxy像是一个控制平面,iptables/ipvs/kernelspec像是一个数据平面。
正因为kube-proxy不处理用户流量,所以k8s的性能不会有什么问题,反观Istio使用边车模式(sidecar),对流量进行管理才会导致性能问题。
在开始说明kube-proxy之前,我们可以想一下kube-proxy主要想解决哪些问题。
2.kube-proxy需要解决哪些问题?
- 服务发现,给Pod提供一个统一的入口来访问服务
- 负载均衡:这里主要是kube-proxy把Pod的路由信息写到iptables或者ipvs,让内核对根据支持的负载均衡算法进行流量转发
另外,我想额外说明的是kube-proxy时刻都要监听Api Server(kube-proxy的老板)发送过来的Pod的CUD(创建,更新和删除)信息,有变更就改规则。
3.什么是kube-proxy
k8s中的Pod是临时的,因为Pod中运行的是我们的应用,我们的应用可能随时会崩溃,崩溃了以后k8s会为我们重新创建,我们不能用Pod的IP通信,因为Pod每次崩溃重启IP会变更,而且Pod的数量也会改变。
所以K8s就增加了Service来提供Pod统一的入口。Service提供了连接一个或者多个的Pod静态地址。我们可以这么理解:进入k8s集群的流量先到达Service,然后流量被重定向到Pod,同时Service保证流量不转发到不健康的Pod。这个保证会在一个短的时间无法保证,就是Pod从进入不健康状态到被检测出不健康的这个时间区间。
但是在网络层如何实现Service到Pod的映射?kube-proxy就是干这事的。
kube-proxy会被安装在每个k8s的Node之上。它用来监控Service和Endpoint的变化。然后他会将这些变化转换为自己Node上的网络规则。
kube-proxy是以DaemonSet的形式运行在k8s集群中的。但是它也可以以进程的方式安装在Linux系统之中。安装方式可以参考官网自己选择。
- kubeadmin安装k8s,kube-proxy会被安装位DaemonSet
- 使用Linux tar方式安装,kube-proxy会以Linux进程方式运行
4.kube-proxy工作原理
在kube-proxy安装完成后,它会与API Server完成认证。
当新的Service或者EndPoint被添加或者移除,那么API Server会将这些变更通知给kube-proxy。
kube-proxy在收到通知后会将这些变化应用于Node的NAT规则中。这些NAT规则就是简单的件Service IP映射到Pod IP。
当有流量发送给Service时,Service会基于NAT的这些规则将流量转发给Pod。
我们来看几个例子。
假设我们有一个Service,这个Service名字为SVC01,类型为ClusterIP。当这个Service创建完成后,API Server会检查需要关联到这个Service的Pod。我们一般是通过在Service中配置Pod的标签来选择一组Pod,所以API Server会查找与Service中标签匹配的Pod。
假设API Server查找到的Pod为Pod01和Pod02,其中Pod1在Node1,Pod2在Node2。API Server会创建一个抽象的Endpoint。每个EndPoint。每个EndPoint代表了一个Pod的IP地址。SVC01可以绑定到这两个Pod对应的Endpoint。假设这两个EndPoint为EP01和EP02。
这些配置在Control Plane完成后,k8s还在将这些Mapping关系体现在Node上。一旦这些配置在Node上配置完成后,SVC01 Servvice的流量就会被转发到EP01和EP02,如下图所示:
在这种情况下,如果有流量进入SVC01,则流量转发如下图:
Service和EndPoint映射说明:
- Service和EndPoint是IP和端口的映射而不只是IP的映射
- DNAT转换发生在源Node。因为Service类型是ClusterIP,只能从集群内部进行访问
- 如果Service类型是其他方式,比如:NodePort,这些规则会被应用到Linux。
- NAT规则会随机选择其中一个Pod进行流量转发,但是这个会根据kube-proxy的模式而改变
下面我们来看下kube-proxy的模式。
5.kube-proxy模式
kube-proxy支持不同的网络转发模式。每种模式用来描述Kube-proxy如何来实现NAT规则。想要知道每种模式的好坏,我们需要理解每种模式的工作原理。
5.1.IPtables 模式
IPTables是最通用和最常用的模式。在这个种模式下,kube-proxy依赖于Linux的IPTables的功能特性。Iptable用来处理数据和过滤数据包。它会检查Linux机器上的入站和出站流量,然后IPtable可以根据规则来匹配数据包并将其转发。
当k8s使用这种模式时,kube-proxy会将Service到Pod的NAT规则写入到IPTables中。IPTables根据kube-proxy写入到这些规则将流量重定向到对应的Pod。
5.1.1.IPTables劣势
IPTables劣势就是在大规模集群下性能低。
使用IPTables模式的不好之处就是它的规则是链式的,因为IPTables的设计目的是为了数据包的过滤组件。那么IPTables在处理大量规则时性能就会很低,因为链式查找速度慢。所以选择这种模式时你需要考虑你的k8s集群Service和Pod的数量,如果数量太大的话就考虑选择其他模式了。
另外,IPTables不支持一些特定的负载均衡算法,只支持简单轮询方式来实现负载均衡。
5.2.IPVS 模式
IPVS (IP Virtual Server)是一种高效的Layer-4交换机,实现了运行在LVS下的提供负载平衡功能的技术。IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。这个是k8s kube-proxy的一个较好的选择。在IPVS模式下,kube-proxy将转发规则写入到IPVS中。
由于IPVS是一个专门用于交换的模块,所以它的查找算法最小可以在O(1)时间复杂度完成,所以它在大规模集群下能够表现出很好且很稳定的性能。
IPVS模式也支持很多负载均衡算法,比如:轮询,最小连接和其他哈希算法。
5.2.1.劣势
IPVS模块不一定默认安装在Linux系统中,你可能需要手动安装或启用它。并且如果不是大规模集群,IPTables就可以满足你的场景。
IPVS和Iptable对比
tigera公司提供的数据,就是开源Colico网络组件的那个公司。
-
服务数量与平均响应时间
-
服务数量与CPU占用
如何iptables和ipvs如何选择?
上面的两个图表表示:在1000个Pod时ipvs和iptables性能没有什么差别,超过1000个ipvs模式性能更高。
另外,如果你不确定使用哪个,你就选择ipvs吧。
5.3.KernelSpace 模式
这个模式时Windows节点专用的。在这个模式下,kube-proxy会将包过滤规则写入到windows的VFP(Windows Virtual Filtering Platform)。Windows上的VFP的工作原理和Linux的IPTables一样,这就意味着VFP会将数据包中的目的IP地址替换为Pod的IP地址。
如果你不熟悉Windows平台的虚拟机,那么你可以认为VFP是Hyper-V的一个扩展,这个扩展专门用于虚拟机网络。
5.4.如果检查kube-proxy的模式?
你可以通过接口查询kube-proxy的模式,kube-proxy默认端口为10249.
你可以使用/proxyMode 来查询kube-proxy模式,
curl -v localhost:10249/proxyMode
COPY
上图展示了这个kube-proxy使用了ipvs模式。
5.5.IPVS规则查看
IPVS可以通过ipvsadm命令进行查看,可能需要先安装
sudo apt install ipvsadm
sudo ipvsadm -L
COPY
5.6.IPTables规则查看
使用iptables命令查看nat规则列表
iptables -t nat -n -L
COPY
6.FAQ
6.1.k8s Service是一个代理吗 ?
k8s service使用起来像是一个代理,它为客户端提供了一个静态接入点。
6.2.kube-proxy会进行负载均衡吗 ?
这个视情况而定。
如果你说的是的kube-proxy这个k8s的网络agent,那么kube-proxy不会进行负载均衡。因为kube-proxy并不接收流量进行转发,而是依赖于OS提供的能力。
如果你说的是kube-proxy创建的规则,那么会。因为kube-proxy会创建对多个Pod创建具有负载均衡能力的Service,这个依赖于iptables/ipvs/kernelspec。
7.总结
kube-proxy是k8s的网络代理,它主要将Service的定义转换为网络规则。它在集群中的每个Node上运行,并与API Server通信以接收Service的更新,然后将这些更新同步到自己的Node中。
kube-proxy并不会直接接收流量并将其转发,而是依赖于OS提供的相关能力来完成。
8.参考
k8s kube-proxy – FOF编程网
相关文章:

深入理解k8s kube-proxy
1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的,真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…...

Spark-机器学习(1)什么是机器学习与MLlib算法库的认识
从这一系列开始,我会带着大家一起了解我们的机器学习,了解我们spark机器学习中的MLIib算法库,知道它大概的模型,熟悉并认识它。同时,本篇文章为个人spark免费专栏的系列文章,有兴趣的可以收藏关注一下&…...
java的正则表达式校验,包含了中国几乎所有运营商手机号码的校验格式
时间2024年4月14日22:25:00 代码 String PHONE_REGEX "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";解释 这个Java代码段定义了一个常量 PHONE_REGEX,它包含了一个正则表达式,用于匹配中国大陆的手机号码。下面是对这…...

C#简单工厂模式的实现
using System.Diagnostics.Metrics; using System.Runtime.InteropServices; using static 手写工厂模式.Program;namespace 手写工厂模式 {internal class Program{public interface eats {void eat();}//定义了一个接口public class rice : eats{public void eat() {Console.…...
.NET 设计模式—观察者模式(Observer Pattern)
简介 在.NET中,观察者模式是一种设计模式,它允许对象之间进行一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。这种模式在事件驱动的设计中非常常见。 在.NET中实现观察者模式,通常涉…...

EasyUI Jquery 学习笔记 ——DataGrid(数据网格)与 Tree(树)详细版
1. DataGrid(数据网格)与 Tree(树) 1.1 Datagrid 数据网格 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目…...
JAVA发票验真接口、票据ocr、数电票在线查验真伪
发票验真接口,,实时联网核验发票真伪,查验一致返回全票面信息,支持查验增值税发票管理系统开具的发票,支持批量核验发票,翔云发票查验送发票识别,助您摆脱手动输入繁琐,提升工作效率。 发票查验接口适用于银行、金融、代理记账等发票管理数量…...
el-date-picker调用回车事件
elementui的el-date-picker想要调用回车事件: <el-date-pickerv-model"state.date"type"date"value-format"YYYY-MM-DD HH:mm:ss"placeholder"选择日期"clearablekeydown.enter"handleDown"></el-date-…...

js学习总结
这里写目录标题 前情提要JavaScript书写位置1. 内部javaScript (不常用)2. 外部javaScript (常用)3.内联javaScript (常用) js中的输入和输出输出语法1. document.write()2. alert()3. console.log() 输入语法prompt() 前情提要 1. 在javaScript中的 分号 是可以省略的JavaScr…...

MES实施优势有哪些?MES制造执行系统的主要内容
各个行业之间也开始进入到了激烈的竞争当中,很多企业为了能够有效提升企业竞争力,都会通过提升自身实力的方式来提升竞争力。一些制造业也会在经营过程当中使用到MES系统,那么,mes系统的优势有哪些呢? 1、优化企业现场…...

ChatGPT 和 Elasticsearch:使用 Elastic 数据创建自定义 GPT
作者:Sandra Gonzales ChatGPT Plus 订阅者现在有机会创建他们自己的定制版 ChatGPT,称为 GPT,这替代了之前博客文章中讨论的插件。基于本系列的第一部分的基础 —— 我们深入探讨了在 Elastic Cloud 中设置 Elasticsearch 数据和创建向量嵌…...

废品回收 小程序+APP
用户实名认证、回收员实名认证、后台审核、会员管理、回收员管理、订单管理、提现管理、地图、档案管理。 支持,安卓APP、苹果APP、小程序 流程: 一、用户端下单,地图选择上门位置、填写具体位置、废品名称、预估重量、选择是企业废旧、家…...

下载好了annaconda,但是在创建一个新的Conda虚拟环境报错
文章目录 问题描述:解决方案1.生成一个配置文件 问题总结 问题描述: ProxyError(MaxRetryError(“HTTPSConnectionPool(host‘repo.anaconda.com’, port443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by ProxyErr…...

如何安装MacOS的虚拟机?mac安装虚拟机的步骤 虚拟机安装MacOS VMware Fusion和Parallels Desktop19
要在Mac上运行MacOS的虚拟机,常用的方法是使用虚拟化软件如VMware Fusion或Parallels Desktop。 以下是安装MacOS的虚拟机的主要步骤: 1. 检查系统要求:确定您的Mac硬件和操作系统满足安装要求。您需要一台具备足够性能的Mac,并…...
Flutter 中 AutomaticKeepAliveClientMixin 的介绍及使用
在 Flutter 中,当你在一个页面中滑动列表或者进行其他一些操作时,如果你返回到该页面,可能会发现之前的状态已经丢失了。这在某些情况下可能是不可取的,特别是当你想要保留之前的状态,而不是每次都重新加载页面时。 为…...

注意力机制篇 | YOLOv8改进之清华开源ACmix:自注意力和CNN的融合 | 性能速度全面提升
前言:Hello大家好,我是小哥谈。混合模型ACmix将自注意力机制和卷积神经网络进行整合,使其同时具有自注意力机制和卷积神经网络的优点。这是清华大学、华为和北京人工智能研究院共同发布在2022年CVPR中的论文。ACmix结合了自注意力机制和卷积神经网络的优势,以提高模型的性能…...
Go语言支持重载吗?如何实现重写?
Go语言不支持传统意义上的函数和方法重载。在Go语言中,函数名或方法名不能相同但参数列表不同,因为这会导致编译错误。 然而,可以通过方法重写(override)来实现类似的功能。方法重写是指在子类中定义一个与父类同名的…...
Spring中基于事件监听驱动 和 线程池的异步任务
文章目录 事件监听驱动 与 异步事件源ApplicationContextAware接口 发布事件事件实体监听事件实现异步注入綫程池 事件驱动机制,与MQ消息队列比较 事件监听驱动 与 异步 事件监听驱动优点:解耦,将 事件和业务进行解耦,通过Asyc注解…...

C++ 优先级队列用法详解与模拟实现
文章目录 C 优先级队列用法与模拟实现介绍用法头文件1.创建优先级队列priority_queue 2. 插入元素push 3. 删除元素pop 访问顶部元素top 检查优先级队列的大小size 检查优先级队列是否为空empty 模拟实现 C 优先级队列用法与模拟实现 介绍 优先级队列(Priority Qu…...
Linux进阶之旅:深入探索Linux的高级功能
文章目录 Linux进阶之旅:深入探索Linux的高级功能1. Shell脚本编程2. 进程管理3. 网络管理4. 文本处理5. 系统监控6. 总结 Linux进阶之旅:深入探索Linux的高级功能 在上一篇博客中,我们对Linux操作系统进行了入门级的介绍,包括Linux的特点、发行版、安装方法以及基本使用。接下…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...