我需要在client-go的帮助下编写一个golang
应用程序,该应用程序将监听/监视一个特定的名称空间,以查找这些事件:
- 一个新的pod已经创建
- 一个pod已被删除
- 一个新的容器被添加到现有的pod
- 任何pod的容器图像已更改
我想把这个信息传递给另一个运行在其他命名空间的应用程序。
我对client-go
库非常陌生,我搜索了他们的文档,但在Kopf
中找不到类似事件的东西。我是这个库的新手,我找不到这样做的方法/函数。我不需要做这件事的完整代码,但我很感激我可以看到的地方,所以我可以找到我的出路
有人能帮我一下吗?您可以通过解析kubecconfig文件创建一个客户集,然后使用该客户集为您的特定名称空间创建一个sharedInformerfactory。为你的pod添加一个通知器,并添加事件处理函数。根据您的需求实现这些功能。您可以在OnUpdate
函数中检查oldPod和newPod之间的容器更新。使用客户端集来与其他应用程序进行通信。我建议研究一下clientset实现的方法,以详细了解它是如何工作的。
package main
import (
"flag"
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"k8s.io/klog/v2"
"path/filepath"
"time"
)
func main() {
// parse the .kubeconfig file
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
// create config from the kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
// create the clientset
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
// stop signal for the informer
stopper := make(chan struct{})
defer close(stopper)
// create shared informers for resources in all known API group versions with a reSync period and namespace
factory := informers.NewSharedInformerFactoryWithOptions(clientSet, 10*time.Second, informers.WithNamespace("demo"))
podInformer := factory.Core().V1().Pods().Informer()
defer runtime.HandleCrash()
// start informer ->
go factory.Start(stopper)
// start to sync and call list
if !cache.WaitForCacheSync(stopper, podInformer.HasSynced) {
runtime.HandleError(fmt.Errorf("Timed out waiting for caches to sync"))
return
}
podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: onAdd, // register add eventhandler
UpdateFunc: onUpdate,
DeleteFunc: onDelete,
})
// block the main go routine from exiting
<-stopper
}
func onAdd(obj interface{}) {
pod := obj.(*corev1.Pod)
klog.Infof("POD CREATED: %s/%s", pod.Namespace, pod.Name)
}
func onUpdate(oldObj interface{}, newObj interface{}) {
oldPod := oldObj.(*corev1.Pod)
newPod := newObj.(*corev1.Pod)
klog.Infof(
"POD UPDATED. %s/%s %s",
oldPod.Namespace, oldPod.Name, newPod.Status.Phase,
)
}
func onDelete(obj interface{}) {
pod := obj.(*corev1.Pod)
klog.Infof("POD DELETED: %s/%s", pod.Namespace, pod.Name)
}
您可以使用kubernetes-event-export或kube-eventer之类的工具,并使用不同的sink发送消息。