Kubernetes Informers

有时候去使用 client-go 的时候会去频率高的查 pod 的状态,这会给 api-server 造成压力,有什么办法可以本地缓存呢一份数据呢,k8s.io/client-go/tools/cache 这就是缓存库

先介绍一个和缓存库相关连的 Informer k8s.io/client-go/informers 它可以创建一个为 k8s 所有资源创建一个工厂,来镜像 kubernetes.Interface type

代码示例如下

package main

import (
    "log"
    "os"

    v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/informers"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/cache"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    kubeconfig := os.Getenv("KUBECONFIG")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    factory := informers.NewSharedInformerFactory(clientset, 0)
    informer := factory.Core().V1().Pods().Informer()
    stopper := make(chan struct{})
    defer close(stopper)
    informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: func(obj interface{}) {
            // "k8s.io/apimachinery/pkg/apis/meta/v1" provides an Object
            // interface that allows us to get metadata easily
            mObj := obj.(v1.Object)
            log.Printf("New Pod Added to Store: %s", mObj.GetName())
        },
    })

    informer.Run(stopper)
}

Dynamic Informer

Last updated

Was this helpful?