K8s client go 创建CRD的informer

背景

需要监听K8s中CRD资源的变动, 做出相应的处理, 需要针对 CRD资源建立informer

实现

dynamicClient 是 创建的K8s的client, 这里使用的是 Unstructured 接収的CRD的结果,

加工的时候使用了convertUnstructuredProject 加工了一下, convertUnstructuredProject 实现下面提供

projectGvk 是 GroupVersionResource , 根据自己的CRD定义

go 复制代码
		// 创建sharedInformerFactory,第二个参数为同步周期,也就是多久从APIServer List一次,并更新到本地缓存
		informer := cache.NewSharedInformer(&cache.ListWatch{
			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
				return dynamicClient.Resource(projectGvk).List(ctx, options)
			},
			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
				return dynamicClient.Resource(projectGvk).Watch(ctx, options)
			},
		},
			&unstructured.Unstructured{},
			60*time.Second)
		// 创建informer

		if err != nil {
			log.Error("Failed to create informer", zap.Error(err))
			continue
		}
		// 注册资源事件处理方法
		informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
			AddFunc: func(obj interface{}) {},
			UpdateFunc: func(oldObj, newObj interface{}) {
				newData, err := convertUnstructuredProject(newObj)
				if err != nil {
					log.Error("Failed to convert unstructured project", zap.Error(err))
				}
				oldData, err := convertUnstructuredProject(oldObj)
				if err != nil {
					log.Error("Failed to convert unstructured project", zap.Error(err))
				}
				if oldData.Generation != newData.Generation {
					fmt.Println("update", newData)
					saveProject(newData, clsuter.Platform)
				}
			},
			DeleteFunc: func(obj interface{}) {
				data, err := convertUnstructuredProject(obj)
				if err != nil {
					log.Error("Failed to convert unstructured project", zap.Error(err))
				}
				fmt.Println("delete", data)
				deleteProject(data, clsuter.Platform)
			},
		})
		// 启动
		stopCh := make(chan struct{})
		log.Info("Starting project informer factory")
		informer.Run(stopCh)
		// 等待父协程处理
		<-ctx.Done()
		close(stopCh)
		log.Info("Shutting down project informer factory")

convertUnstructuredProject的实现 Project 是实现的 runtime.Object 接口的struct

go 复制代码
func convertUnstructuredProject(obj interface{}) (crd *Project, err error) {
	// 将obj转换为*unstructured.Unstructured类型
	u, ok := obj.(*unstructured.Unstructured)
	if !ok {
		fmt.Println("Failed to convert object to *unstructured.Unstructured")
		return
	}

	// 将u对象转换为YourCRDType类型
	crd = &Project{}
	err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.UnstructuredContent(), crd)
	if err != nil {
		fmt.Println("Failed to convert object to YourCRDType")
		return
	}
	return
}
相关推荐
像风一样自由20208 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
陈陈CHENCHEN12 小时前
【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务
云原生·容器·kubernetes
microrain14 小时前
读数是 1008,用电量是 8:SagooIoT 计算服务的增量口径与七种计算策略
物联网·golang·计算服务·sagooiot
看浪的路人15 小时前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
灯澜忆梦17 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器
灯澜忆梦18 小时前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
吴声子夜歌19 小时前
Docker入门与实战——实战案例(编程开发)(一)
运维·docker·容器
不是万能的豆学长21 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
tachibana221 小时前
Go 语言 Map 的底层实现原理
开发语言·后端·golang·make