- 博客(55)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 万字长文,k8s 之父带你精通 stateful 源码
另外,当 StatefulSet.Spec.VolumeClaimTemplates中定义了pod所需的pvc时,StatefulSet controller在创建pod时,会同时创建对应的pvc出来,但删除pod时,不会做对应pvc的删除操作,这些pvc需要人工额外做删除操作。有状态的pod与无状态的pod不一样的是,有状态的pod有时候需要通过其主机名来定位,而无状态的不需要,因为无状态的pod每个都是一样的,随机选一个就行,但对于有状态的来说,每一个pod都不一样,通常希望操作的是特定的某一个。
2025-01-16 10:37:46
1041
原创 k8s之父带你阅读 replicaset 源码【2w字】
replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资源发生变化时会触发 replicaset controller 对相应的replicaset对象进行调谐操作,从而完成replicaset期望副本数的调谐,当实际pod的数量未达到预期时创建pod,当实际pod的数量超过预期时删除pod。
2025-01-14 09:24:39
639
原创 万字长文,k8s之父带你阅读 deployment 源码
新 Pod 准备就绪后,可以继续缩容旧有的 ReplicaSet,然后对新的 ReplicaSet 扩容, 确保在更新期间可用的 Pod 总数在任何时候都至少为所需的 Pod 个数的 70%。(3)当最新的replicaset对象的副本数与deployment期望副本数不一致,旧的replicaset对象中有副本数不为0的,且deployment的更新策略为滚动更新,说明deployment可能正在滚动更新,则按一定的比例对新旧replicaset进行扩缩容操作,保证滚动更新的稳定性。
2025-01-14 08:59:41
898
原创 万字长文,k8s之父带你精通 deployment 源码
Deployment Controller 是 Kube-Controller-Manager 中最常用的 Controller 之一管理 Deployment 资源。而 Deployment 的本质就是通过管理 ReplicaSet 和 Pod 在 Kubernetes 集群中部署Workload。
2025-01-14 08:20:57
749
原创 k8s源码分析之垃圾回收控制器
一般来说,垃圾回收(GC)就是从系统中删除不再使用的对象,并释放分配给它们的计算资源。GC 存在于所有的高级编程语言中,较低级的编程语言通过系统库实现 GC。终止的 Pod已完成的 Job附属的主对象已经不存在的对象未使用的容器和容器镜像StorageClass 回收策略为 Delete 的 PV 卷过期的证书签名。
2025-01-13 13:28:41
1298
原创 k8s 源码分析之 daemonset控制器
确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
2025-01-13 13:27:42
1392
原创 2024 中国开源年度报告
第一部分总体宏观洞篇,通过对基础事件、活跃仓库、活跃用户、开源许可证和编程语言等方面的深入分析,揭示中国在全球开源生态中的全貌。第二部分OpenRank 排行榜篇,提供了全球和中国各领域开源项目、企业、基金会、开发者以及协作机器人的排名,为业界提供全面系统的 OpenRank 指标信息服务。第三和第四部分为企业洞察篇和基金会洞察篇,通过演变图和趋势分析,呈现了全球和中国企业、基金会在开源领域中的演化。第五部分技术领域洞察篇。
2025-01-04 15:19:33
2265
原创 2024 中国开源年度报告
第一部分总体宏观洞篇,通过对基础事件、活跃仓库、活跃用户、开源许可证和编程语言等方面的深入分析,揭示中国在全球开源生态中的全貌。第二部分OpenRank 排行榜篇,提供了全球和中国各领域开源项目、企业、基金会、开发者以及协作机器人的排名,为业界提供全面系统的 OpenRank 指标信息服务。第三和第四部分为企业洞察篇和基金会洞察篇,通过演变图和趋势分析,呈现了全球和中国企业、基金会在开源领域中的演化。第五部分技术领域洞察篇。
2025-01-04 15:16:46
1579
1
原创 k8s 源码client-go 系列 sharedProcessor
run() 和 pop() 是 processorListener 的两个最核心的函数,processorListener 就是实现了事件的缓冲和处理,在没有事件的时候可以阻塞处理器,当事件较多是可以把事件缓冲起来,实现了事件分发器与处理器的异步处理。收到变更的事件后, 遍历通知给所有的 listener 监听器, 这里的通知是把事件写到 listener 的 addCh 通道.有些人可能理解不了pop的两种case,我这里和群里的兄弟们讨论了下,得出结果。简化的实现原理架构图.本文由博客一文多发平台。
2025-01-04 13:52:03
1057
原创 k8s 源码 client-go 系列之 workqueue
排队指数算法将相同元素的排队数作为指数,排队数增大,速率限制呈指数级增长,但其最大值不会超过maxDelay。
2025-01-04 13:27:24
908
原创 k8s源码 client-go 系列之 DeltaFIFO
我是南哥,分享k8s源码心得,想系统学可以加 mkjnnmDeltaFIFO本质上是一个先进先出的队列,有数据的生产者和消费者,其中生产者是Reflector调用的Add方法,消费者是Controller调用的Pop方法。从 DeltaFIFO 数据结构来看,里头存储着 map[obj key]Deltas 和 object queue。Delta 装有对象数据及对象的变化类型。其中 DeltaType 就是资源变化的类型, 比如 Add、Update 等;
2025-01-04 13:06:07
926
原创 k8s 源码client-go 系列之 indexer
Indexer 是一个索引缓存,用于缓存 Reflector 从 Kube-apiserver List/Watch到的资源对象,可以理解是一个带索引查询的内存型存储。下面通过走读源码的形式来了解 Indexer 的原理,本篇基于 k8s.io/client-go v0.30.0 源码讲解。
2025-01-04 13:03:41
575
原创 k8s源码 client-go 系列之 reflector
/ name 标识这个反射器的名称,默认为 文件:行数(比如reflector.go:125)= "" && RV!
2025-01-04 11:16:59
996
原创 02-operator 二次开发背景
通用型 controller: 这种场景和 kubernetes 内置的类似,主要解决特定通用类型应用的管理Operator: 该场景用于解决一个特定应用的自动化管理通用型 controller 往往是 kubernetes 平台侧用户,如各大云厂商和 kubernetes 服务提供商,Operator 则是各种软件服务提供商, 他们设计时面向单一应用,很多开源的应用的 operator 可以在 operator hub 中获取。
2024-07-27 15:22:14
471
原创 01-controller-runtime
Operator 是 Kubernetes 用来拓展其 API 的一种开发范式(Pattern),其核心是定义若干的自定义资源及其对应的资源控制器,当这些资源发生变化时其对应的控制器对变化进行调解(Reconcile),最终使得实际状态与预期状态达成一致。K8s-sigs 推出的是一个用于构建 Operator 应用的框架,和一样都依赖了,提供了高级 API 和抽象,让开发者更直观地编写操作逻辑,并提供用于快速启动新项目的脚手架和代码生成工具。
2024-07-27 15:21:21
685
原创 02- 当你运行 kubectl create deployment 命令时发生了什么
几秒后,你将看到三个 Nginx Pod 分布在集群工作节点上。这相当神奇,但它背后究竟发生了什么?几秒后,你将看到三个 Nginx Pod 分布在集群工作节点上。这相当神奇,但它背后究竟发生了什么?Kubernetes 是一个神奇的框架,它通过用户友好(user-friendly)的 API 处理跨基础架构的 Workload 部署。通过简单的抽象隐藏了背后的复杂性。但是,为了充分理解它为我们提供的价值,我们需要理解它的原理。
2024-07-27 15:17:56
677
原创 01-调试开发k8s
虽然通过 Docker 构建可能更简单,但有时在本地电脑工作进行开发更好。下面的详细信息概述了在 Linux、Windows 和 macOS 上构建的硬件和软件要求。学习 k8s 源码的第一步就是在本机搭建开发环境,下面我会教大家如何搭建,我的本机为 mac 电脑 m1 芯片, 参考链接如下。官方 release 是使用 Docker 容器构建的。请注意,所有脚本都必须从 Kubernetes 根目录运行。执行完毕后你在项目下 _output 目录下能够看到编译好的二进制。
2024-07-27 15:16:50
460
原创 4.12 statefulset controller分析
statefulset是Kubernetes提供的管理有状态应用的对象,而deployment用于管理无状态应用。有状态的pod与无状态的pod不一样的是,有状态的pod有时候需要通过其主机名来定位,而无状态的不需要,因为无状态的pod每个都是一样的,随机选一个就行,但对于有状态的来说,每一个pod都不一样,通常希望操作的是特定的某一个。statefulset适用于需要以下特点的应用:(1)稳定的网络标志(主机名):Pod重新调度后其PodName和HostName不变;
2024-07-27 15:12:32
518
原创 4.11 endpointSlice controller
总的来说,跟其他的控制器的逻辑是差不多的,都是先监听相关资源的事件,然后调谐。从上面的代码我们也不难看出,endpointslice 有个特点就是,默认情况下,每个 slice 都是满 100 个条目就 new 一个新的切片,把每个切片的容量都控制在 100 个条目以内。我们看完 endpointslice ,该控制器具有新增,更新和删除 slices 的功能,但是我们还发现源码里头还有 endpointslicemirroring 控制器。
2024-07-27 15:11:14
530
原创 4.10 endpoint controller
EndpointSubset 是一组具有公共端口集的地址,扩展的端点集是 Addresses (Pod IP 地址) 和 Ports (Service 名称和端口号) 的笛卡尔积。控制器对象的初始化工作,并返回一个实例化对象,控制器对象同时订阅了 Service, Pod, EndPoint 三种资源的变更事件。控制器操作的核心方法,通过方法的命名,可以知道 EndPoint 主要关注的对象是 Service。控制器对象,该对象是实现 Endpoints 功能的核心对象。对象,然后进行对应的操作。
2024-07-27 15:09:10
440
原创 4.9 Kubernetes Service
Service 被抽象为一组或多组 Pod 的静态 IP 地址 (也可以将 Service 看作是一个代理),任何到达 Service 的请求都会被转发到属于该服务背后的某个 Pod 中的应用。与 Service 紧密关联的两个概念是 Pod 和 EndPoint, 其中,Pod 是 Kubernetes 中应用运行的最小单位,而 EndPoint 是 Service 指向的实际地址,定义了 Service 所指向的具体 Pod 的 IP 地址和端口。
2024-07-27 15:08:07
349
原创 4.8 replicaset controller 03
expectations记录了replicaset对象在某一次调谐中期望创建/删除的pod数量,pod创建/删除完成后,该期望数会相应的减少,当期望创建/删除的pod数量小于等于0时,说明上一次调谐中期望创建/删除的pod数量已经达到,调用方法返回true。根据前面的分析,在replicaset controller对replicaset对象进行调谐操作时,首先会调用方法,返回true且replicaset对象的deletetimestamp为空,才会调用。
2024-07-26 14:38:10
1023
原创 4.7 replicaset controller 02
想系统学习k8s源码,云原生的可以加:mkjnnmreplicaset controller分析分为3大块进行,分别是:(1)replicaset controller初始化和启动分析;(2)replicaset controller核心处理逻辑分析;(3)replicaset controller expectations机制分析。本篇进行replicaset controller核心处理逻辑分析。
2024-07-26 14:34:55
1915
原创 4.6 replicaset controller
replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资源发生变化时会触发 replicaset controller 对相应的replicaset对象进行调谐操作,从而完成replicaset期望副本数的调谐,当实际pod的数量未达到预期时创建pod,当实际pod的数量超过预期时删除pod。
2024-07-26 14:32:17
893
原创 4.5 deployment controller 03
想系统学习k8s源码,云原生的可以加:mkjnnm下面来分析一下dc.sync方法,以下两种情况下,都会调用dc.sync,然后直接return:(1)判断deployment的属性值是否为true,是则调用dc.sync做处理,调用完成后直接return;(2)先调用,检查deployment对象是否处于scaling状态,是则调用dc.sync做处理,调用完成后直接return。deployment的为true时代表该deployment处于暂停状态,false则代表处于正常状态。
2024-07-26 14:30:16
863
原创 4.4 deployment controller 02
对集群中与deployment对象相同命名空间下的所有replicaset对象做处理,若发现匹配但没有关联 deployment 的 replicaset 则通过设置 ownerReferences 字段与 deployment 关联,已关联但不匹配的则删除对应的 ownerReferences,最后获取返回集群中与 Deployment 关联匹配的 ReplicaSet对象列表;,根据deployment 所属的 replicaset 对象,重新计算出 deployment 对象的。
2024-07-26 14:20:48
1065
原创 4.3 deployment controller 01
想系统学习k8s源码,云原生的可以加:mkjnnmDeployment Controller 是 Kube-Controller-Manager 中最常用的 Controller 之一管理 Deployment 资源。而 Deployment 的本质就是通过管理 ReplicaSet 和 Pod 在 Kubernetes 集群中部署Workload。
2024-07-26 14:18:37
821
原创 05-Indexer
想系统学习k8s源码,云原生的可以加:mkjnnmIndexer 是一个索引缓存,用于缓存 Reflector 从 Kube-apiserver List/Watch到的资源对象,可以理解是一个带索引查询的内存型存储。下面通过走读源码的形式来了解 Indexer 的原理,本篇基于 k8s.io/client-go v0.30.0 源码讲解。
2024-07-25 16:25:57
596
原创 03-写一个控制器
想系统学习k8s源码,云原生的可以加:mkjnnminformer 设计之初是为了更好的写 controller,本章我们来手写一个 controller,下图是官方推荐的编程模式:2.给控制器添加Run方法启动控制器前要先启动 informer 并等待同步完成,然后起携程调用 runworker 方法。3.实现 runworker方法在 runWorker 方法中,我们一直调用 processNextItem 方法,这个方法会从 queue 中取出资源的 key,调用 syncToStdout 处
2024-07-25 16:14:20
448
原创 06-DeltaFIFO
想系统学习k8s源码,云原生的可以加:mkjnnmDeltaFIFO本质上是一个先进先出的队列,有数据的生产者和消费者,其中生产者是Reflector调用的Add方法,消费者是Controller调用的Pop方法。从 DeltaFIFO 数据结构来看,里头存储着 map[obj key]Deltas 和 object queue。Delta 装有对象数据及对象的变化类型。其中 DeltaType 就是资源变化的类型, 比如 Add、Update 等;
2024-07-25 14:21:04
676
原创 01-client-go
v1.x.y0ps: k8s 发布v1.30.0 版本时,client-go 会同步发布两个版本 v0.30.0 (推荐使用)和 kubernetes-1.30.0。
2024-07-25 14:10:52
2203
原创 replicaset controller 源码分析一
replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资源发生变化时会触发 replicaset controller 对相应的replicaset对象进行调谐操作,从而完成replicaset期望副本数的调谐,当实际pod的数量未达到预期时创建pod,当实际pod的数量超过预期时删除pod。
2024-07-17 18:55:53
1990
1
原创 chrome 插件开发-01
现在,当单击扩展的操作图标(工具栏图标)时,扩展会显示一个弹出窗口。键,用于声明 Chrome 应用作扩展程序操作图标的图片,以及单击扩展程序的操作图标时要在弹出窗口中显示的 HTML 页面。您将创建一个“Hello World”示例,在本地加载扩展,查找日志,并浏览其他建议。或者,点击 Chrome 菜单,将鼠标悬停在“更多工具”上,然后选择“扩展程序”。当用户单击扩展工具栏图标时,此扩展将显示“Hello Extensions”。或者,单击“扩展”菜单拼图按钮,然后选择菜单底部的“管理扩展”。
2023-12-11 16:59:38
180
模板函数冒泡排序的形参size是什么
2015-04-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅