From e637b832c5fa57bcd1c8468dd07a5bcc6fde42fb Mon Sep 17 00:00:00 2001 From: David Cheung Date: Mon, 10 Apr 2023 16:43:42 +0000 Subject: [PATCH] include dual stack for degraded mode --- pkg/neg/syncers/endpoints_calculator.go | 2 +- pkg/neg/syncers/utils.go | 48 +++++++++++++------------ pkg/neg/syncers/utils_test.go | 4 +-- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/pkg/neg/syncers/endpoints_calculator.go b/pkg/neg/syncers/endpoints_calculator.go index 2b6d8a13cb..3f6b3a67ab 100644 --- a/pkg/neg/syncers/endpoints_calculator.go +++ b/pkg/neg/syncers/endpoints_calculator.go @@ -219,7 +219,7 @@ func (l *L7EndpointsCalculator) CalculateEndpoints(eds []types.EndpointsData, _ // CalculateEndpoints determines the endpoints in the NEGs based on the current service endpoints and the current NEGs. func (l *L7EndpointsCalculator) CalculateEndpointsDegradedMode(eds []types.EndpointsData, _ map[string]types.NetworkEndpointSet) (map[string]types.NetworkEndpointSet, types.EndpointPodMap, error) { - result := toZoneNetworkEndpointMapDegradedMode(eds, l.zoneGetter, l.podLister, l.nodeLister, l.servicePortName, l.networkEndpointType) + result := toZoneNetworkEndpointMapDegradedMode(eds, l.zoneGetter, l.podLister, l.nodeLister, l.servicePortName, l.networkEndpointType, l.enableDualStackNEG) return result.NetworkEndpointSet, result.EndpointPodMap, nil } diff --git a/pkg/neg/syncers/utils.go b/pkg/neg/syncers/utils.go index d5985e428a..0037d82a26 100644 --- a/pkg/neg/syncers/utils.go +++ b/pkg/neg/syncers/utils.go @@ -371,15 +371,11 @@ func getEndpointPod( // toZoneNetworkEndpointMap translates addresses in endpoints object into zone and endpoints map, and also return the count for duplicated endpoints // we will not raise error in degraded mode for misconfigured endpoints, instead they will be filtered directly -func toZoneNetworkEndpointMapDegradedMode( - eds []negtypes.EndpointsData, - zoneGetter negtypes.ZoneGetter, - podLister, nodeLister cache.Indexer, - servicePortName string, - networkEndpointType negtypes.NetworkEndpointType, -) ZoneNetworkEndpointMapResult { +func toZoneNetworkEndpointMapDegradedMode(eds []negtypes.EndpointsData, zoneGetter negtypes.ZoneGetter, podLister, nodeLister cache.Indexer, servicePortName string, networkEndpointType negtypes.NetworkEndpointType, enableDualStackNEG bool) ZoneNetworkEndpointMapResult { zoneNetworkEndpointMap := map[string]negtypes.NetworkEndpointSet{} networkEndpointPodMap := negtypes.EndpointPodMap{} + dupCount := 0 + ipsForPod := ipsForPod(eds) for _, ed := range eds { matchPort := "" for _, port := range ed.Ports { @@ -392,7 +388,7 @@ func toZoneNetworkEndpointMapDegradedMode( continue } for _, endpointAddress := range ed.Addresses { - if endpointAddress.AddressType != discovery.AddressTypeIPv4 { + if !enableDualStackNEG && endpointAddress.AddressType != discovery.AddressTypeIPv4 { klog.Infof("Skipping non IPv4 address in degraded mode: %q, in endpoint slice %s/%s", endpointAddress.Addresses, ed.Meta.Namespace, ed.Meta.Name) continue } @@ -414,23 +410,29 @@ func toZoneNetworkEndpointMapDegradedMode( if zoneNetworkEndpointMap[zone] == nil { zoneNetworkEndpointMap[zone] = negtypes.NewNetworkEndpointSet() } - for _, address := range endpointAddress.Addresses { - networkEndpoint := negtypes.NetworkEndpoint{IP: address, Port: matchPort, Node: nodeName} - if networkEndpointType == negtypes.NonGCPPrivateEndpointType { - // Non-GCP network endpoints don't have associated nodes. - networkEndpoint.Node = "" - } - zoneNetworkEndpointMap[zone].Insert(networkEndpoint) - - if existingPod, contains := networkEndpointPodMap[networkEndpoint]; contains { - // if existing name is alphabetically lower than current one, continue and don't replace - if existingPod.Name < endpointAddress.TargetRef.Name { - klog.Infof("Found duplicate endpoints for %q, save the pod information from the alphabetically higher pod", address) - continue - } + + podIPs := ipsForPod[types.NamespacedName{Namespace: endpointAddress.TargetRef.Namespace, Name: endpointAddress.TargetRef.Name}] + networkEndpoint := negtypes.NetworkEndpoint{IP: podIPs.IP, Port: matchPort, Node: nodeName} + if enableDualStackNEG { + // Convert all addresses to a standard form as per rfc5952 to prevent + // accidental diffs resulting from different formats. + networkEndpoint.IPv6 = parseIPAddress(podIPs.IPv6) + } + if networkEndpointType == negtypes.NonGCPPrivateEndpointType { + // Non-GCP network endpoints don't have associated nodes. + networkEndpoint.Node = "" + } + zoneNetworkEndpointMap[zone].Insert(networkEndpoint) + + // if existing name is alphabetically lower than current one, continue and don't replace + if existingPod, contains := networkEndpointPodMap[networkEndpoint]; contains { + dupCount += 1 + if existingPod.Name < endpointAddress.TargetRef.Name { + klog.Infof("Found duplicate endpoints for %v, save the pod information from the alphabetically higher pod", networkEndpoint) + continue // if existing name is alphabetically lower than current one, continue and don't replace } - networkEndpointPodMap[networkEndpoint] = types.NamespacedName{Namespace: endpointAddress.TargetRef.Namespace, Name: endpointAddress.TargetRef.Name} } + networkEndpointPodMap[networkEndpoint] = types.NamespacedName{Namespace: endpointAddress.TargetRef.Namespace, Name: endpointAddress.TargetRef.Name} } } return ZoneNetworkEndpointMapResult{ diff --git a/pkg/neg/syncers/utils_test.go b/pkg/neg/syncers/utils_test.go index f15e4df8ea..4a69932d12 100644 --- a/pkg/neg/syncers/utils_test.go +++ b/pkg/neg/syncers/utils_test.go @@ -1648,7 +1648,7 @@ func TestToZoneNetworkEndpointMapDegradedMode(t *testing.T) { } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - result := toZoneNetworkEndpointMapDegradedMode(negtypes.EndpointsDataFromEndpointSlices(tc.testEndpointSlices), fakeZoneGetter, podLister, nodeLister, tc.portName, tc.networkEndpointType) + result := toZoneNetworkEndpointMapDegradedMode(negtypes.EndpointsDataFromEndpointSlices(tc.testEndpointSlices), fakeZoneGetter, podLister, nodeLister, tc.portName, tc.networkEndpointType, false) if !reflect.DeepEqual(result.NetworkEndpointSet, tc.expectedEndpointMap) { t.Errorf("degraded mode endpoint set is not calculated correctly:\ngot %+v,\n expected %+v", result.NetworkEndpointSet, tc.expectedEndpointMap) } @@ -1785,7 +1785,7 @@ func TestDegradedModeValidateEndpointInfo(t *testing.T) { } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - result := toZoneNetworkEndpointMapDegradedMode(negtypes.EndpointsDataFromEndpointSlices(tc.testEndpointSlices), fakeZoneGetter, podLister, nodeLister, emptyNamedPort, tc.endpointType) + result := toZoneNetworkEndpointMapDegradedMode(negtypes.EndpointsDataFromEndpointSlices(tc.testEndpointSlices), fakeZoneGetter, podLister, nodeLister, emptyNamedPort, tc.endpointType, false) if !reflect.DeepEqual(result.NetworkEndpointSet, tc.expectedEndpointMap) { t.Errorf("degraded mode endpoint set is not calculated correctly:\ngot %+v,\n expected %+v", result.NetworkEndpointSet, tc.expectedEndpointMap) }