golang学习之路
文章平均质量分 80
常鱼
这个作者很懒,什么都没留下…
展开
-
【玩转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 · 619 阅读 · 0 评论 -
使用 panic 处理 Gin 中间件中的错误
总之,在 Gin 中使用错误处理和 panic 处理是非常重要的。通过正确地使用它们,我们可以确保我们的应用程序在遇到各种错误时都能够正确地处理它们,并向客户端返回恰当的 HTTP 响应。原创 2023-04-04 11:14:53 · 1510 阅读 · 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 · 3748 阅读 · 0 评论 -
【玩转client-go】管理 Kubernetes 中资源删除:Finalizer 和 DeletionTimestamp
Finalizer 和 DeletionTimestamp 是 Kubernetes 中管理资源删除的重要机制。控制器可以使用 Finalizer 和 DeletionTimestamp 安全地管理资源对象的删除,并在必要时执行某些清理操作。在处理资源对象时,务必考虑 Finalizer 和 DeletionTimestamp 的作用,并确保正确使用它们,以避免意外删除资源对象。原创 2023-04-03 14:18:12 · 1298 阅读 · 0 评论 -
【玩转client-go】解析 Kubernetes 资源的 YAML 数据的 Go 函数实现
函数的参数cf是 Kubernetes 的客户端配置信息,typ和name分别代表所要获取资源的类型和名称。函数返回的是该资源的 YAML 数据的字节数组和可能出现的错误。原创 2023-04-03 11:13:45 · 1077 阅读 · 0 评论 -
【玩转client-go】如何获取 Kubernetes API 客户端的 *rest.Config 对象
本文介绍了四种获取 Kubernetes API 客户端的对象的方法,分别是使用kubeconfig文件、使用 Kubernetes 集群内的 Service Account、直接指定 API Server 的地址和认证信息、以及使用方法。不同的方法适用于不同的场景,开发者可以根据自己的需求来选择使用。原创 2023-04-02 22:29:50 · 1694 阅读 · 0 评论 -
【玩转client-go】通过包含多个集群信息的Kubernetes配置文件获取所有集群的ClientSet
总结来说,通过上述代码示例,我们可以学习到如何通过包含多个集群信息的Kubernetes配置文件获取所有集群的rest.Config,以及如何使用rest.Config对象创建Kubernetes客户端对象并获取每个集群中的Namespace列表。这对于管理多个Kubernetes集群的开发人员来说,是非常实用的技能。原创 2023-04-02 20:44:33 · 1119 阅读 · 3 评论 -
结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持
在本文中,我们将介绍如何结合 Casbin 对 HTTP 请求进行基于角色的访问控制 (RBAC) 鉴权,并支持请求路由参数。我们将使用 Go 语言中的 Casbin 库。原创 2023-03-28 15:22:39 · 857 阅读 · 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 · 2082 阅读 · 0 评论 -
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 · 963 阅读 · 0 评论 -
最简最速搭建grpc分布式服务的Mac系统开发环境
Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。原创 2023-01-13 13:34:53 · 1201 阅读 · 0 评论 -
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 · 2016 阅读 · 2 评论 -
Kubernetes 开发【5】—— scheduling framework 构建自定义调度插件
对于不同插件的基本描述,摘自官方文档PreFilter这些插件用于预处理 Pod 的相关信息,或者检查集群或 Pod 必须满足的某些条件。如果 PreFilter 插件返回错误,则调度周期将终止。Filter这些插件用于过滤出不能运行该 Pod 的节点。对于每个节点, 调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行, 则不会为该节点调用剩下的过滤插件。节点可以被同时进行评估。PostFilter这些插件在 Filter 阶段后调用,但仅在该 Pod 没有可行的节点时调用。原创 2022-11-18 16:18:06 · 1231 阅读 · 0 评论 -
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 · 529 阅读 · 0 评论 -
Golang+Vue2从零开始搭建K8S后台管理系统(5)—— Container日志及持续输出
上章我们实现了deployment等列表显示,并且当有部分资源发生了增删改时,会自动重新渲染加载新列表。这章要实现的是通过go-client将Pod的中的Container(可选择)的日志抓取出来,并且持续输出到控制台。Pod的Log抓取可通过长连接即可简单实现,下章中我们将通过websocket和xterm库取实现Pod的远程终端。原创 2022-10-24 22:51:47 · 1671 阅读 · 0 评论 -
Golang+Vue2从零开始搭建K8S后台管理系统(4)——自动更新资源列表(下)
至此,整一个websocket的前后端调用就完成了。可见的是,这种是比较初级的做法,未来将会看见更优雅的实现。原创 2022-10-15 23:59:50 · 795 阅读 · 0 评论 -
Golang+Vue2从零开始搭建K8S后台管理系统(3)——自动更新资源列表(上)
这里只是做一个思路的展示,因为诸如或者容器日志或者远程 shell 这类复杂的操作,往往通过多个资源的组合(namespace、deployment、pod..)来获取最终操作的对象,我们不可能去多次请求api,一是延迟问题,二是 apiserver 的压力问题(这个影响比较小)。有了本地缓存 map,我们就可以通过加入 deployment 对应类型的 informer 去 watch 资源的变化,并且通过 handler 来对 map 中的内容进行增删改。原创 2022-10-15 16:26:31 · 1165 阅读 · 0 评论 -
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 · 1818 阅读 · 0 评论 -
Kubernetes 开发【3】——kubectl插件开发
本文仅简单介绍kubectl插件开发模式,不做深入扩展。仅通过开发一个kubectl pods命令,来展示开发kubectl的方法和技巧其本身也是一个kubectl插件,我们可以通过kubectl plugin list查看所有可执行的插件。krew是对插件的一种扩展 ,以kuebctl krew运行,可以通过这个工具来管理和安装公网上发布的插件。...原创 2022-08-16 19:01:01 · 745 阅读 · 0 评论 -
Kubernetes开发【2】—— Informer 的简单应用,构建 Event 事件告警机制并推送到钉/企微机器人
由于 K8S 内置了许多的 Controller 来对各种各样的资源进行 List & Watch,因此也会产生各种不同的事件(Event),其中部分事件是需要我们作为告警来处理的,比如 ReadinessProbe Failed 这种事件,我们需要在其到达失败阈值之前获得通知并做及时处理。其中,因为钉/企微的 Webhook 机器人有固定的消息模版用于展示,我们需要在预先定义好的模版中填充关于事件的一些信息字段,这些字段可以表示成事件对象(结构体)的成员变量名。至此,编码阶段就完成了。..........原创 2022-08-16 14:19:36 · 1178 阅读 · 0 评论 -
Golang Dockerfile的最佳实践
对于dockerfile而言,何为完美?话说不说,直接上拿走可用的Dockerfile。原创 2022-08-10 16:12:39 · 2600 阅读 · 3 评论 -
Kubernetes 开发【1】——webhook 实现 API Server 请求拦截和修改
admission controller是一段代码,它会在请求通过认证和授权之后、对象被持久化之前拦截到达 API 服务器的请求。控制器编译进可执行文件,并且只能由集群管理员配置。使用准入控制器 | Kubernetes我们也可以通过自己编写一段代码二次开发来实现更为高级更为复杂的需求,官方有具体的实例,该实例的用途是即仅允许pod从指定的镜像仓库拉取image,否则apiserver将会拒绝本次请求。............原创 2022-08-04 11:28:34 · 1574 阅读 · 0 评论 -
golang:go语句函数调用引起的死锁问题
在 Go 语言规范中,关于 go 语句有这么一句描述:这里说明,go 语句后面的函数调用,其参数会先求值,这和普通的函数调用求值一样。在规范中调用部分是这样描述的:大意思是说,函数调用之前,实参就被求值好了。因此 语句中的 是在 main goroutine 中求值的。这相当于一个无缓冲的 chan,发送和接收操作都在一个 goroutine 中(main goroutine)进行,因此造成死锁。...原创 2022-07-01 18:19:59 · 389 阅读 · 0 评论