- 博客(58)
- 资源 (1)
- 收藏
- 关注
原创 eBPF可观测之网络流量控制和管理traffic control浅尝
首先发表一个"暴论"eBPF在可观测方面的应用,就是各种google。不需要学习内核,只要掌握ebpf开发套路。好比你开发 web 开发网站, 你了解socket 底层和内核吗?一样不了解。知道怎么调用就行了。而且 eBPF 的开发也没多少复杂度, 更多的是 在内核态拦截(简化的c语言) 内核数据(不管是网络数据还是tracepoint数据), 最终都是要发给用户态(可以理解为java、golang),然后用户态具体做业务处理。所以c语言也不需要怎么学,学了也没啥用。
2024-05-28 18:05:23 1136
原创 [rust]如何将DataFrame转换成Json Trait
这段代码的目的是将一个数据框(DataFrame)中的数据转换为一个包含多个哈希映射(HashMap)的向量(Vec),其中每个哈希映射代表数据框中的一行数据。通过循环遍历数据框的每一行,将每一行的数据转换为一个哈希映射,并将这些哈希映射添加到结果向量中,最终得到了一个包含整个数据框数据的向量。,其中每个元素都是一个哈希映射,该哈希映射将列名作为键(key),将对应行中的数据作为值(value)。返回数据框的行数,循环将从 0 开始,逐步递增,直到达到最后一行。这是一个循环,用于遍历数据框的每一行。
2023-12-28 18:18:58 832
原创 CoreDns在K8S中的作用原理概述
在Kubernetes集群中,CoreDNS通常作为默认的DNS插件运行在kube-system命名空间中,它通过监听ClusterIP类型的Service的DNS请求,并将其解析为对应的Pod IP地址。Service域名解析:当一个Pod或其他服务访问Kubernetes集群中的另一个Service时,它会使用目标Service的名称作为域名进行解析。插件会根据请求中的域名查找对应的Service,并将其解析为对应的Pod IP地址。的Service,它会发起一个DNS请求,将。
2023-12-01 15:31:12 672
原创 kubectl rollout 实现金丝雀发布的流量控制策略
金丝雀发布是一种逐步引入新版本应用程序的策略,以减少潜在风险。本文介绍如何使用Kubernetes的kubectl rollout pause和kubectl rollout resume命令,结合修改Deployment的maxSurge和maxUnavailable字段,来实现金丝雀发布的流量控制。通过反复执行这些步骤,我们可以逐步引入新版本,并监控其性能和稳定性,最终完成金丝雀发布。
2023-11-28 17:50:08 327
原创 【玩转client-go】使用client-go从POD拷贝文件出来
先讲思路,通过client-go RestClient模拟kubectl exec 的手法,结合容器镜像里的tar命令和golang原生tar包,作为管道的输入输出,实现文件的数据流拷贝,以下是具体做法。循环读取,并把归档输出写入新创建的文件,当出现End of File(文件结束符)错误,代表输入已完成,没有可读取的输出。tar cf - index.html这条命令的含义是创建一个tar归档文件,并将名为"index.html"的文件加入到归档中。首先是一段将文件内容输出到标准输出的代码。
2023-11-27 15:57:53 597
原创 解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题
通过自定义和配置探针的HTTP路径,我们成功解决了Spring Boot应用在Kubernetes上健康检查接口返回的问题。现在,健康检查接口返回正确的健康状态,并且探针路径也与公司的重定向配置保持一致。这样,我们可以确保应用在Kubernetes环境中的健康检查正常运行,同时满足公司的需求。
2023-11-20 16:19:43 1584
原创 在 macOS 上安装 Rust 开发环境并运行第一个程序的详细步骤
通过按照上述步骤,在 macOS 上安装 Rust 开发环境,并创建和运行第一个 Rust 程序。如果您有任何其他问题,请随时提问。
2023-09-14 15:57:47 3807 2
原创 使用 panic 处理 Gin 中间件中的错误
总之,在 Gin 中使用错误处理和 panic 处理是非常重要的。通过正确地使用它们,我们可以确保我们的应用程序在遇到各种错误时都能够正确地处理它们,并向客户端返回恰当的 HTTP 响应。
2023-04-04 11:14:53 1494 1
原创 实现ConfigMap热更新的三种常用方法:使用sidecar、CI脚本和自定义Controller
在config-reloader容器中,我们指定了ConfigMap的watched-dir和volume-dir,并指定了webhook-url为localhost:5000/-/reload,当ConfigMap发生变化时,config-reloader会向该地址发送一个HTTP POST请求,触发应用程序的重新读取。其次,由于Controller需要监听ConfigMap的变化事件,并更新对应的Pod,这可能会增加集群的负载,影响集群的稳定性。首先,需要编写CI脚本,配置复杂,需要一定的编程能力。
2023-04-03 17:36:26 3691
原创 覆盖优先级关系:Dockerfile 和 docker run 中的 ENTRYPOINT 和 CMD 指令
需要注意的是,如果在 Dockerfile 中同时指定了 ENTRYPOINT 和 CMD 命令,则在运行容器时可以通过命令行参数来覆盖 CMD 命令,但无法覆盖 ENTRYPOINT 命令,除非使用。Dockerfile 中的 ENTRYPOINT 和 CMD 指令定义了容器的默认启动命令。但是,在运行容器时,这些指令可以被 Docker run 命令行参数覆盖。该 Dockerfile 定义了一个以 Ubuntu 为基础镜像的容器,并将。作为 ENTRYPOINT 命令,将。作为 CMD 命令。
2023-04-03 15:00:13 2633
原创 【玩转client-go】管理 Kubernetes 中资源删除:Finalizer 和 DeletionTimestamp
Finalizer 和 DeletionTimestamp 是 Kubernetes 中管理资源删除的重要机制。控制器可以使用 Finalizer 和 DeletionTimestamp 安全地管理资源对象的删除,并在必要时执行某些清理操作。在处理资源对象时,务必考虑 Finalizer 和 DeletionTimestamp 的作用,并确保正确使用它们,以避免意外删除资源对象。
2023-04-03 14:18:12 1274
原创 【玩转client-go】解析 Kubernetes 资源的 YAML 数据的 Go 函数实现
函数的参数cf是 Kubernetes 的客户端配置信息,typ和name分别代表所要获取资源的类型和名称。函数返回的是该资源的 YAML 数据的字节数组和可能出现的错误。
2023-04-03 11:13:45 1059
原创 【玩转client-go】如何获取 Kubernetes API 客户端的 *rest.Config 对象
本文介绍了四种获取 Kubernetes API 客户端的对象的方法,分别是使用kubeconfig文件、使用 Kubernetes 集群内的 Service Account、直接指定 API Server 的地址和认证信息、以及使用方法。不同的方法适用于不同的场景,开发者可以根据自己的需求来选择使用。
2023-04-02 22:29:50 1681
原创 【玩转client-go】通过包含多个集群信息的Kubernetes配置文件获取所有集群的ClientSet
总结来说,通过上述代码示例,我们可以学习到如何通过包含多个集群信息的Kubernetes配置文件获取所有集群的rest.Config,以及如何使用rest.Config对象创建Kubernetes客户端对象并获取每个集群中的Namespace列表。这对于管理多个Kubernetes集群的开发人员来说,是非常实用的技能。
2023-04-02 20:44:33 1100 3
原创 结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持
在本文中,我们将介绍如何结合 Casbin 对 HTTP 请求进行基于角色的访问控制 (RBAC) 鉴权,并支持请求路由参数。我们将使用 Go 语言中的 Casbin 库。
2023-03-28 15:22:39 836 1
原创 “invalid character ‘\x1f‘ looking for beginning of value“ 报错解决方法
这个问题来源于我在开启kubectl proxy代理的时候,通过kubectl apply -f xxx.yaml向代理提交一个configMap对象,返回了 "Error while proxying request: invalid character '\x1f' looking for beginning of value" 的报错。
2023-03-12 16:01:07 2033
原创 code-generator 使用介绍——CRD客户端生成工具
ops-operator是我的项目名称,extensions是GVK的Group中的抬头,operation是我的CRD的名称,v1则是GVK的Version。然后需要根据CRD的申明字段做一些客制化的修改,这里的代码主要是用于Controller调用client-go过程中对对象的一些反序列化操作,以及对外暴露的注册到Manager 的Scheme的函数方法。此外,查看生成的代码目录,还支持Clientset以外的informer、lister的扩展。要先生成整体的客户端代码,首先需要打下框架。
2023-03-07 15:37:27 954
原创 controller-runtime搭建operator开发环境
首先下载相应的go pkg接下来需要创建控制器和ManagerOperator的本质是一个可重入的队列编程模式,而Manager可以用来管理Controller、Admission Webhook,包括访问资源对象的client、cache、scheme、提供了一个简单的依赖注入机制、优雅关闭的信号处理机制等。 参见官方文档中的示例代码opsController.go先监听官方资源,比如Ingress(后续需要在Manager中指定),因此将调谐函数补全为当有一个新的Ingress对象被提
2023-03-07 14:32:35 744
原创 nerdctl不完全使用指南(开发者)
由于懒是我们的宗旨,所以干脆直接在容器中构建,也即dind(docker in docker),从docker转containerd后,应该叫cinc了,这也是ci/cd pipeline里面的常用体位。开发调试,通常不需要ci/cd去做一个整个链路的编译打包镜像,一来耗时,二来可能需要上下游协作,增加了沟通和时间成本。本篇只要是描述在docker被取代后的一些开发者技巧。又因为众所周知的原因,本地编译好的可执行程序上传云服务器的速率非常慢,不如直接同步服务器上的代码,在服务器上直接完成编译。
2023-03-06 15:20:06 865
转载 K8S中Pod通过域名访问Service失败,提示bad address
可以看到Pod内部的resolv.conf 内容,其中nameserver指定DNS解析服务器IP为 “10.96.0.2” ,这个IP地址正是Kubernetes集群CoreDNS的Service “kube-dns” 的 cluterIP,说明当Pod内部进行域名解析时,确实是将查询请求发送到Service “kube-dns” 提供的虚拟IP进行域名解析 既然Pod 中 DNS配置文件没问题,且CoreDNS也没问题,会不会是Pod本身域名解析不正常呢?
2023-02-17 16:48:16 2825 1
原创 最简最速搭建grpc分布式服务的Mac系统开发环境
Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
2023-01-13 13:34:53 1190
原创 Golang+Vue2从零开始搭建K8S后台管理系统(6)——web终端实现pod shell
上一章通过http chunked 长连接实现了pod的日志读取和展现;本章将通过前端的xterm.js库以及websocket来实现pod终端在浏览器页面上的实现。至此,我们就完成了pod shell的实现。在下一章中,我们将在此基础上进一步实现node shell。其实原理是类似的,基本思路就是通过ssh开启一个会话,并同样以其构造实现io.Reader和io.Writer接口的结构体。
2022-11-29 13:01:02 1993 2
原创 Kubernetes 开发【5】—— scheduling framework 构建自定义调度插件
对于不同插件的基本描述,摘自官方文档PreFilter这些插件用于预处理 Pod 的相关信息,或者检查集群或 Pod 必须满足的某些条件。如果 PreFilter 插件返回错误,则调度周期将终止。Filter这些插件用于过滤出不能运行该 Pod 的节点。对于每个节点, 调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行, 则不会为该节点调用剩下的过滤插件。节点可以被同时进行评估。PostFilter这些插件在 Filter 阶段后调用,但仅在该 Pod 没有可行的节点时调用。
2022-11-18 16:18:06 1211
原创 kubeconfig文件执行kubectl发生x509证书认证问题解决
我们的kubernetes的apiserver-advertise-address是一个内网IP,默认情况下,kubernetes自建的CA会为apiserver签发一个证书,证书的默认可访问的是内网IP、kubernetes、kubernetes.default kubernetes.default.svc、kubernetes.default.svc.cluster.local,不包含设备的外网IP。删除当前kubernetes集群下的apiserver的cert和key。刷新admin.conf。
2022-11-11 14:59:48 2965
原创 golang reflect反射的简单入门
1.TypeOf 用Name 获取字段名,也可以用Kind获取字段的类型;ValueOf 只能用Kind获取字段的类型。2.使用reflect.ValueOf(u).Type()转成type,可以与reflect.TypeOf(u)达到一样的效果3.如果要使用Set,SetString等方法为其赋值,reflect.ValueOf(u)这里的u必须传入一个指针,否则无法寻址,会出现panic。
2022-11-03 14:02:46 512
原创 Golang+Vue2从零开始搭建K8S后台管理系统(5)—— Container日志及持续输出
上章我们实现了deployment等列表显示,并且当有部分资源发生了增删改时,会自动重新渲染加载新列表。这章要实现的是通过go-client将Pod的中的Container(可选择)的日志抓取出来,并且持续输出到控制台。Pod的Log抓取可通过长连接即可简单实现,下章中我们将通过websocket和xterm库取实现Pod的远程终端。
2022-10-24 22:51:47 1660
原创 Golang+Vue2从零开始搭建K8S后台管理系统(4)——自动更新资源列表(下)
至此,整一个websocket的前后端调用就完成了。可见的是,这种是比较初级的做法,未来将会看见更优雅的实现。
2022-10-15 23:59:50 790
原创 Golang+Vue2从零开始搭建K8S后台管理系统(3)——自动更新资源列表(上)
这里只是做一个思路的展示,因为诸如或者容器日志或者远程 shell 这类复杂的操作,往往通过多个资源的组合(namespace、deployment、pod..)来获取最终操作的对象,我们不可能去多次请求api,一是延迟问题,二是 apiserver 的压力问题(这个影响比较小)。有了本地缓存 map,我们就可以通过加入 deployment 对应类型的 informer 去 watch 资源的变化,并且通过 handler 来对 map 中的内容进行增删改。
2022-10-15 16:26:31 1160
原创 Golang+Vue2从零开始搭建K8S后台管理系统(2)——前后端联调
request 中使用了环境变量配置文件 .env.development 中的 BASE_URL ,而该文件中默认值并不是个远程 URL ,而是 /dev-api,也就是说现在业务 API 会请求到我们的 GO API 中,而用户 API还是会走本地的数据模拟;上一章中只是为了快速测试,独立出了一个自定义的 request 文件,在上实际生产环境中,肯定是需要构建我们的用户系统,并且这部分功能由我们的 GO API 去集成的。并且修改我们的 .env.development,替换成远程 URL。
2022-09-27 16:51:25 793
原创 Golang+Vue2从零开始搭建K8S后台管理系统(1)——列表展现
该路由通过项目路径 '@/views/workloads/deploylist' 指向了一个组件,因此我们需要在 /src/views/workload 下新建文件 deploylist.vue;3.根据我们后端 api 的返回结果,需要将请求拿到的结果做一定处理,并将处理后的结果赋给 data 中的表单对象,并在 html 中选择返回结果中合适的成员变量插入对应的表列中。仿照内置的 template,我们需要在 index.js 中根据对应的格式建立一个用于存放我们工作负载的列表集合路径。
2022-09-26 18:30:32 1162
原创 gitlab-ci的最简最速实践
获取 gitlab access token 或者是把主机的 ssh key 配置到 gitlab 服务端上我这里获取 gitlab 的 access token。请根据自己的情况选择然后勾选所有权限,并一键生成获得一串序列码,注意保存配置 git remotes,URL 格式为至此,完成了本地代码和代码库的关联。
2022-09-09 16:16:09 726
原创 Kubernetes 开发【4】—— 基于kubebuilder开发简单的Operator
Kubernetes 为自动化而生。安装 crd 到集群里,这里其实是通过 kubectl 和 kustomize 去 apply 的,所以会安装 CRD 到我本机的~/.kube/config中配置的集群里去。首先到 /api/v1/redis_types.go 文件下对 CRD 的 api 添加字段,也就是我们最后 apply 的 yaml 中包含的字段。crd 是指我们定义了什么样的一种资源,定义它需要什么字段(schema),这些字段的值描述了我们对于这个资源的预期(终态);以上释义来自官方文档;.
2022-08-31 17:28:45 1814
原创 Kubernetes 开发【3】——kubectl插件开发
本文仅简单介绍kubectl插件开发模式,不做深入扩展。仅通过开发一个kubectl pods命令,来展示开发kubectl的方法和技巧其本身也是一个kubectl插件,我们可以通过kubectl plugin list查看所有可执行的插件。krew是对插件的一种扩展 ,以kuebctl krew运行,可以通过这个工具来管理和安装公网上发布的插件。...
2022-08-16 19:01:01 740
原创 Kubernetes开发【2】—— Informer 的简单应用,构建 Event 事件告警机制并推送到钉/企微机器人
由于 K8S 内置了许多的 Controller 来对各种各样的资源进行 List & Watch,因此也会产生各种不同的事件(Event),其中部分事件是需要我们作为告警来处理的,比如 ReadinessProbe Failed 这种事件,我们需要在其到达失败阈值之前获得通知并做及时处理。其中,因为钉/企微的 Webhook 机器人有固定的消息模版用于展示,我们需要在预先定义好的模版中填充关于事件的一些信息字段,这些字段可以表示成事件对象(结构体)的成员变量名。至此,编码阶段就完成了。..........
2022-08-16 14:19:36 1168
原创 Kubernetes 开发【1】——webhook 实现 API Server 请求拦截和修改
admission controller是一段代码,它会在请求通过认证和授权之后、对象被持久化之前拦截到达 API 服务器的请求。控制器编译进可执行文件,并且只能由集群管理员配置。使用准入控制器 | Kubernetes我们也可以通过自己编写一段代码二次开发来实现更为高级更为复杂的需求,官方有具体的实例,该实例的用途是即仅允许pod从指定的镜像仓库拉取image,否则apiserver将会拒绝本次请求。............
2022-08-04 11:28:34 1561
原创 一文搞懂Docker、RunC、Containerd之间的关系
于是通过grpc调用的方式,并规定了grpc的接口方法和字段,各个厂商必须实现,也就是我们所谓的CRI(ContainerRuntimeInterface)。RunC是容器运行工具,纯从系统角度,Runc才是底层运行时,Runc是Docker中最为核心的部分,容器的创建、运行、销毁等等操作最终都将通过调用Runc完成。Containerd是容器运行时,从容器编排角度,Containerd是容器运行时。我们常说的docker一般指的是docker-shim,其也是一种容器运行时。......
2022-07-28 11:19:28 3538
原创 Kubernetes中Pod在处于Terminating状态时探针(Probe)仍在运行并检测失败
目录背景出现问题问题追溯解决方法参考文档(issue 和 pull request 已按照时间线梳理)本篇建议建立在以下文档之上进行阅读: 配置存活、就绪和启动探测器关于 K8S 探针的最佳实践 众所周知,日志作为实现软件可观测性的三大支柱之一,为了解系统运行状况,排查系统故障提供了关键的线索,在运维管理中起着至关重要的作用。Kubernetes 提供了两种原生的日志形式——审计(Audit)和事件(Event),它们分别记录了对于集群资源的访问以及集群中发生的事件信息。本篇的背景正是以K8S事件为基础建立
2022-07-12 18:24:12 1318
原创 关于 K8S 探针(startupProbe、livenessProbe、readinessProbe)的最佳实践
我们在 k8s 中使用【readiness】探针是用来判定容器是否准备就绪,是否可以接受流量。当 Pod 内所以容器均就绪,则 Pod 将被认为已 ready,如果没有,那么将从 service 的 Loader Blance 中剔除该 Pod。而 k8s 中使用【liveness】探针是用于判定是否需要重启容器,通常情况下主要用于检查容器是否无响应,死锁等,从而通过重启来提高应用的可用性。至于k8s 1.6中增加的【starup】探针是用于判定应用程序容器什么时候启动了,而启用这个探针主要目的是希望容器在
2022-07-07 17:45:31 1276
PasswordGenerator.alfredworkflow
2022-05-24
k8s中spring cloud应用使用nacos服务下线问题
2022-08-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人