From f520ede8140b79c82471af3f3448d4c54ddcea8b Mon Sep 17 00:00:00 2001 From: Will Daly Date: Tue, 30 Jul 2024 10:07:05 -0700 Subject: [PATCH] kube-proxy: initialization wait for service and endpoint handlers synced Ensure kube-proxy waits for the services/endpointslices informer caches to be synced *and* all pre-sync events delivered before setting isInitialized=true. Otherwise, in clusters with many services, some services may be missing from svcPortMap when kube-proxy starts (e.g. during daemonset rollout). This can cause kube-proxy to temporarily remove service DNAT rules and then skip cleanup of UDP conntrack entries to a service VIP. Resolves: https://github.com/kubernetes/kubernetes/issues/126468 --- pkg/proxy/config/config.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/proxy/config/config.go b/pkg/proxy/config/config.go index 373cd0a1c64..5097ab52715 100644 --- a/pkg/proxy/config/config.go +++ b/pkg/proxy/config/config.go @@ -78,11 +78,10 @@ type EndpointSliceConfig struct { // NewEndpointSliceConfig creates a new EndpointSliceConfig. func NewEndpointSliceConfig(ctx context.Context, endpointSliceInformer discoveryv1informers.EndpointSliceInformer, resyncPeriod time.Duration) *EndpointSliceConfig { result := &EndpointSliceConfig{ - listerSynced: endpointSliceInformer.Informer().HasSynced, - logger: klog.FromContext(ctx), + logger: klog.FromContext(ctx), } - _, _ = endpointSliceInformer.Informer().AddEventHandlerWithResyncPeriod( + handlerRegistration, _ := endpointSliceInformer.Informer().AddEventHandlerWithResyncPeriod( cache.ResourceEventHandlerFuncs{ AddFunc: result.handleAddEndpointSlice, UpdateFunc: result.handleUpdateEndpointSlice, @@ -91,6 +90,8 @@ func NewEndpointSliceConfig(ctx context.Context, endpointSliceInformer discovery resyncPeriod, ) + result.listerSynced = handlerRegistration.HasSynced + return result } @@ -171,11 +172,10 @@ type ServiceConfig struct { // NewServiceConfig creates a new ServiceConfig. func NewServiceConfig(ctx context.Context, serviceInformer v1informers.ServiceInformer, resyncPeriod time.Duration) *ServiceConfig { result := &ServiceConfig{ - listerSynced: serviceInformer.Informer().HasSynced, - logger: klog.FromContext(ctx), + logger: klog.FromContext(ctx), } - _, _ = serviceInformer.Informer().AddEventHandlerWithResyncPeriod( + handlerRegistration, _ := serviceInformer.Informer().AddEventHandlerWithResyncPeriod( cache.ResourceEventHandlerFuncs{ AddFunc: result.handleAddService, UpdateFunc: result.handleUpdateService, @@ -184,6 +184,8 @@ func NewServiceConfig(ctx context.Context, serviceInformer v1informers.ServiceIn resyncPeriod, ) + result.listerSynced = handlerRegistration.HasSynced + return result }