首页 > 其他分享 >K8s client-go watch pod

K8s client-go watch pod

时间:2022-10-18 21:04:29浏览次数:81  
标签:EventHandler k8s log go pod K8s event

一.前言

我们在使用 kubectl 操作 k8s 时,可以在命令中加入 -w来观察资源变化,比如 kubectl get pod -w 观察 pod 状态变化。出了使用控制台,还可以编写代码和 k8s 交互来获取 pod 变更。

二.代码实现

k8s client-go:https://github.com/kubernetes/client-go

安装 package: go get k8s.io/client-go

config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(os.Getenv("HOME"), ".kube", "config"))
if err != nil {
	log.Fatal(err)
}

// 创建 client
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
	log.Fatal(err)
}

factory := informers.NewSharedInformerFactoryWithOptions(clientSet, 0, informers.WithNamespace("default"))
informer := factory.Core().V1().Pods().Informer()
informer.AddEventHandler(NewEventHandler())

stopper := make(chan struct{}, 2)
go informer.Run(stopper)
log.Println("watch pod started...")

sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

<-sigs
stopper <- struct{}{}
close(stopper)
log.Println("watch pod stopped...")

处理程序:

type EventHandler struct {
}

func NewEventHandler() *EventHandler {
	return &EventHandler{}
}

func (e *EventHandler) OnAdd(obj interface{}) {
	event := obj.(*corev1.Pod)
	log.Printf("OnAdd: %s", event.ObjectMeta.Name)
}

func (e *EventHandler) OnUpdate(oldObj, newObj interface{}) {
	event := newObj.(*corev1.Pod)
	log.Printf("OnUpdate: %s", event.ObjectMeta.Name)

}

func (e *EventHandler) OnDelete(obj interface{}) {
	event := obj.(*corev1.Pod)
	log.Printf("OnDelete: %s", event.ObjectMeta.Name)

}

三.总结

基于 k8s 声明式 API 和 informer 机制,不仅仅是 pod,k8s 所有资源都可以被 watch,只需替换 factory.Core().V1().Pods().Informer() 中的 Pods 为其他资源即可,比如 Events、ConfigMaps 等等。

Demo:https://github.com/stulzq/blog-demo-go/tree/main/k8s/watch-pod

标签:EventHandler,k8s,log,go,pod,K8s,event
From: https://www.cnblogs.com/stulzq/p/16804094.html

相关文章

  • 01-Go语言的特性
    并发编程go的并发执行单元叫gorutine的协程,比线程更轻量,开销更小,性能更高,操作起来非常简单,一台机器上可以启动成千上万个协程,协程间的上下文切换,无需下到内核层,高效不少......
  • K8S集群部署
     ###############  K8S集群部署 ##################版本kubelet-1.18.0kubeadm-1.18.0kubectl-1.18.0docker-18.06.1calico-v3.20###机器172.31.16.2k......
  • K8s为什么要弃用 Dockershim?
    转载:https://blog.csdn.net/agonie201218/article/details/127287323在写“K8s”系列文章的过程中,很多读者留言询问K8s弃用Docker的事,担心现在学习Docker是否还值得......
  • golang中的init初始化函数
    0.1、索引https://waterflow.link/articles/16660905308801、概念1.1、源文件里的代码执行顺序init函数是用于初始化应用程序状态的函数。它不接受任何参数并且不返回......
  • k8s基本命令
    k8s的流程编写dockerfile使用控制器来部署应用使用服务来对外暴露应用1.创建应用使用命令来创建kubectlcreatedeploymentnginx--image=nginx:1.14使用yaml文件创建ku......
  • golang中的init初始化函数
    0.1、索引https://waterflow.link/articles/16660905308801、概念1.1、源文件里的代码执行顺序init函数是用于初始化应用程序状态的函数。它不接受任何参数并且不返......
  • k8s-master节点的安装2
    k8s-master节点的安装21.环境准备图1注意事项:先增加host解析,再配置yum源,三个节点的yum源都改好了。如图2所示 ......
  • Go 互斥锁Mutex
    Mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。互斥锁的作用是保证共享资源同一时刻只能被一个Gor......
  • django之五--获取url参数和name的作用
    一、前言假如我们要打开这两个地址:会发现这两个地址的最大差别就是时间参数的值是动态的(年和月的值是动态的)。那么,如果我们想要获取地址里面的【2018】和【07】这两个值,就......
  • django报错 'WSGIRequest' object has no attribute 'session'
    最新学python的django后台用到session,报错'WSGIRequest'objecthasnoattribute'session'开始以为是session问题,结果去掉session仍报类似'WSGIRequest'objecthasno......