首页 > 其他分享 >informer cache自定义索引

informer cache自定义索引

时间:2024-01-30 21:33:59浏览次数:28  
标签:自定义 cache client io go informer k8s os

informer cache默认通过namespace/name作为key把对象保存到map中。
条件查询时一般通过labels.Selector来过滤,但这需要遍历所有元素,informer cache可以类似于MySQL那样建立索引,来提高查询速度。

// map根据指定的key来给对象分类
// IndexFunc knows how to compute the set of indexed values for an object.
type IndexFunc func(obj interface{}) ([]string, error)
package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"

	core_v1 "k8s.io/api/core/v1"
	"k8s.io/client-go/informers"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/cache"
	"k8s.io/client-go/tools/clientcmd"
	klog "k8s.io/klog/v2"
)

func SetupSignalHandler() chan struct{} {
	stop := make(chan struct{})
	c := make(chan os.Signal, 2)
	signal.Notify(c, []os.Signal{os.Interrupt, syscall.SIGTERM}...)
	go func() {
		<-c
		close(c)
		close(stop)
	}()

	return stop
}

func nodeLabelIndexFunc(obj interface{}) ([]string, error) {
	if node, ok := obj.(*core_v1.Node); !ok {
		return nil, fmt.Errorf("type is not node")
	} else {
		indexKeys := make([]string, len(node.Labels))
		for k, v := range node.Labels {
			indexKeys = append(indexKeys, fmt.Sprintf("%s=%s", k, v))
		}
		return indexKeys, nil
	}
}

func addListWatchCfgAndClient(stopCh chan struct{}, wg *sync.WaitGroup) {
	wg.Add(1)
	defer wg.Done()

	cfg, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
	if err != nil {
		klog.Fatalf("Error building kubeconfig: %s", err.Error())
	}

	kubeClient, err := kubernetes.NewForConfig(cfg)
	if err != nil {
		klog.Fatalf("Error building kubernetes clientset: %s", err.Error())
	}

	informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
	nodeInformer := informerFactory.Core().V1().Nodes().Informer()
	nodeLabelIndexer := cache.Indexers{"label": nodeLabelIndexFunc}
	if err = nodeInformer.AddIndexers(nodeLabelIndexer); err != nil {
		klog.Fatalf("add index for node informer failed, err is %v", err)
	}
	hasSynced := nodeInformer.HasSynced
	informerFactory.Core().V1().Nodes().Lister()

	informerFactory.Start(stopCh)
	defer informerFactory.Shutdown()

	if ok := cache.WaitForCacheSync(stopCh, hasSynced); !ok {
		klog.Fatalf("failed to wait for caches to sync")
	}

	if nodes, err := nodeInformer.GetIndexer().ByIndex("label", "test=a"); err != nil {
		klog.Errorf("get node by label test=a failed, err is %v", err)
	} else {
		nodeNames := make([]string, len(nodes))
		for i, node := range nodes {
			nodeNames[i] = node.(*core_v1.Node).Name
		}
		klog.Infof("get node by label, node name is %v", nodeNames)
	}
}

func main() {
	stopCh := SetupSignalHandler()
	wg := sync.WaitGroup{}
	addListWatchCfgAndClient(stopCh, &wg)
	<-stopCh
	wg.Wait()
}

标签:自定义,cache,client,io,go,informer,k8s,os
From: https://www.cnblogs.com/WJQ2017/p/17998031

相关文章

  • python自定义装饰器
    被装饰函数带参数或不带参数#coding=utf8#自定义装饰器函数,需使用嵌套函数importtimedefdecorator_foo(func):definner_func(*args,**kwargs):start_time=time.time()func(*args,**kwargs)print('runfunccost{}s'.format(time.......
  • python自定义装饰器
    被装饰函数带参数或不带参数#coding=utf8#自定义装饰器函数,需使用嵌套函数importtimedefdecorator_foo(func):definner_func(*args,**kwargs):start_time=time.time()func(*args,**kwargs)print('runfunccost{}s'.format(time.......
  • 达梦---自定义函数 find_in_set()
    createorreplaceFUNCTIONFIND_IN_SET(piv_str1varchar2,piv_str2varchar2,p_sepvarchar2:=',')RETURNNUMBERISl_idxnumber:=0;--用于计算piv_str2中分隔符的位置strvarchar2(500);--根据分隔符截取的子字符串piv_......
  • 如何重写gorm日志(实现自定义慢sql打印)
    1.什么是gormGORM是一个流行的Go语言ORM(对象关系映射)库,用于处理数据库的CRUD(创建、读取、更新、删除)操作。它是一个开源的库,通过简洁的API使得对数据库的操作就像操作对象一样自然,无需编写大量的SQL代码。GORM支持主流的关系数据库,如MySQL、PostgreSQL、SQLite以及Mic......
  • html 自定义 checkbox样式
    input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;width:20px;height:20px;border:1pxsolid#ff6a00;background-color:white;line-height:20px;......
  • python自定义装饰器,实现轮询监控数据库,并且根据字段内容变更打印相应日志或结束循环
    使用方法可以写个whileTrue的循环监控数据,再分别定义每个状态要做什么事情注意:循环中不要写breake不要return,换成yield,把函数作为一个生成器,由装饰器控制循环代码示例importfunctoolsimporttimefromutils.log_settingimportloggerfromconfigimportsetti......
  • go-cache基于内存的键值存储缓存库
    Go的内存key:valuestore/cache(类似于Memcached)库,适用于单机应用程序。文档https://pkg.go.dev/github.com/patrickmn/go-cachehttps://github.com/patrickmn/go-cachehttps://patrickmn.com/projects/go-cache/安装gogetgithub.com/patrickmn/go-cache方法funcN......
  • Django - admin 表单编辑页面,增加自定义功能,前端上传视频到oss
    #背景:可以在admin编辑页面原有基础上,增加一些可定制的功能,如:在本地上传图片到oss,减少服务器的带宽压力,下面就以此为例。示例图:  一。models.py#video可以直接用字符串存储,因为最终里面只有有一串oss的视频路径classNews(models.Model):OSS_URL='https://xxxx......
  • C# 使用自定义特性标注类的方法,直接在当前类中让Main函数调用它
    有的时候我们想要再Main执行一些代码,如果直接在里面写的话,下次再想用的时候就会把之前的代码删掉,好不容易写的代码不想删掉于是我们可以将这些代码写到类文件中,想要执行了,就在Main中调用该类的方法,但是有的时候我们又懒的去Main函数指定的,有没有什么办法能直接在新类中就能指定......
  • 【如何更新自定义IP】自定义IP 的.V文件修改以后,一定要先进入platform Designer更新IP
    最近自定义了一个IP,添加到qsys以后,generateHDL....。再后来再有改动IP的.v文件时,我直接点generateHDL...发现电路最终没有更新。 需要如下操作:先进入platformDesigner更新IP,右击选择IP选择Edit: 点击分析和综合IP文件:  以后再generateQsy文件: 这样工程的......