indexer使用案例
一、indexer使用案例
package main import ( "fmt" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/cache" ) func NamespaceIndexFunc(obj interface{}) (result []string, err error) { pod, ok := obj.(*v1.Pod) if !ok { return nil, fmt.Errorf("类型错误%v", err) } result = []string{pod.Namespace} return } func NodeNameIndexFunc(obj interface{}) (result []string, err error) { pod, ok := obj.(*v1.Pod) if !ok { return nil, fmt.Errorf("类型错误%v", err) } result = []string{pod.Spec.NodeName} return } func main() { //实例化一个index对象 index := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{ "namespace": NamespaceIndexFunc, "nodename": NodeNameIndexFunc, }) //模拟数据 pod1 := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "pod", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Name: "pod1", Namespace: "default", }, Spec: v1.PodSpec{ NodeName: "node1", }, } pod2 := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "pod", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Name: "pod2", Namespace: "default", }, Spec: v1.PodSpec{ NodeName: "node2", }, } pod3 := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "pod", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Name: "pod3", Namespace: "kube-system", }, Spec: v1.PodSpec{ NodeName: "node3", }, } //将数据写入到Indexer中 _ = index.Add(pod1) _ = index.Add(pod2) _ = index.Add(pod3) //通过索引器函数查询数据 pods, err := index.ByIndex("namespace", "default") if err != nil { panic(err) } for _, pod := range pods { fmt.Println(pod.(v1.Pod).Name) } }