Skip to content

Commit c3eb69c

Browse files
committed
Fix access to Kubernetes Service from inside Windows Pod when two services have same NodeIp as backend (Overlay)
1 parent 00a1388 commit c3eb69c

File tree

2 files changed

+53
-15
lines changed

2 files changed

+53
-15
lines changed

pkg/proxy/winkernel/proxier.go

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,24 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *v1.ServicePort, ser
278278
return info
279279
}
280280

281+
func (network hnsNetworkInfo) findRemoteSubnetProviderAddress(ip string) string {
282+
var providerAddress string
283+
for _, rs := range network.remoteSubnets {
284+
_, ipNet, err := net.ParseCIDR(rs.destinationPrefix)
285+
if err != nil {
286+
klog.Fatalf("%v", err)
287+
}
288+
if ipNet.Contains(net.ParseIP(ip)) {
289+
providerAddress = rs.providerAddress
290+
}
291+
if ip == rs.providerAddress {
292+
providerAddress = rs.providerAddress
293+
}
294+
}
295+
296+
return providerAddress
297+
}
298+
281299
type endpointsChange struct {
282300
previous proxyEndpointsMap
283301
current proxyEndpointsMap
@@ -1153,24 +1171,12 @@ func (proxier *Proxier) syncProxyRules() {
11531171
return
11541172
}
11551173
proxier.network = *updatedNetwork
1156-
var providerAddress string
1157-
for _, rs := range proxier.network.remoteSubnets {
1158-
_, ipNet, err := net.ParseCIDR(rs.destinationPrefix)
1159-
if err != nil {
1160-
klog.Fatalf("%v", err)
1161-
}
1162-
if ipNet.Contains(net.ParseIP(ep.ip)) {
1163-
providerAddress = rs.providerAddress
1164-
}
1165-
if ep.ip == rs.providerAddress {
1166-
providerAddress = rs.providerAddress
1167-
containsNodeIP = true
1168-
}
1169-
}
1174+
1175+
providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip)
1176+
11701177
if len(providerAddress) == 0 {
11711178
klog.Infof("Could not find provider address for %s. Assuming it is a public IP", ep.ip)
11721179
providerAddress = proxier.nodeIP.String()
1173-
containsPublicIP = true
11741180
}
11751181

11761182
hnsEndpoint := &endpointsInfo{
@@ -1200,6 +1206,17 @@ func (proxier *Proxier) syncProxyRules() {
12001206
}
12011207
}
12021208

1209+
if proxier.network.networkType == "Overlay" {
1210+
providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip)
1211+
1212+
isNodeIP := (ep.ip == providerAddress)
1213+
isPublicIP := (len(providerAddress) == 0)
1214+
klog.Infof("Endpoint %s on overlay network %s is classified as NodeIp: %v, Public Ip: %v", ep.ip, hnsNetworkName, isNodeIP, isPublicIP)
1215+
1216+
containsNodeIP = containsNodeIP || isNodeIP
1217+
containsPublicIP = containsPublicIP || isPublicIP
1218+
}
1219+
12031220
// Save the hnsId for reference
12041221
LogJson(newHnsEndpoint, "Hns Endpoint resource", 1)
12051222
hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint)

pkg/proxy/winkernel/proxier_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,27 @@ func TestNoopEndpointSlice(t *testing.T) {
321321
p.OnEndpointSlicesSynced()
322322
}
323323

324+
func TestFindRemoteSubnetProviderAddress(t *testing.T) {
325+
networkInfo, _ := newFakeHNS().getNetworkByName("TestNetwork")
326+
pa := networkInfo.findRemoteSubnetProviderAddress(providerAddress)
327+
328+
if pa != providerAddress {
329+
t.Errorf("%v does not match %v", pa, providerAddress)
330+
}
331+
332+
pa = networkInfo.findRemoteSubnetProviderAddress(epIpAddressRemote)
333+
334+
if pa != providerAddress {
335+
t.Errorf("%v does not match %v", pa, providerAddress)
336+
}
337+
338+
pa = networkInfo.findRemoteSubnetProviderAddress(serviceVip)
339+
340+
if len(pa) != 0 {
341+
t.Errorf("Provider address is not empty as expected")
342+
}
343+
}
344+
324345
func makeNSN(namespace, name string) types.NamespacedName {
325346
return types.NamespacedName{Namespace: namespace, Name: name}
326347
}

0 commit comments

Comments
 (0)