From c72ac98781bac4321a5cc30bc27417ed42718536 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/proxy/config/config.go b/pkg/proxy/config/config.go index 2419972f2c054..9a090d27b56a1 100644 --- a/pkg/proxy/config/config.go +++ b/pkg/proxy/config/config.go @@ -75,11 +75,9 @@ type EndpointSliceConfig struct { // NewEndpointSliceConfig creates a new EndpointSliceConfig. func NewEndpointSliceConfig(endpointSliceInformer discoveryv1informers.EndpointSliceInformer, resyncPeriod time.Duration) *EndpointSliceConfig { - result := &EndpointSliceConfig{ - listerSynced: endpointSliceInformer.Informer().HasSynced, - } + result := &EndpointSliceConfig{} - _, _ = endpointSliceInformer.Informer().AddEventHandlerWithResyncPeriod( + handlerRegistration, _ := endpointSliceInformer.Informer().AddEventHandlerWithResyncPeriod( cache.ResourceEventHandlerFuncs{ AddFunc: result.handleAddEndpointSlice, UpdateFunc: result.handleUpdateEndpointSlice, @@ -88,6 +86,8 @@ func NewEndpointSliceConfig(endpointSliceInformer discoveryv1informers.EndpointS resyncPeriod, ) + result.listerSynced = handlerRegistration.HasSynced + return result } @@ -166,11 +166,9 @@ type ServiceConfig struct { // NewServiceConfig creates a new ServiceConfig. func NewServiceConfig(serviceInformer v1informers.ServiceInformer, resyncPeriod time.Duration) *ServiceConfig { - result := &ServiceConfig{ - listerSynced: serviceInformer.Informer().HasSynced, - } + result := &ServiceConfig{} - _, _ = serviceInformer.Informer().AddEventHandlerWithResyncPeriod( + handlerRegistration, _ := serviceInformer.Informer().AddEventHandlerWithResyncPeriod( cache.ResourceEventHandlerFuncs{ AddFunc: result.handleAddService, UpdateFunc: result.handleUpdateService, @@ -179,6 +177,8 @@ func NewServiceConfig(serviceInformer v1informers.ServiceInformer, resyncPeriod resyncPeriod, ) + result.listerSynced = handlerRegistration.HasSynced + return result }