深入理解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的特点、发行版、安装方法以及基本使用。接下…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...