Reflector is a key components for Kubernetes clients, kube-scheduler and Replication Controller. Reflector is in the middle between client and Kubernetes API-server.
Here is the definition of Reflector.

As shown in the definition, there are two important compoents of a Reflector:
-
ListerWatcher
It provides two functions: List and Watch. These two functions will call API-server, and get the Events.
-
Store
It is usually a in-memory storage, such as HashMap, or Queue(for FIFO). Reflector will add the Events into this Store.
It should be noted that the reflect.Type is usually a Kind of Kubernetes Object, such as Pod, Node.
Before going deeper into the implementation of Reflector, let's have a look at how Reflector can be used from a example. This example will watch the changes(including ADD, DELETE, MODIFY) of all the Pods in the Kubernetes cluster, and print out the changes. In addition, it will also print all the Pod names every 30 seconds.
func main() {
client := getKubeClient()
if client == nil {
fmt.Println("failed to get kubeclient")
return
}
stopCh := make(chan struct{})
store := cache.NewStore(cache.MetaNamespaceKeyFunc)
//selector := fields.SelectorFromSet(nil)
selector := fields.Everything()
namespace := ""
listWatch := cache.NewListWatchFromClient(client.CoreV1Client.RESTClient(),
"pods",
namespace,
selector)
r := cache.NewReflector(listWatch, &v1.Pod{}, store, 0)
r.RunUntil(stopCh)
for i := 1; i < 20; i++ {
time.Sleep(30 * time.Second)
printContent(store.ListKeys())
}
time.Sleep(10 * time.Second)
printContent(store.ListKeys())
close(stopCh)
}
From this example, we can see that Reflector uses Kube-client to list and watch all the Pods, and store the changes in the Store.

The implementation of Reflector is in Kubernetes Go Client tools/cache/ package. Reflector.RunUntil() function will periodly call Reflector.ListAndWatch() function.
As the name suggests, Reflector.ListAndWatch() will first list all the Objects and store them in the Store; then it will watch the changes and handle the changes with Reflector.watchHandler() function.Following is the skech of the Reflector.ListAndWatch() and Reflector.watchHandler() functions.
As shown in the definition of Reflctor.ListAndWatch(), Reflector first call kubeclient.List() to get all the Objects (in the previous example, they are Pods), and add all these Objects into the Store by Reflector.syncWith(). Then Reflector will call kubeclient.Watch(). As this Watch() call has timeout, it will call kubeclient.Watch() repeatedly.

