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
This commit is contained in:
Will Daly 2024-07-30 10:07:05 -07:00
parent 6cca485fe7
commit c72ac98781

View File

@ -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
}