From f970b3413779ef817d2a374847bc0a4cb733a9a0 Mon Sep 17 00:00:00 2001 From: Yassine TIJANI Date: Wed, 9 Oct 2019 20:14:29 +0200 Subject: [PATCH] add a fallback for kube-scheduler when events.k8s.io is disabled Signed-off-by: Yassine TIJANI --- cmd/kube-scheduler/app/BUILD | 5 +++++ cmd/kube-scheduler/app/config/config.go | 6 +++--- cmd/kube-scheduler/app/options/BUILD | 1 - cmd/kube-scheduler/app/options/options.go | 14 ++++---------- cmd/kube-scheduler/app/server.go | 18 ++++++++++++++++-- .../k8s.io/client-go/tools/record/event.go | 19 +++++++++++++++++++ 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/cmd/kube-scheduler/app/BUILD b/cmd/kube-scheduler/app/BUILD index da40a48d17d..203554fe605 100644 --- a/cmd/kube-scheduler/app/BUILD +++ b/cmd/kube-scheduler/app/BUILD @@ -20,6 +20,8 @@ go_library( "//pkg/scheduler/metrics:go_default_library", "//pkg/util/configz:go_default_library", "//pkg/util/flag:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", @@ -30,8 +32,11 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/routes:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/term:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/events:go_default_library", "//staging/src/k8s.io/client-go/tools/leaderelection:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/component-base/cli/flag:go_default_library", "//staging/src/k8s.io/component-base/cli/globalflag:go_default_library", "//staging/src/k8s.io/component-base/logs:go_default_library", diff --git a/cmd/kube-scheduler/app/config/config.go b/cmd/kube-scheduler/app/config/config.go index f1c751491d1..04cc94fa10b 100644 --- a/cmd/kube-scheduler/app/config/config.go +++ b/cmd/kube-scheduler/app/config/config.go @@ -47,12 +47,12 @@ type Config struct { Client clientset.Interface InformerFactory informers.SharedInformerFactory PodInformer coreinformers.PodInformer - EventClient v1beta1.EventsGetter // TODO: Remove the following after fully migrating to the new events api. - CoreEventClient v1core.EventsGetter - LeaderElectionBroadcaster record.EventBroadcaster + CoreEventClient v1core.EventsGetter + CoreBroadcaster record.EventBroadcaster + EventClient v1beta1.EventsGetter Recorder events.EventRecorder Broadcaster events.EventBroadcaster diff --git a/cmd/kube-scheduler/app/options/BUILD b/cmd/kube-scheduler/app/options/BUILD index 306749d6723..d5b439fbb5d 100644 --- a/cmd/kube-scheduler/app/options/BUILD +++ b/cmd/kube-scheduler/app/options/BUILD @@ -32,7 +32,6 @@ go_library( "//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/events:go_default_library", "//staging/src/k8s.io/client-go/tools/leaderelection:go_default_library", "//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", diff --git a/cmd/kube-scheduler/app/options/options.go b/cmd/kube-scheduler/app/options/options.go index 3fc5e1340f5..e812fc90593 100644 --- a/cmd/kube-scheduler/app/options/options.go +++ b/cmd/kube-scheduler/app/options/options.go @@ -34,7 +34,6 @@ import ( restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "k8s.io/client-go/tools/events" "k8s.io/client-go/tools/leaderelection" "k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/client-go/tools/record" @@ -236,16 +235,13 @@ func (o *Options) Config() (*schedulerappconfig.Config, error) { return nil, err } - // Prepare event clients. - eventBroadcaster := events.NewBroadcaster(&events.EventSinkImpl{Interface: eventClient.EventsV1beta1().Events("")}) - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, c.ComponentConfig.SchedulerName) - leaderElectionBroadcaster := record.NewBroadcaster() - leaderElectionRecorder := leaderElectionBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: c.ComponentConfig.SchedulerName}) + coreBroadcaster := record.NewBroadcaster() + coreRecorder := coreBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: c.ComponentConfig.SchedulerName}) // Set up leader election if enabled. var leaderElectionConfig *leaderelection.LeaderElectionConfig if c.ComponentConfig.LeaderElection.LeaderElect { - leaderElectionConfig, err = makeLeaderElectionConfig(c.ComponentConfig.LeaderElection, leaderElectionClient, leaderElectionRecorder) + leaderElectionConfig, err = makeLeaderElectionConfig(c.ComponentConfig.LeaderElection, leaderElectionClient, coreRecorder) if err != nil { return nil, err } @@ -256,9 +252,7 @@ func (o *Options) Config() (*schedulerappconfig.Config, error) { c.PodInformer = scheduler.NewPodInformer(client, 0) c.EventClient = eventClient.EventsV1beta1() c.CoreEventClient = eventClient.CoreV1() - c.Recorder = recorder - c.Broadcaster = eventBroadcaster - c.LeaderElectionBroadcaster = leaderElectionBroadcaster + c.CoreBroadcaster = coreBroadcaster c.LeaderElection = leaderElectionConfig return c, nil diff --git a/cmd/kube-scheduler/app/server.go b/cmd/kube-scheduler/app/server.go index 90d067dd0b1..064cab23d7b 100644 --- a/cmd/kube-scheduler/app/server.go +++ b/cmd/kube-scheduler/app/server.go @@ -27,6 +27,8 @@ import ( "github.com/spf13/cobra" + "k8s.io/api/core/v1" + eventsv1beta1 "k8s.io/api/events/v1beta1" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/authentication/authenticator" "k8s.io/apiserver/pkg/authorization/authorizer" @@ -37,8 +39,11 @@ import ( "k8s.io/apiserver/pkg/server/mux" "k8s.io/apiserver/pkg/server/routes" "k8s.io/apiserver/pkg/util/term" + "k8s.io/client-go/kubernetes/scheme" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/events" "k8s.io/client-go/tools/leaderelection" + "k8s.io/client-go/tools/record" cliflag "k8s.io/component-base/cli/flag" "k8s.io/component-base/cli/globalflag" "k8s.io/component-base/logs" @@ -168,6 +173,15 @@ func Run(ctx context.Context, cc schedulerserverconfig.CompletedConfig, registry } } + // Prepare event clients. + if _, err := cc.Client.Discovery().ServerResourcesForGroupVersion(eventsv1beta1.SchemeGroupVersion.String()); err == nil { + cc.Broadcaster = events.NewBroadcaster(&events.EventSinkImpl{Interface: cc.EventClient.Events("")}) + cc.Recorder = cc.Broadcaster.NewRecorder(scheme.Scheme, cc.ComponentConfig.SchedulerName) + } else { + recorder := cc.CoreBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: cc.ComponentConfig.SchedulerName}) + cc.Recorder = record.NewEventRecorderAdapter(recorder) + } + // Create the scheduler. sched, err := scheduler.New(cc.Client, cc.InformerFactory, @@ -194,8 +208,8 @@ func Run(ctx context.Context, cc schedulerserverconfig.CompletedConfig, registry if cc.Broadcaster != nil && cc.EventClient != nil { cc.Broadcaster.StartRecordingToSink(ctx.Done()) } - if cc.LeaderElectionBroadcaster != nil && cc.CoreEventClient != nil { - cc.LeaderElectionBroadcaster.StartRecordingToSink(&corev1.EventSinkImpl{Interface: cc.CoreEventClient.Events("")}) + if cc.CoreBroadcaster != nil && cc.CoreEventClient != nil { + cc.CoreBroadcaster.StartRecordingToSink(&corev1.EventSinkImpl{Interface: cc.CoreEventClient.Events("")}) } // Setup healthz checks. var checks []healthz.HealthChecker diff --git a/staging/src/k8s.io/client-go/tools/record/event.go b/staging/src/k8s.io/client-go/tools/record/event.go index 8200df5d630..159acee4b7d 100644 --- a/staging/src/k8s.io/client-go/tools/record/event.go +++ b/staging/src/k8s.io/client-go/tools/record/event.go @@ -132,6 +132,25 @@ type EventBroadcaster interface { Shutdown() } +// EventRecorderAdapter is a wrapper around EventRecorder implementing the +// new EventRecorder interface. +type EventRecorderAdapter struct { + recorder EventRecorder +} + +// NewEventRecorderAdapter returns an adapter implementing new EventRecorder +// interface. +func NewEventRecorderAdapter(recorder EventRecorder) *EventRecorderAdapter { + return &EventRecorderAdapter{ + recorder: recorder, + } +} + +// Eventf is a wrapper around v1 Eventf +func (a *EventRecorderAdapter) Eventf(regarding, _ runtime.Object, eventtype, reason, action, note string, args ...interface{}) { + a.recorder.Eventf(regarding, eventtype, reason, note, args...) +} + // Creates a new event broadcaster. func NewBroadcaster() EventBroadcaster { return &eventBroadcasterImpl{