[Kubernetes] kube-proxy 详解

文章目录

      • 1.kube-proxy概述
      • 2.userspace模式
      • 3.iptables模式
      • 4.ipvs模式

1.kube-proxy概述

kube-proxy组件是用来实现service的请求转发,具体实现方式是kube-proxy运行在每个node上,通过watch监听API Server 中service资源的create,update,delete事件,以获取新的Pod 和 vip映射关系,然后通过更新 iptables 规则来实现请求数据的转发,构建并维护各节点路由信息。

kubernetes中kube-proxy支持三种模式,在v1.8之前使用的是iptables 以及 userspace两种模式,在kubernetes 1.8之后引入了ipvs模式,并且在v1.11中正式使用,其中iptables和ipvs都是内核态也就是基于netfilter,只有userspace模式是用户态。

在详细了解kube-porxy前,先看下service的配置文件,这里面定义了转发涉及到的了3个port:

  • port: 对外的service port
  • target port: 提供服务的pod port
  • node port: 中间转发的node port
# cat service-demo.yaml 
apiVersion: v1
kind: Service
metadata:name: mynginxnamespace: default
spec: selector:app: mynginxclusterIP: 10.10.98.98 # service iptype: NodePort # service 类型ports:- port: 80 # service端口targetPort: 8000 # pod端口nodePort: 30080 # node端口

2.userspace模式

在userspace模式下,kube-proxy进程是一个真实的TCP/UDP代理,当某个pod以clusterIP方式访问某个service的时候,这个流量会被pod所在的本机的iptables转发到本季的kube-proxy进程,然后将请求转发到后端某个pod上。

在这里插入图片描述

  • kube-proxy监听API Server 已添加和删除service和Endpoint对象,获取映射关系。
  • 在本地节点上打开一个随机端口(nodePort),访问该随机端口的流量将会转发到后端pod(通过映射关系)。会通过SessionAffinity策略决定要转发到哪个后端Pod。(用户空间)
  • 安装iptables规则,以捕获service的clusterIP和port的请求流量。规则会将流量重定向到随机端口(nodePort)。(内核空间)
  • 当流量重定向到nodePort时,kube-proxy 作为一个负载均衡,将流量分发到后端的pod。默认情况下,用户空间模式下的kube-proxy通过轮询算法选择后端pod。(用户空间)
  • clusterip重定向到kube-proxy服务的过程存在内核态到用户态的切换,开销很大,因此有了iptables模式,而userspace模式也被废弃了。

3.iptables模式

kubernets从1.2版本开始将iptabels模式作为默认模式,这种模式下kube-proxy不再起到proxy的作用。其核心功能:通过API Server的Watch接口实时跟踪Service和Endpoint的变更信息,并更新对应的iptables规则,Client的请求流量通过iptables的NAT机制“直接路由”到目标Pod。

在这里插入图片描述

  • kube-proxy监听API Server 已添加和删除service和Endpoint对象,获取映射关系。
  • kube-proxy 对每个service安装iptables规则,以捕获service的clusterIP和port的请求流量,规则会将流量重定向到某个后端集。(内核空间)
  • 对于每个Endpoint对象,将继续安装iptables规则,通过iptables将作为一个负载均衡,分发流量到后端的pod。默认情况下,iptables随机选择后端pod。(内核空间)
  • 不同于userspace模式,iptables模式由kube-proxy动态的管理,kube-proxy不再负责转发,数据包的走向完全由iptables规则决定,这样的过程不存在内核态到用户态的切换,效率明显会高很多。
  • 随着service的增加,iptables规则会不断增加,导致内核十分繁忙(等于在读一张很大的没建索引的表),2个svc,8个pod就有34条iptabels规则了,随着集群中svc和pod大量增加以后,iptables中的规则开会急速膨胀,导致性能下降,某些极端情况下甚至会出现规则丢失的情况,并且这种故障难以重现和排查。
  • 如果通过iptables规则转发的第一个Pod没有响应,则连接失败,不会自动重试。但可以使用Pod Readiness Probe来验证后端Pod 是否正常运行,若正常iptables即可转发流量到后端pod,若异常,kube-proxy会直接从service中剔除pod。

4.ipvs模式

从kubernetes 1.8版本开始引入第三代的IPVS模式,它也是基于netfilter实现的,但定位不同:iptables是为防火墙设计的,IPVS则专门用于高性能负载均衡,并使用高效的数据结构Hash表,允许几乎无限的规模扩张。

一句话说明:ipvs使用ipset存储iptables规则,在查找时类似hash表查找,时间复杂度为O(1),而iptables时间复杂度则为O(n)。

在这里插入图片描述

  • kube-proxy监听API Server 已添加和删除service和Endpoint对象,获取映射关系。
  • 调用netlink接口创建相应IPVS规则,并定期通过service和endpoint同步IPVS规则。
  • 访问service时,IPVS将流量分到后端Pod之一。
  1. IPVS代理模式也基于netfilter挂钩函数,工作在内核空间,但是使用哈希表作为基础数据结构。这意味着,与iptables模式下的kube-proxy相比,IPVS模式下的kube-proxy重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。而且ipvs作为一个四层负载均衡器,与其他代理模式相比,支持多种负载均衡算法和更高的网络流量吞吐量。
  2. 可以将ipset简单理解为ip集合,这个集合的内容可以是IP地址、IP网段、端口等,iptabels可以直接添加规则对这个可变集合进行操作,这样做的好处可以大大减少iptables规则的数量,从而减少性能损耗。假设要禁止上万个IP访问我们的服务器,如果用iptables的话,就需要一条一条的添加规则,会生成大量的iptabels规则;但是用ipset的话,只需要将相关IP地址加入ipset集合中即可,这样只需要设置少量的iptables规则即可实现目标。
  3. 由于ipvs无法提供包过滤、地址伪装、SNAT等功能,所以某些场景下(比如NodePort的实现)还要与iptables搭配使用。

IPVS提供多种负载均衡算法:

  • rr:轮循
  • lc:连接最少(打开的连接最少)
  • dh:目标哈希
  • sh:源哈希
  • sed:最短的预期延迟
  • nq:永不排队

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

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

相关文章

IPv6路由配置:ripng、ospfv3、静态路由

本次主要是对ipv6路由的配置,先了解ipv6,再进行实验配置 目录 一、🍉 什么是IPV6?🌟IPv6的主要特点 二、🍉IPv6和IPv4的对比🌟 共同点:🌟 IPv4的优缺点:🌟 IPv6的优缺点:…

Docker三剑客从0到1

一、docker三剑客介绍 使用"三剑客"可以帮助我们解决docker host维护,多容器编排部署,多个docker host集群的各个难题。 docker-machine 创建虚拟机 我们知道docker使用了linux的内核技术(namespace 资源隔离,cgroup资源限制等),那么如果我想在windows或Mac系统上…

按照官网引擎问题重新设置监控目录,仍然存在空三等待的问题怎么办?

答:任务目录和引擎目录设置一样,然后取消任务重新写入. 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型&#xff0…

webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

公共命名空间和RHP

概述 RHP的全称是:the little Robot that Helped me Program,帮我编程序的小机器人。 RHP必然存在,C语言的宏、C的模板,都是RHP;更复杂的例子,是lex和yacc,它们是制作程序的程序,也…

常见的电气元器件

主要介绍:电阻、电容、电感、晶体二极管、稳压二极管、变容二极管、晶体三极管、场效应管、变压器、传感器等都是电子电路常用的器件。 一:电阻 电阻,因为物质对电流产生的阻碍作用,所以称其该作用下的电阻物质。电阻将会导致电…

MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

前言 做数仓开发离不开 SQL ,写了很多 HQL 回头再看 MySQL 才发现,很多东西并不是 HQL 所独创的,而是几乎都来自于关系型数据库通用的 SQL;想到以后需要每天和数仓打交道,那么不管是 MySQL 还是 Oracle ,都…

EDA设计学习笔记2:STM32F103C8T6最小系统板的仿绘

今日开始仿制练习一个STM32F103C8T6最小系统板,通过对这个最小系统板的仿制,达到对自己PCB设计的练习的目的,最终目标是自己设计出一块PCB,做一个OLED的桌面小摆件...... 也不知道画出来能不能用..... 目录 主控芯片的搜索与放置…

P1827 [USACO3.4] 美国血统

题目描述 农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。 你的任务是在被给予奶牛家谱的“树中序遍…

【退役之重学Java】如何开发一个消息队列中间件

一、考虑可扩展性 分析 消息队列中的消息数量是不确定的,有时一两万个,出现流量高峰甚至消息积压的时候,就会有上百万、千万的消息在队列中。所以,为了增加系统的稳定性,消息队列需要具备快速扩容的能力 实现 采用分布…

迷宫游戏(c++)

我们来玩一个迷宫游戏,尝试走一下面的迷宫。 迷宫游戏 我们用一个二维的字符数组来表示前面画出的迷宫: S**. .... ***T 其中字符S表示起点,字符T表示终点,字符*表示墙壁,字符.表示平地。你需要从S出发走到T&#xf…

Cocos Creator 3.x 实现触摸拖动物体(record)

参考:如何实现拖动物体 - Creator 3.x - Cocos中文社区 //注册触摸事件 node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this); //事件回调函数 onTouchMove(event) {const location event.getUILocation();event.target.setWorldPosition(location.x, lo…

React渲染流程

在 React 渲染分为两个阶段,Render 和 Commit,Render 是修改 React 组件的状态,把需要更新的组件标记为待更新,在 Commit 阶段将待更新的组件进行渲染并最终更新到浏览器的 Dom 树中。 Render 阶段是可以并执行操作的&#xff0c…

JAVA定时创建mysql表

Java代码实现 Value("${timeTask.scheduled}")private boolean scheduled;// 提前创建3天的表Scheduled(cron "0 0 1 * * ?")public void createTable() {if (scheduled) {log.info("开始检验日志表");LocalDate localDate LocalDate.now();L…

探究AIGC行业:背景、现状与进入时机分析

人工智能与智能计算(AIGC)作为当今科技领域的热门话题,正在引起广泛关注。随着技术的不断进步和应用领域的拓展,AIGC行业正迎来新的发展机遇。本文将从AIGC产生的背景、现状以及当前进入行业的时机三个方面进行分析,旨…

软件测试常见面试题合集(内附详细答案)

01 软件测试理论部分 1.1 测试概念 1. 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试:完成最小的软件设计单元(模块)的验证工作,目标是确保模块被正确的编码 集成测试:通过测试发现与…

知识蒸馏详解

1.概述 知识蒸馏,其核心在于如何让一个小型、资源友好的模型(学生模型)通过学习一个庞大、性能优越但资源消耗大的模型(教师模型)的知识,从而在保持较小规模的同时,接近或达到教师模型的预测能力。这一过程就如同聪明的学生从优秀老师那里不仅学习到知识的精髓,还能借鉴…

猛兽派对是什么游戏 猛兽派对攻略大全 苹果电脑怎么玩《猛兽派对》?

猛兽派对是多人派对类型的游戏,该款游戏的动作基于物理原理设计的,体验游戏玩家可以选择自己喜欢的小动物角色参加派对,游戏内具有很多不同的关卡可供挑战。 在steam平台上,猛兽派对对应英文名称是PartyAnimals,官方正…

JVM内存模型最新面试题(持续更新)

问题:java中创建的对象一般放在哪里?(全流程包含从创建到回收) 回答 大部分对象在堆中,这个基本都知道; 少部分对象是会在栈中的,比如作用域不局限于方法内的方法内部变量,这类对象的特征一般就是生命周期…

Flutter 中的 Divider 小部件:全面指南

Flutter 中的 Divider 小部件:全面指南 在用户界面设计中,分隔线(Divider)是一种常用的视觉元素,用于区分内容、组织布局和提高可读性。在 Flutter 框架中,Divider 小部件提供了一种简单而有效的方式来添加…