diff --git a/cluster-autoscaler/utils/kubernetes/factory.go b/cluster-autoscaler/utils/kubernetes/factory.go index 2ab478b5f2db..7a611104d577 100644 --- a/cluster-autoscaler/utils/kubernetes/factory.go +++ b/cluster-autoscaler/utils/kubernetes/factory.go @@ -27,12 +27,31 @@ import ( "k8s.io/klog" ) +const ( + // Rate of refill for the event spam filter in client go + // 1 per event key per 5 minutes. + defaultQPS = 1. / 300. + // Number of events allowed per event key before rate limiting is triggered + // Has to greater than or equal to 1. + defaultBurstSize = 1 + // Number of distinct event keys in the rate limiting cache. + defaultLRUCache = 8192 +) + // CreateEventRecorder creates an event recorder to send custom events to Kubernetes to be recorded for targeted Kubernetes objects func CreateEventRecorder(kubeClient clientset.Interface) kube_record.EventRecorder { - eventBroadcaster := kube_record.NewBroadcaster() + eventBroadcaster := kube_record.NewBroadcasterWithCorrelatorOptions(getCorrelationOptions()) eventBroadcaster.StartLogging(klog.V(4).Infof) if _, isfake := kubeClient.(*fake.Clientset); !isfake { eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.CoreV1().RESTClient()).Events("")}) } return eventBroadcaster.NewRecorder(scheme.Scheme, clientv1.EventSource{Component: "cluster-autoscaler"}) } + +func getCorrelationOptions() kube_record.CorrelatorOptions { + return kube_record.CorrelatorOptions{ + QPS: defaultQPS, + BurstSize: defaultBurstSize, + LRUCacheSize: defaultLRUCache, + } +}