一、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)
}
}