kube-proxy源码阅读

news2024/9/26 3:31:14

kube-proxy源码阅读

通过阅读kube-proxy的源码可以将proxy的主要逻辑总结为下图所示:
在这里插入图片描述首先顺着代码阅读到ProxyServer->Run()函数,这里是kube-proxy启动的主逻辑,启动了两个server,分别是:

...
	var errCh chan error
	if s.BindAddressHardFail {
		errCh = make(chan error)
	}

	// Start up a healthz server if requested
	serveHealthz(s.HealthzServer, errCh)

	// Start up a metrics server if requested
	serveMetrics(s.MetricsBindAddress, s.ProxyMode, s.EnableProfiling, errCh)
...

每个服务都是通过定时任务保证服务存活:

func serveHealthz(hz healthcheck.ProxierHealthUpdater, errCh chan error) {
	if hz == nil {
		return
	}

	fn := func() {
		err := hz.Run()
		if err != nil {
			klog.ErrorS(err, "Healthz server failed")
			if errCh != nil {
				errCh <- fmt.Errorf("healthz server failed: %v", err)
				// if in hardfail mode, never retry again
				blockCh := make(chan error)
				<-blockCh
			}
		} else {
			klog.ErrorS(nil, "Healthz server returned without error")
		}
	}
	go wait.Until(fn, 5*time.Second, wait.NeverStop)
}

然后通过informer机制的list/watch感知services(被观察者)和endpoints(被观察者)的变化,通过观察者模式实现消息同步,从而触发观察者(Proxier)的syncProxyRules方法更新网络规则:

...
	serviceConfig := config.NewServiceConfig(informerFactory.Core().V1().Services(), s.ConfigSyncPeriod)
	serviceConfig.RegisterEventHandler(s.Proxier) // 观察者模式
	go serviceConfig.Run(wait.NeverStop)

	endpointSliceConfig := config.NewEndpointSliceConfig(informerFactory.Discovery().V1().EndpointSlices(), s.ConfigSyncPeriod)
	endpointSliceConfig.RegisterEventHandler(s.Proxier) // 观察者模式
	go endpointSliceConfig.Run(wait.NeverStop)
...

Proxier提供的方法列表,先大概从名称上来了解一下方法用途:

    func (proxier *Proxier) precomputeProbabilities(numberOfPrecomputed int) {/*...*/}
    func (proxier *Proxier) probability(n int) string{/*...*/}
    func (proxier *Proxier) Sync(){/*...*/}
    func (proxier *Proxier) SyncLoop(){/*...*/}
    func (proxier *Proxier) setInitialized(value bool){/*...*/}
    func (proxier *Proxier) isInitialized() bool{/*...*/}
    func (proxier *Proxier) OnServiceAdd(service *v1.Service){/*...*/}
    func (proxier *Proxier) OnServiceUpdate(oldService, service *v1.Service){/*...*/}
    func (proxier *Proxier) OnServiceDelete(service *v1.Service){/*...*/}
    func (proxier *Proxier) OnServiceSynced(){/*...*/}
    func (proxier *Proxier) OnEndpointsAdd(endpoints *v1.Endpoints){/*...*/}
    func (proxier *Proxier) OnEndpointsUpdate(oldEndpoints, endpoints *v1.Endpoints){/*...*/}
    func (proxier *Proxier) OnEndpointsDelete(endpoints *v1.Endpoints) {/*...*/}
    func (proxier *Proxier) OnEndpointsSynced() {/*...*/}
    func (proxier *Proxier) deleteEndpointConnections(connectionMap []proxy.ServiceEndpoint){/*...*/}
    func (proxier *Proxier) appendServiceCommentLocked(args []string, svcName string){/*...*/}
    func (proxier *Proxier) syncProxyRules(){/*...*/}

其中Proxier的实现方式有两种,分别是:iptables和 IPVS
IPVS:

IPVS 全名 IP Virtual Server
实现 L4 的 load balancing
主要在 cluster 前的实体主机上运行
直接请求 base on service 的 TCP / UDP 到真实的 server
使真实 server 的 service 显示为有一个 IP 的虚拟 service
实现为 Netfilter 框架上的 module
Based on kernel 中的 hash tables
Kernel source code: net/netfilter/ipvs
ipvsadm 是管理 IPVS 的工具

iptables:
在这里插入图片描述
大致了解 IPVS ,那 IPVS 和 iptables 有什么差別呢?
其实他们都是使用 Netfilter ,来让封包传送的机制,但作面却是不一样的。
在 INPUT chain 这边,不论是 IPVS 或是 iptables 都会到 userspace 来进行封包解析,来看看封包要往哪里走。然而,就是在判断封包要往哪里走,这里的方法两者使用的方式是不一样的。

iptables 规则设定是:n 张 table,每张 table 内有 m 个 chain ,每个 chain 中有 多个rule。
虽然封包不会跑过所有的 Table 和 chain,但 rules 通常会是很多的。虽然封包只要被拆解一次,但封包在比对每个 rule 时,都要再看要用进來的这个封包和目前轮到的 rule 进行行比对。
这也是为什么我们在下 rule 的时候很重视 rule 的顺序性。(所以 rule 也会因人的设定好不好,效能也会有差异)。

IPVS 在判断上面就简单很多,他是用 hash table(hash表),在时间复杂度上,通常是是 O(1),即便遇到最差的情況(worst case),也只是 O(n)。

在kube-proxy中这两种Proxier的实现的最大区别也主要是规则的更新,也就是syncProxyRules这个方法,下面梳理两种实现的主要逻辑:

iptables:

  • 更新proxier.endpointsMap,proxier.servieMap
  • 创建自定义链将当前内核中 filter 表和 nat 表中的全部规则导入到内存中
  • 为每个 service 创建规则
  • 为 clusterIP 设置访问规则
  • 为 externalIP 设置访问规则
  • 为 ingress 设置访问规则
  • 为 nodePort 设置访问规则
  • 为 endpoint 生成规则链
  • 写入 DNAT 规则
  • 删除不再使用的服务自定义链
  • 使用 iptables-restore 同步规则

IPVS:

  • 通过 iptables-save 获取现有的 Filter 和 NAT 表存在的链数据
  • 创建自定义链与规则
  • 创建 Dummy 接口和 ipset 默认列表
  • 为每个服务生成 ipvs 规则
  • 对 serviceMap 内的每个服务进行遍历处理,对不同的服务类型(clusterip/nodePort/externalIPs/load-balancer)进行不同的处理(ipset 列表/vip/ipvs 后端服务器)
  • 根据 endpoint 列表,更新 KUBE-LOOP-BACK 的 ipset 列表
  • 若为 clusterIP 类型更新对应的 ipset 列表 KUBE-CLUSTER-IP
  • 若为 externalIPs 类型更新对应的 ipset 列表 KUBE-EXTERNAL-IP
  • 若为 load-balancer 类型更新对应的 ipset 列表 KUBE-LOAD-BALANCER、KUBE-LOAD-BALANCER-LOCAL、KUBE-LOAD-BALANCER-FW、KUBE-LOAD-BALANCER-SOURCE-CIDR、KUBE-LOAD-BALANCER-SOURCE-IP
  • 若为 NodePort 类型更新对应的 ipset 列表 KUBE-NODE-PORT-TCP、KUBE-NODE-PORT-LOCAL-TCP、KUBE-NODE-PORT-LOCAL-SCTP-HASH、KUBE-NODE-PORT-LOCAL-UDP、KUBE-NODE-PORT-SCTP-HASH、KUBE-NODE-PORT-UDP
  • 同步 ipset 记录
  • 刷新 iptables 规则

此外,由于 linux 内核原生的 ipvs 模式只支持 DNAT,不支持 SNAT,所以,在以下几种场景中 ipvs 仍需要依赖 iptables 规则:

  • 1、kube-proxy 启动时指定 –-masquerade-all=true 参数,即集群中所有经过 kube-proxy 的包都做一次 SNAT;
  • 2、kube-proxy 启动时指定 --cluster-cidr= 参数;
  • 3、对于 Load Balancer 类型的 service,用于配置白名单;
  • 4、对于 NodePort 类型的 service,用于配置 MASQUERADE;
  • 5、对于 externalIPs 类型的 service;

但对于 ipvs 模式的 kube-proxy,无论有多少 pod/service,iptables 的规则数都是固定的。

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

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

相关文章

基于深度学习的高精度安全帽背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全帽背心检测识别系统可用于日常生活中或野外来检测与定位安全帽背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全帽背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用…

【软考网络管理员】2023年软考网管初级常见知识考点(18)-安全协议SSL与PGP、数据加密技术

涉及知识点 安全套接层协议SSL详解&#xff0c;PGP协议是什么&#xff1f;数据加密技术有哪些&#xff1f;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多考点…

JUC之LockSupport和中断

文章目录 1 线程中断机制1.1 什么是线程中断机制1.2 三大中断方法1.3 如何中断运行中的线程1.3.1 通过volatile变量实现1.3.1 通过AtomicBoolean实现1.3.1 通过interrupt和isInterrupted api实现 2 LockSupport2.1 为什么会出现LockSupport2.2 两道面试题 参考材料 1 线程中断机…

案例合集 | 创新社会组织服务,打造“数字化商协会”

数字化建设方兴未艾数字化商会势在必行 近年来&#xff0c;国务院、发改委等机构陆续出台了一系列鼓励数字经济与产业数字化发展的规划指南&#xff0c;内容主要涵盖鼓励平台经济建设、促进供应链数字化转型与提升中小企业数字化渗透等方面&#xff0c;顶层政策引导并促进企业…

使用Gradio的BarPlot模块创建交互式柱状图

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SQL和NoSQL数据库的便捷速查表

在项目成功的过程中选择合适的数据库非常重要。以下是关键要点的总结&#xff1a; •SQL数据库提供结构化数据存储、SQL支持和关系能力。•NoSQL数据库提供灵活性、可扩展性和分布式架构。•专门的数据库&#xff0c;如列存储、图形数据库、空间数据库和时间序列数据库&#xf…

Jetpack compose中实现流畅的Theme选择器动画

Jetpack compose中实现流畅的Theme Picker动画 Jetpack Compose改变了我们在Android上管理主题的方式。它提供了更大的灵活性&#xff0c;使我们能够以更多的方式定义用户界面&#xff08;UI&#xff09;。此外&#xff0c;Compose中的动画系统使我们能够轻松创建令人印象深刻和…

如何训练全自动的安卓ai脚本(yolov5 为例) 实现游戏应用自动屏幕识别点击

必要资源 yolo训练方法&#xff0c;调参要点:https://docs.ultralytics.com/ncnn yolov5 示例:https://github.com/nihui/ncnn-android-yolov5在线模型转换&#xff1a;https://convertmodel.com/ 硬件配备 32G 内存, 2060 英伟达显卡 操作步骤 1.准备好数据集&#xff0c…

管理类联考——逻辑——知识篇——形式逻辑——五、联言选言——haimian

联言&选言 考点分析 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量6222111 联言 本质定义 联言命题是断定两种或两种以上事物情况同时存在的命题&#xff0c;用“A并且B”表示&#xff0c;逻辑符号为A ∧ B。 若“A ∧ B”为真…

为什么uCOSii的栈顶不再是0x20000000

我将FreeRTOS的工程文件移植到基于uCOSii系统中&#xff0c;发现两个系统生成的栈顶地址不一样&#xff0c;即使栈的大小相同&#xff0c;都是用Keil编译器&#xff0c;差别很大。见下图&#xff1a; Stack_Size EQU 0x00001000; 以前一直使用FreeRTOS系统&#xff0c…

简单易懂:Vue3框架三天速成(一)

前言&#xff1a;学习Vue框架首先需要具备基本的HTML5、CSS3、JavaScript基础&#xff0c;了解基本概念以及用法再来学习Vue会事半功倍&#xff01; 一、初识Vue Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。Vue 只关注视图层&a…

【服务器数据恢复】raid5故障导致LUN无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由数块SAS硬盘组建的RAID5阵列&#xff0c;阵列中有1块热备盘&#xff0c;上层部署OA以及Oracle数据库。 服务器故障&#xff1a; 该磁盘阵列中有2块硬盘出现故障先后离线&#xff0c;RAID5阵列瘫痪&#xff0c;上层LUN无法…

使用记事本编写第一个GO程序

开发环境&#xff1a; go1.18.3 记事本 先来看一下要编写的第一个hello,world Go程序 package main import "fmt"func main() {/* this is my first Go program*/fmt.Println("hello,world") } 第一行代码 package main定义了域名&#xff0c;你必须在源文…

设计模式->观察者设计模式和订阅者发布者设计模式的区别

设计模式->观察者设计模式和订阅者发布者设计模式的区别 一、先复习一下观察者设计模式的相关定义,优点,以及缺点1.定义观察者模式的三个典型例子 2.优点3.缺点4.观察者设计模式的主要角色5.代码举例完整代码 二、回答问题:观察者设计模式和订阅者发布者设计模式的区别 一、…

【Java-SpringBoot+Vue+MySql】项目开发综合—经验总结

目录 框架&#xff1a; 编程思维&#xff1a; MVC架构: 前端——组件式开发 开发思路梳理&#xff1a; 后端—— 前端—— 效果图 信息列表&#xff1a; 修改用户​编辑 新增用户 删除用户 数据清空 批量上传 框架&#xff1a; 后端&#xff1a;JAVA-SpringBoot2.6、包管理器M…

13.RocketMQ之消息的存储与发送

1. 消息存储 1.1 消息存储 分布式队列因为有高可靠性的要求&#xff0c;所以数据要进行持久化存储。 消息生成者发送消息Broker收到消息&#xff0c;将消息进行持久化&#xff0c;在存储中新增一条记录返回ACK给生产者Broker消息给对应的消费者&#xff0c;然后等待消费者返回A…

Keras-4-深度学习用于计算机视觉-猫狗数据集训练卷积网络

0. 说明&#xff1a; 本篇学习记录主要包括&#xff1a;《Python深度学习》的第5章&#xff08;深度学习用于计算机视觉&#xff09;的第2节&#xff08;在小型数据集上从头开始训练一个卷积神经网络&#xff09;内容。 相关知识点&#xff1a; 从头训练卷积网络&#xff1b…

AI 绘画用 Stable Diffusion 图生图局部重绘功能给美女换装(这是我能看的嘛)

昨天带大家一起装好了 Stable Diffusion 的环境&#xff0c;今天就来带大家一起体验一下 Stable Diffusion 的局部重绘功能。 没装好环境的可以看上一篇&#xff1a;AI 绘画基于 Kaggle 10 分钟搭建 Stable Diffusion&#xff08;保姆级教程&#xff09; Stable Diffusion 的…

可重入,可打断,公平锁,条件变量原理解读

目录 可重入原理 可打断原理 不可打断模式 可打断模式 公平锁实现原理 条件变量实现原理 await 流程 signal 流程 可重入原理 什么是可重入&#xff1a;当线程请求一个由其它线程持有的对象锁时&#xff0c;该线程会阻塞&#xff0c;而当线程请求由自己持有的对象锁…

阿里刚换帅,京东忙换将:新时代号角吹响

6月26日早间&#xff0c;京东物流在港交所发布公告称&#xff0c;京东物流CEO余睿因个人身体原因辞任执行董事、首席执行官及授权代表&#xff0c;原京东产发CEO胡伟将担任京东物流CEO。 同时&#xff0c;据《科创板日报》报道&#xff0c;京东集团将新成立创新零售部&#xf…