diff --git a/pkg/neg/manager.go b/pkg/neg/manager.go index 844b5476ed..1e139d3db6 100644 --- a/pkg/neg/manager.go +++ b/pkg/neg/manager.go @@ -140,6 +140,13 @@ func (manager *syncerManager) EnsureSyncers(namespace, name string, newPorts neg syncerKey := getSyncerKey(namespace, name, svcPort, portInfo) syncer, ok := manager.syncerMap[syncerKey] if !ok { + + // To ensure that a NEG CR always exists during the lifecyle of a NEG, do not create a syncer for the NEG until the NEG CR is successfully created. This will reduce the possibility of invalid states and reduces complexity of garbage collection + if err := manager.ensureSvcNegCR(key, portInfo); err != nil { + errList = append(errList, err) + continue + } + // determine the implementation that calculates NEG endpoints on each sync. epc := negsyncer.GetEndpointsCalculator(manager.nodeLister, manager.podLister, manager.zoneGetter, syncerKey, portInfo.RandomizeEndpoints) @@ -163,10 +170,6 @@ func (manager *syncerManager) EnsureSyncers(namespace, name string, newPorts neg manager.syncerMap[syncerKey] = syncer } - if err := manager.ensureSvcNegCR(key, portInfo); err != nil { - errList = append(errList, err) - } - if syncer.IsStopped() { if err := syncer.Start(); err != nil { errList = append(errList, err) @@ -430,11 +433,6 @@ func (manager *syncerManager) ensureSvcNegCR(svcKey serviceKey, portInfo negtype return err } - if !negCR.GetDeletionTimestamp().IsZero() { - // Allow GC to complete - return fmt.Errorf("Neg CR already exists with this name and is marked for deletion. Allow GC to complete before recreating.") - } - needUpdate, err := ensureNegCRLabels(negCR, labels) if err != nil { return err diff --git a/pkg/neg/manager_test.go b/pkg/neg/manager_test.go index 3f0e0efa42..f9f3c9d475 100644 --- a/pkg/neg/manager_test.go +++ b/pkg/neg/manager_test.go @@ -842,7 +842,7 @@ func TestNegCRDuplicateCreations(t *testing.T) { svc: svc1, svcTuple: svcTuple1, markedForDeletion: true, - expectErr: true, + expectErr: false, crExists: true, }, {desc: "same service, different port configuration, original cr is not marked for deletion",