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
}
相关推荐
Gold Steps.1 小时前
K8S周期性备份etcd数据实战案例
云原生·kubernetes·数据安全·etcd
❀͜͡傀儡师1 小时前
Kubernetes (K8s) 部署Doris
云原生·容器·kubernetes
熬了夜的程序员9 小时前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
jack-hui611 小时前
docker配置gpu运行环境:linux离线安装nvidia-container,避免网络问题
linux·docker·容器
陈陈CHENCHEN12 小时前
【Kubernetes】集群环境下的应用部署案例
kubernetes
爱吃芝麻汤圆14 小时前
k8s之NDS解析到Ingress服务暴露
容器·kubernetes
东风微鸣16 小时前
职场生存指南:如何优雅应对"双面人"同事
docker·云原生·kubernetes·可观察性
Java侠17 小时前
graylog6.3 docker-compose部署全流程
运维·docker·容器·graylog·docker compose