code: func newSharedNodeInformer(client clientset.Interface, nodeName string,
  	addFunc func(newObj interface{}),
  	updateFunc func(oldObj interface{}, newObj interface{}),
  	deleteFunc func(deletedObj interface{})) cache.SharedInformer {
  	// select nodes by name
  	fieldselector := fields.OneTermEqualSelector("metadata.name", nodeName)
  
  	// add some randomness to resync period, which can help avoid controllers falling into lock-step
  	minResyncPeriod := 15 * time.Minute
  	factor := rand.Float64() + 1
  	resyncPeriod := time.Duration(float64(minResyncPeriod.Nanoseconds()) * factor)
  
  	lw := &cache.ListWatch{
  		ListFunc: func(options metav1.ListOptions) (kuberuntime.Object, error) {
  			return client.CoreV1().Nodes().List(metav1.ListOptions{
  				FieldSelector: fieldselector.String(),
  			})
  		},
  		WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
  			return client.CoreV1().Nodes().Watch(metav1.ListOptions{
  				FieldSelector:   fieldselector.String(),
  				ResourceVersion: options.ResourceVersion,
  			})
  		},
  	}
  
  	handler := cache.ResourceEventHandlerFuncs{
  		AddFunc:    addFunc,
  		UpdateFunc: updateFunc,
  		DeleteFunc: deleteFunc,
  	}
  
  	informer := cache.NewSharedInformer(lw, &apiv1.Node{}, resyncPeriod)
  	informer.AddEventHandler(handler)
  
  	return informer
  }
docs: // newSharedNodeInformer returns a shared informer that uses `client` to watch the Node with
  // `nodeName` for changes and respond with `addFunc`, `updateFunc`, and `deleteFunc`.