-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
informer.go
120 lines (102 loc) · 2.92 KB
/
informer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"time"
"k8s.io/client-go/informers"
coreinformers "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/kubernetes"
klog "k8s.io/klog/v2"
"k8s.io/api/core/v1"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/component-base/logs"
)
// PodLoggingController logs the name and namespace of pods that are added,
// deleted, or updated
type PodLoggingController struct {
informerFactory informers.SharedInformerFactory
podInformer coreinformers.PodInformer
}
// Run starts shared informers and waits for the shared informer cache to
// synchronize.
func (c *PodLoggingController) Run(stopCh chan struct{}) error {
// Starts all the shared informers that have been created by the factory so
// far.
c.informerFactory.Start(stopCh)
// wait for the initial synchronization of the local cache.
if !cache.WaitForCacheSync(stopCh, c.podInformer.Informer().HasSynced) {
return fmt.Errorf("failed to sync")
}
return nil
}
func (c *PodLoggingController) podAdd(obj interface{}) {
pod := obj.(*v1.Pod)
klog.Infof("POD CREATED: %s/%s", pod.Namespace, pod.Name)
}
func (c *PodLoggingController) podUpdate(old, new interface{}) {
oldPod := old.(*v1.Pod)
newPod := new.(*v1.Pod)
klog.Infof(
"POD UPDATED. %s/%s %s",
oldPod.Namespace, oldPod.Name, newPod.Status.Phase,
)
}
func (c *PodLoggingController) podDelete(obj interface{}) {
pod := obj.(*v1.Pod)
klog.Infof("POD DELETED: %s/%s", pod.Namespace, pod.Name)
}
// NewPodLoggingController creates a PodLoggingController
func NewPodLoggingController(informerFactory informers.SharedInformerFactory) (*PodLoggingController, error) {
podInformer := informerFactory.Core().V1().Pods()
c := &PodLoggingController{
informerFactory: informerFactory,
podInformer: podInformer,
}
_, err := podInformer.Informer().AddEventHandler(
// Your custom resource event handlers.
cache.ResourceEventHandlerFuncs{
// Called on creation
AddFunc: c.podAdd,
// Called on resource update and every resyncPeriod on existing resources.
UpdateFunc: c.podUpdate,
// Called on resource deletion.
DeleteFunc: c.podDelete,
},
)
if err != nil {
return nil, err
}
return c, nil
}
var kubeconfig string
func init() {
flag.StringVar(&kubeconfig, "kubeconfig", filepath.Join(os.Getenv("HOME"), ".kube", "config"), "absolute path to the kubeconfig file")
}
func main() {
flag.Parse()
logs.InitLogs()
defer logs.FlushLogs()
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
klog.Fatal(err)
}
factory := informers.NewSharedInformerFactory(clientset, time.Hour*24)
controller, err := NewPodLoggingController(factory)
if err != nil {
klog.Fatal(err)
}
stop := make(chan struct{})
defer close(stop)
err = controller.Run(stop)
if err != nil {
klog.Fatal(err)
}
select {}
}