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
}
相关推荐
稚辉君.MCA_P8_Java2 小时前
Gemini永久会员 containerd部署java项目 kubernetes集群
后端·spring cloud·云原生·容器·kubernetes
间彧4 小时前
Helm深度解析:Kubernetes应用管理的利器
kubernetes
间彧5 小时前
K8s: 如何通过kubectl命令实时监控滚动更新的详细过程?
kubernetes
想搞艺术的程序员5 小时前
深入 NSQ 延迟消息实现原理:设计巧思与性能优化
性能优化·golang·nsq
岚天start6 小时前
K8S环境中Containerd运行时占用文件定位清理
java·rpc·kubernetes
赵文宇(温玉)10 小时前
不翻墙,基于Rancher极速启动Kubernetes,配置SSO登录,在线环境开放学习体验
学习·kubernetes·rancher
炸裂狸花猫10 小时前
开源域名证书工具 - cert-manager
云原生·容器·kubernetes·开源·cert-manager
会飞的小蛮猪11 小时前
Ubuntu24.04基于Docker部署K8s(使用私服部署)
经验分享·docker·云原生·容器·kubernetes
h***015415 小时前
Docker启动安装nacos(详情讲解,全网最细)
运维·docker·容器
人工智能训练16 小时前
windows系统中的docker,xinference直接运行在容器目录和持载在宿主机目录中的区别
linux·服务器·人工智能·windows·ubuntu·docker·容器