- 博客(63)
- 收藏
- 关注
原创 Istio中的全局限流方案
在k8s网格(istio)环境中, 可以通过创建的方式来配置限流。在istio本地限流的细节这里不再赘述, 主要讲解全局限流的配置方式。
2024-05-10 20:03:23 977
原创 以无侵方式实现Deployment原地升级
本文将展示如何以无侵、原生的方式实现Deployment原地升级。在文章末尾会提供shell脚本供大家参考。本文的原地升级仅指镜像更新本篇kubernetes版本为v1.27.3。原地升级的概念以及OpenKruisekubernetes项目地址:controller命令main入口: cmd/kube-controller-manager/controller-manager.gocontroller相关代码目录: pkg/controller。
2024-05-10 20:00:50 1074
原创 如何实现一个CSI?源码解析csi-nfs
/ 对于块设备的挂载与卸载// 文件系统的挂载与卸载// 状态获取// 扩容// 容量获取// 基本信息// grpc服务会调用此具体实现// 挂载指定路径,不可包含敏感项// 与mount一致, 但是可以包含敏感项(如密码)并不会被记录// 与MountSensitive一致,但禁用systemd// 与MountSensitiveWithoutSystemd一致, 但包含附加选项// 卸载// 返回挂载点列表。
2024-02-28 11:53:38 1249
原创 字符串与数字转换的方式对比
可以看到, ascii值计算的方式效率最高。所以在明确传入参数的格式情况下, 用这种方式是最优的。这是一种将字符转换为int64的方式, 优点是可以将多种格式(比如二进制)的字符串转换成int64。源码, 发现它为了兼容多种进制格式的转换,进行多次计算,与字符串判断,所以效率最低。与ParseInt(s, 10, 0)行为一致, 返回int。而我们直接转换的方式快的原因其实是舍弃了完整的逻辑判断。假设我们要将以下字符转换为数字。计算的方式, 并且逻辑更完善。必须确定字符串为可转换的格式。
2024-02-28 11:49:58 474
原创 从源码解析Kruise(K8S)原地升级原理
原地升级的原理比较简单, 主要还是利用了pod自身的特性和kubelet的拉起功能。kruise中仅对自己的支持原地升级, 其实也可以扩展到对原生资源的支持(如一开始的测试),但会存在一些问题和限制(如测试二中deployment的镜像版本不会发生改变)。
2024-02-21 14:53:08 1411
原创 如何实现一个K8S DevicePlugin?
k8s允许限制容器对资源的使用,比如CPU和内存,并以此作为调度的依据。当其他非官方支持的设备类型需要参与到k8s的工作流程中时,就需要实现一个。Kubernetes提供了一个设备插件框架,你可以用它来将系统硬件资源发布到Kubelet。供应商可以实现设备插件,由你手动部署或作为 DaemonSet 来部署,而不必定制 Kubernetes 本身的代码。目标设备包括 GPU、高性能 NIC、FPGA、 InfiniBand 适配器以及其他类似的、可能需要特定于供应商的初始化和设置的计算资源。
2024-02-21 14:50:53 1789
原创 一些大语言模型(LLM)相关的开源项目
更多文章访问: https://www.cyisme.top因为站内限制问题,有些图片无法显示,导致阅读体验较差,可以访问原文:《一些大语言模型(LLM)相关的开源项目》一键免费部署私人 ChatGPT 网页应用,支持 GPT3, GPT4 & Gemini Pro 模型。项目地址: https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/tree/main支持多种大模型, 国内的阿里通义千问、百度文心一言等都可以接入。并且有独立的管理页面,支持令牌管理、兑换
2024-02-01 19:11:52 2162
原创 快速理解容器网络原理
我们知道, 容器是依赖于linux系统中的cgroup与namespace机制。 所以要了解容器网络要先知道怎么在宿主中管理网络命名空间(namespace)。linux中提供了强大的命令可以管理网络。有了ns之后, 我们就可以实现网络隔离了。那么如何打通不同ns间的壁垒(不同容器间的通讯), 实现通讯呢?那就需要为它们分配网络设备了,这个创建出的网络设备,被
2024-02-01 18:55:31 1038
原创 golang中的字符串拼接
在可预知拼接结果长度的情况下, 使用这样的方式来预分配内存是最合适的。其他情况下, 使用buffer都是可以的。
2024-01-11 15:05:51 1066 1
原创 Volcano Scheduler(Plugins&Actions)调度器源码解析
本文从源码的角度分析Volcano Scheduler中Actions和Plugins相关功能的实现。本篇Volcano版本为v1.8.0。Volcano项目地址:controller命令main入口: cmd/scheduler/main.gocontroller相关代码目录: pkg/schedulerVolcano的调度过程可以查看感觉volcano中插件的方法类型实在太多了, 对于开发者学习成本很大。
2024-01-11 14:14:39 1125
原创 小工具分享:脚本执行工具Executor
日常工作中可能有一些按顺序执行脚本的需求, 出现错误时可能还需要回滚, 这时候就需要一个工具来帮助我们完成这些工作。Executor就是这样一个工具。下面和大家分享一下这个小工具的实现及使用。工具项目地址:工具目录:/pkg/scripts。
2024-01-09 18:12:56 1086
原创 Volcano Scheduler调度器源码解析
本文从源码的角度分析Volcano Scheduler相关功能的实现。本篇Volcano版本为v1.8.0。Volcano项目地址:controller命令main入口: cmd/scheduler/main.gocontroller相关代码目录: pkg/scheduler更多文章访问:看过我之前文章的朋友应该已经大致了解了k8s原生调度器的运行逻辑了。大致运行流程:fill:#333;color:#333;color:#333;fill:none;
2024-01-09 18:11:28 1654
原创 Volcano Controller控制器源码解析
本文从源码的角度分析Volcano Controller相关功能的实现。本篇Volcano版本为v1.8.0。Volcano项目地址:controller命令main入口: cmd/controller-manager/main.gocontroller相关代码目录: pkg/controllers更多文章访问:整体实现并不复杂, 而且项目比较简洁、风格一致(与k8s controller代码风格也一致)。可以作为学习开发k8s controller的一个参考。
2024-01-04 17:08:33 1253
原创 几个有趣的go服务框架
开篇先吐槽几句~我个人有一些习惯, 比如在服务设计时会考虑的比较长远,会考虑到到未来的扩展等等…然后程序设计的抽象成度就会比较高,各个模块之间解耦,但这样往往就会带来程序的复杂度提升。这其实在一些公司里面是不被喜欢的, 因为这可能会延长开发周期(主要的), 增加开发成本, 以及其他同学接手项目是的学习成本。interface多了确实对一个初接手项目的同学不太友好,找起来对应的实现真的是太麻烦了, 大家应该都有这个感觉吧?
2024-01-04 17:03:50 1327
原创 endpoints控制器源码解析
本文从源码的角度分析KubeController Attachdetach相关功能的实现。本篇kubernetes版本为v1.27.3。
2023-12-28 18:30:21 410
原创 GC控制器(Garbagecollector)源码解析
在执行删除资源时, 不同的删除策略会使资源在finalizers中增加不同的字段, 从而触发不同的处理逻辑。想要删除一个资源需要满足几个条件:清空关联关系无ownerfinalizers为空不同的删除策略决定了上述几个条件具体执行的方式, 但最终需要满足的条件是一致。删除是按固定的逻辑执行的,整个流程可以理解为递归的处理方式。
2023-12-28 17:05:55 1134
原创 源码分析KubeController Attachdetach功能实现
源码文件路径: pkg/controller/volume/attachdetach/attach_detach_controller.go// type attachDetachController 结构体定义// 省略informer相关定义// 主要监听pvc/pv/pod/node/csinode/csidriver/volumeattachment对象//// 云厂商提供的接口// 主要负责的volumeplugin的管理// 包含intree以及outtree的桥接转换。
2023-12-21 14:50:15 994
原创 从源码解析KubeScheduler Framework插件
Framework是的核心组件,它管理了资源分配和调度策略等相关插件。这些插件联合起来就实现了的调度功能。scheduler在node列表中取出一个node,然后依次调用"参与调度的插件"的PreFilterFilter等方法,如果所有插件都返回成功,则调度成功,否则调度失败。PrePreEnqueuePlugin 在进入到调度队列之前运行的插件,他将判断pod是否可以被调度。PreFilterPlugin 过滤前的预处理, 根据pod中已知的信息,准备后续处理需要的数据。
2023-12-15 14:41:43 1111
原创 从源码解析KubeScheduler调度过程
scheduler通过informer监听pod和node的变化, 并将pod添加到中。中有三个队列,activeQ。activeQ中的pod可以被调度,中的pod不可被调度(未调度),中的pod是调度失败的pod。方法中,会从activeQ中取出pod,由调用framework运行插件的筛选与评分函数, 最终选出最优的节点,由将pod绑定到节点上。scheduler的调度过程是单线程的, 通过的阻塞Pop实现, 保证了调度的顺序性。通过node提名机制,实现pod优先调度到指定的节点上。
2023-12-11 17:21:59 209
原创 Flannel源码解析
host-gw模式性能最好,因为不需要经过vxlan设备,不需要封装数据。但是局限性也最大,只能在二层网络中使用。vxlan模式通过tun/tap设备,封装数据,然后通过udp发送到目标节点,可以在三层网络中使用。使用场景更为广泛。当开启isMasq时, 会在节点上添加iptables转发规则,将pod的ip地址隐藏,只暴露node的ip地址。flannel本身负责跨设备间的通信, 同设备间通信通过bridge、namespce等方式实现。
2023-12-05 16:19:58 286
原创 从源码解析Containerd容器启动流程
task是containerd中真正运行的对象,它包含了容器的所有信息,如rootfs、namespace、进程等。创建task时,会启动shim进程。shim进程是一个短暂的进程,它的生命周期与容器一致。它的主要作用是与交互,完成容器的创建。容器的网络配置是在task创建之后,由ctr调用cni插件完成的。
2023-11-29 18:10:46 540
原创 Containerd Container管理功能解析
containerd的容器管理功能,主要是通过grpc调用containerd的image和container服务实现的。container创建时会获取镜像快照信息(解压/挂载),命令行参数会转换成oci配置,最终生成container的基础信息。container的创建动作仅生成数据,用于后续的container start(task)操作。
2023-11-27 16:33:34 310
原创 containerd Snapshots功能解析
本文以 ctr i pull命令为例,分析containerd的snapshot 创建 相关的功能。
2023-11-23 18:07:23 538
原创 k8s client-go源码解析之informer三
本文内容为学习笔记,内容为个人见解,不保证准确性,但欢迎大家讨论何指教。觉得文章不错请关注跟博客及本篇介绍DeltaFIFO及indexer。
2023-03-11 22:11:06 483
原创 k8s client-go源码解析之informer 二
informer中controller负责数据控制,包括:获取数据、数据处理、数据分发。controllerReflector负责获取数据并写入到队列。数据获取时会携带上一次的版本号,这样就可以获取到版本号之后的数据。取出数据,写入到indexer中,同时将数据分发到processor中。processor中会根据动作类型,OnAddOnUpdateOnDelete,执行对应的事件处理函数。
2023-03-08 21:48:01 485
原创 k8s client-go源码解析之informer 一
k8 s client-go源码解析之informer。本篇为先导篇, 介绍informer的入口工厂函数。
2023-03-07 09:55:39 542
原创 解决k8s环境harbor无法上传大镜像的问题
无法上传大镜像多半是ingress nginx 中超时限制和大小限制的原因。ingress nginx 安装的namespace 一般为 ingress-nginx执行kubectl get cm -n ingress-nginxNAME DATA AGEcustom-client-headers 5 101dcustom-headers
2021-07-20 18:28:54 2196 1
原创 golang中的切片传递
golang中的切片传递当前有一个函数和一个结构体定义type s struct { A int}func testFunc(l []s) { fmt.Printf("in testFunc: %p\n",l)}#####测试 1我们首先传递一个切片,并打印他的内存地址func TestA(t *testing.T) { xs := s{A: 10} xs1 := s{A: 20} l := []s{xs,xs1} fmt.Printf("%p\n",l) testFu
2021-07-05 13:41:07 1580 2
原创 详解golang GMP(一)
最近在研究go语言中,高性能缓存的实现,发现需要考虑到很多因素。(go语言中groupcache缓存库的源码解析可以看这一篇golang中cache组件的使用之groupcache(三))这片文章主要讲解 golang 中的GMP。开篇提到GMP, 我们需要从最基础的进程、线程讲起。网络上有很多进程线程的文章,本篇另辟蹊径,用故事举例的方式帮助大家理解。本篇文章有不当之处希望大家可以指出。进程、线程并发与并行大家都知道,在特定场景下(比如向1w台服务器发送指令),使用多线程或多进程会提升执行
2021-06-10 14:41:13 516
原创 golang中cache组件的使用之groupcache(三)
本篇主要解析groupcache源码中的关键部分, lru的定义以及如何做到同一个key只加载一次。缓存填充以及加载抑制的实现上篇有提到load函数的实现, 缓存填充的逻辑也体现在这里。groupcache尽量避免从源中获取数据,当本地数据缺失时会先从peer中获取,peer中命中则直接填充到本地,未命中才会从源中加载,这正是缓存填充的实现逻辑。而加载抑制,避免重复加载的功能是依靠 singleflight包实现的。这个包中主要有两个结构体:call用来存放获取结果(val)和错误(err),
2021-06-09 10:36:43 238 3
原创 golang中cache组件的使用之groupcache(二)
本篇主要解析groupcache源码。groupcache使用一个map类型的全局变量 groups存储所有的缓存组。初始化创建group时, 会添加一个冲突锁。作者预留了初始化函数callInitPeerServer,但是并为做实现。mu.Lock()defer mu.Unlock()initPeerServerOnce.Do(callInitPeerServer)使用 singleflight.Group保证同一key只获取一次,共享结果。这个函数后面解析。name 缓存组的名字ge
2021-06-09 09:56:20 325
原创 golang中cache组件的使用之groupcache(一)
golang中cache组件有很多, 比如groupcache、bigcache等。 本文介绍groupcache的使用。groupcache简介groupcache是memcache的作者开源的一个项目,在许多情况下,它是memcached的替代品。对比memcache,相似处:按键选择哪个对等体负责该键不同处:不需要运行单独的一组服务器,从而大大减少了部署/配置的痛苦。Groupcache是一个客户端库,也是一个服务器。它连接到自己的对等点,形成分布式缓存。可以与存储服务集成,不需要
2021-06-08 17:26:40 829
原创 golang中对于docker sdk的使用
本文涉及到使用golang docker sdk 进行 pull、exec、push、import等常见操作的教程,对官方文档缺失的示例进行了补充。docker sdk 官方文档:https://docs.docker.com/engine/api/sdk/examples/docker client 初始化docker client 有多种初始化方法, 本文使用从env中读取的方式。client, _ := client.NewClientWithOpts(client.FromEnv, clie
2021-04-21 19:50:03 2461
原创 使用go调用faiss
最近偶然发现了一个go调用faiss的封装库, 尝试后可以成功调用。 安装稍微麻烦,具体如下:安装faissgit clone https://github.com/facebookresearch/faiss.git因为封装库使用的是过往版本的faiss,需要checkout到对应的版本git checkout v1.6.3克隆好项目后,进行编译,参考https://github.com/facebookresearch/faiss/blob/v1.6.3/INSTALL.md我需要使用c
2020-11-25 14:44:56 1390 3
原创 为 k8s nginx ingress controller添加错误页面
创建错误页面kubectl apply -f error-page.yaml -n ingress-nginxapiVersion: v1kind: ConfigMapmetadata: name: error-page namespace: ingress-nginxdata: 404.html: |- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR
2020-08-11 11:27:58 1503
原创 jmeter将返回的json结果保存为csv
jmeter的介绍不再赘述,直接进入主题。在测试过程中,会有将response中某些返回值保存下来的需求,jemeter中实现起来比较简单,分为一下几步:线程组或其他测试主体的创建本文不做此处的赘述, 假设你已经创建完成了添加json提取器首先创建一个json提取器点击刚创建好的json提取器分别填充标注的几个字段即可json字段提取器的编写点击查看结果树如果没有创建,可以在这里创建点击清理,并运行点击左侧任意返回结果, 并将text 改为 json path tester
2020-07-28 14:21:16 2428
原创 kubeadm加入master节点失败,报错 error execution phase check-etcd: etcd cluster is not healthy: context deadli
出现这个报错,多是因为之前的集群信息没有清理干净。解决办法如下:执行命令,获取etcd节点列表。kubectl get pod -n kube-systemetcd节点名称为 “etcd”+hostname这里以 etcd-k8s-master1 为例, 进入etcd容器内部kubectl exec -ti etcd-k8s-master1 -n kube-system sh# k8s中etcd使用的是v3的api, 所以要先声明变量export ETCDCTL_API=3# 执行命令,
2020-07-24 14:54:51 2588 1
原创 gin跨域问题解决
跨域的核验是通过header中的数个字段判断的, 通过添加中间件的方式,为请求添加header信息,来解决跨域问题。首先编写一个中间件函数。func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method //fmt.Println(method) c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Cont
2020-07-06 18:31:02 738 1
原创 mac安装 facebook faiss
Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现。相关介绍参考《Fa...
2020-04-27 09:47:45 1623
原创 生产级kubernetes etcd数据目录更换
使用kubeadm搭建的k8s集群,默认etcd的数据目录为 /var/lib/etcd 。集群运行一段时间后, 发现在系统硬盘上的etcd即占空间,又影响速度。所以将其数据目录迁移到ssd中。注意修改配置文件后,etcd会自动重启,并且导致对应机器的kubectl不可用。所以请一台一台修改,etcd leader 节点放到最后操作,并且确保其他机器的kubectl可用。vim /etc...
2020-04-13 10:12:34 2304
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人