github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/monitor/internal/kubernetes/client.go (about) 1 // +build !windows 2 3 package kubernetesmonitor 4 5 import ( 6 "fmt" 7 8 "go.uber.org/zap" 9 api "k8s.io/api/core/v1" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/fields" 12 "k8s.io/apimachinery/pkg/runtime" 13 "k8s.io/client-go/kubernetes" 14 kubecache "k8s.io/client-go/tools/cache" 15 "k8s.io/client-go/tools/clientcmd" 16 ) 17 18 // NewKubeClient Generate and initialize a Kubernetes client based on the parameter kubeconfig 19 func NewKubeClient(kubeconfig string) (*kubernetes.Clientset, error) { 20 config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) 21 if err != nil { 22 return nil, fmt.Errorf("Error Building config from Kubeconfig: %v", err) 23 } 24 25 return kubernetes.NewForConfig(config) 26 } 27 28 // CreateResourceController creates a controller for a specific ressource and namespace. 29 // The parameter function will be called on Add/Delete/Update events 30 func CreateResourceController(client kubecache.Getter, resource string, namespace string, apiStruct runtime.Object, selector fields.Selector, 31 addFunc func(addedApiStruct interface{}), deleteFunc func(deletedApiStruct interface{}), updateFunc func(oldApiStruct, updatedApiStruct interface{})) (kubecache.Store, kubecache.Controller) { 32 33 handlers := kubecache.ResourceEventHandlerFuncs{ 34 AddFunc: addFunc, 35 DeleteFunc: deleteFunc, 36 UpdateFunc: updateFunc, 37 } 38 39 listWatch := kubecache.NewListWatchFromClient(client, resource, namespace, selector) 40 store, controller := kubecache.NewInformer(listWatch, apiStruct, 0, handlers) 41 return store, controller 42 } 43 44 // CreateLocalPodController creates a controller specifically for Pods. 45 func (m *KubernetesMonitor) CreateLocalPodController(namespace string, 46 addFunc func(addedApiStruct *api.Pod) error, deleteFunc func(deletedApiStruct *api.Pod) error, updateFunc func(oldApiStruct, updatedApiStruct *api.Pod) error) (kubecache.Store, kubecache.Controller) { 47 48 return CreateResourceController(m.kubeClient.CoreV1().RESTClient(), "pods", namespace, &api.Pod{}, m.localNodeSelector(), 49 func(addedApiStruct interface{}) { 50 if err := addFunc(addedApiStruct.(*api.Pod)); err != nil { 51 zap.L().Error("Error while handling Add Pod", zap.Error(err)) 52 } 53 }, 54 func(deletedApiStruct interface{}) { 55 if err := deleteFunc(deletedApiStruct.(*api.Pod)); err != nil { 56 zap.L().Error("Error while handling Delete Pod", zap.Error(err)) 57 } 58 }, 59 func(oldApiStruct, updatedApiStruct interface{}) { 60 if err := updateFunc(oldApiStruct.(*api.Pod), updatedApiStruct.(*api.Pod)); err != nil { 61 zap.L().Error("Error while handling Update Pod", zap.Error(err)) 62 } 63 }) 64 } 65 66 func (m *KubernetesMonitor) localNodeSelector() fields.Selector { 67 return fields.Set(map[string]string{ 68 "spec.nodeName": m.localNode, 69 }).AsSelector() 70 } 71 72 // Pod returns the full pod object. 73 func (m *KubernetesMonitor) Pod(podName string, namespace string) (*api.Pod, error) { 74 targetPod, err := m.kubeClient.CoreV1().Pods(namespace).Get(podName, metav1.GetOptions{}) 75 if err != nil { 76 return nil, fmt.Errorf("error getting Kubernetes labels & IP for pod %v : %v ", podName, err) 77 } 78 return targetPod, nil 79 }