![](https://img-blog.csdnimg.cn/direct/710b94dad9bf4b2d9f8e4448c614fbc1.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kubernetes源码阅读
文章平均质量分 92
Kubernetes源码阅读
华为云计算搬砖工
这个作者很懒,什么都没留下…
展开
-
13. EventBroadcaster 事件管理器
Kubernetes 系统以 Pod 资源为核心,Deployment、StatefulSet、ReplicaSet、DaemonSet、CronJob 等,最终都会创建出 Pod。因此 Kubernetes 事件也是围绕 Pod 进行的,在 Pod 生命周期内的关键步骤中都会产生事件消息。原创 2024-02-29 13:02:15 · 993 阅读 · 0 评论 -
12. WorkQueue(工作队列)
如图所示,在并发场景下,假设 goroutine A 通过 Get 方法获取 1 元素,1 元素被添加到 processing 字段中,同一时间,goroutine B 通过 Add 方法插入另一个 1 元素,此时在 processing 字段中已经存在相同的元素,所以后面的 1 元素并不会被直接添加到 queue 字段中,当前 FIFO 队列中的 dirty 字段中存有 1、2、3 元素,processing 字段存有 1 元素。限速队列利用延迟队列的特性,延迟多个相同元素的插入时间,达到限速目的;原创 2024-02-28 15:31:58 · 978 阅读 · 0 评论 -
11. Informer 机制总结
DeltaFIFO 可以分开理解,FIFO 是一个先进先出的队列,它拥有队列操作的基本方法,例如 Add、Update、Delete、List、Pop、Close等,而 Delta 是一个资源对象存储,它可以保存资源对象的操作类型,例如 Added(添加)操作类型、Updated(更新)操作类型、Deleted(删除)操作类型、Sync(同步)操作类型等。(1)r.listerWatcher.List 用于获取资源下的所有对象的数据,例如,获取所有 Pod 的资源数据。答案就是 Informer 机制。原创 2024-02-28 15:28:15 · 1256 阅读 · 0 评论 -
10. informer源码分析-Indexer源码分析
Indexer 中有 informer 维护的指定资源对象的相对于 etcd 数据的一份本地内存缓存,可通过该缓存获取资源对象,以减少对 apiserver、对etcd 的请求压力。...informer 所维护的缓存依赖于 threadSafeMap 结构体中的 items 属性,其本质上是一个用 map 构建的键值对,资源对象都存在 items 这个 map 中,key 为资源对象的 namespace/name 组成,value 为资源对象本身,这些构成了 informer 的本地缓存。原创 2024-02-27 20:51:19 · 1059 阅读 · 1 评论 -
9. informer源码分析-Controller&Processor源码分析
1.controller 与 Processor 概述ControllerController 从 DeltaFIFO 中 pop Deltas 出来处理,根据对象的变化更新 Indexer 本地缓存,并通知 Processor 相关对象有变化事件发生。ProcessorProcessor 根据 Controller 的通知,即根据对象的变化事件类型,调用相应的 ResourceEventHandler 来处理对象的变化。先通过一张 informer 概要架构图看一下 Controller&原创 2024-02-27 20:25:33 · 1164 阅读 · 0 评论 -
8. informer源码分析-DeltaFIFO源码分析
先从名字上来看,DeltaFIFO,首先它是一个FIFO,也就是一个先进先出的队列,而 Delta 代表变化的资源对象,其包含资源对象数据本身及其变化类型。......具体来说,DeltaFIFO 存储着以及object key的 queue,Delta 装有对象数据及对象的变化类型。输入输出方面,Reflector 负责 DeltaFIFO 的输入,Controller 负责处理 DeltaFIFO 的输出。原创 2024-02-27 20:02:32 · 871 阅读 · 0 评论 -
7. informer源码分析-Reflector源码分析
Reflector 从 kube-apiserver 中 list&watch 资源对象,然后将对象的变化包装成 Delta 并将其丢到 DeltaFIFO 中。简单点来说,就是将 Etcd 的对象及其变化反射到 DeltaFIFO 中。原创 2024-02-27 20:00:44 · 1050 阅读 · 0 评论 -
6. informer源码分析-初始化与启动分析
return...上一节有列举了informer的使用代码,注意看到示例代码中的下面这段代码,做了informer初始化与启动,其中包括:(1)informers.NewSharedInformerFactory:初始化informer factory;(2)podInformer.Informer:初始化pod informer;(3)factory.Start:启动informer factory;原创 2024-02-27 19:57:02 · 637 阅读 · 0 评论 -
5. informer源码分析-概要分析
我们都知道可以使用 k8s 的 Clientset 来获取所有的原生资源对象,那么怎么能持续的获取集群的所有资源对象,或监听集群的资源对象数据的变化呢?这里不需要轮询去不断执行 List 操作,而是调用 Watch 接口,即可监听资源对象的变化,当资源对象发生变化,客户端即可通过 Watch 接口收到资源对象的变化。Watch 接口虽然可以直接使用,但一般情况下很少直接使用,因为往往由于集群中的资源较多,我们需要自己在客户端去维护一套缓存,而这个维护成本比较大。原创 2024-02-27 19:53:15 · 1543 阅读 · 0 评论 -
4. client-go 编程式交互
Kubernetes 系统使用 client-go 作为 Go 语言的官方编程式交互客户端库,提供对 Kubernetes API Server 服务的交互访问。Kubernetes 的源码中已经集成了 client-go 的源码,无须单独下载。client-go 源码路径为 。开发者经常使用 client-go 基于 Kubernetes 做二次开发,所以 client-go 是开发者应熟练掌握的必会技能。client-go 的代码库已经集成到 Kubernetes 源码中了,无须考虑版本兼容性问题,源码原创 2024-02-27 19:50:52 · 963 阅读 · 0 评论 -
3. kubectl 命令行交互
在维护 Kubernetes 系统集群时,kubectl 应该是最常用的工具之一。从 Kubernetes 架构设计的角度看,kubectl 工具是 Kubernetes API Server 的客户端。它的主要工作是向 Kubernetes API Server 发起 HTTP 请求。Kubernetes 是一个完全以资源为中心的系统,而 kubectl 会通过发起 HTTP 请求来操纵这些资源,以控制 Kubernetes 系统集群。原创 2024-02-27 19:48:15 · 1126 阅读 · 0 评论 -
2. Kubernetes 核心数据结构
Kubernetes 资源代码定义在pkg/apis目录下,同一资源对应着内部版本和外部版本,内部版本和外部版本资源代码结构并不相同。资源的内部版本定义了所支持的资源类型(types.go)、资源验证方法(validation.go)、资源注册至资源注册表的方法(install/install.go)等。而资源的外部版本定义了资源的转换方法(conversion.go)、资源的默认值(defaults.go)等。原创 2024-02-27 19:39:20 · 1040 阅读 · 0 评论 -
1. 使用 vs-code 来阅读源码
地址:https://github.com/kubernetes/kubernetes/releases/tag/v1.25.15。目录,这时会提示我们下载 go 库,按照提示下载按照即可。然后 kubernetes 本身是支持 gomod 的,但源码这里提供了所有的依赖在。接着重启 vscode,这时会提醒我们下载更多依赖库,按照提示下载按照即可。我的电脑 -> 属性 -> 高级系统设置 -> 环境变量,添加如下形式。目录下,可以将此目录内的文件复制到。使用 vscode 打开。目录,注意目录层次,原创 2024-02-27 19:30:46 · 583 阅读 · 0 评论