Skip to content

Commit 6ac3ca4

Browse files
authored
Merge pull request kubernetes#91886 from sbangari/fixsourcevip
Fix access to Kubernetes Service from inside Windows Pod when two ser…
2 parents dbfc3aa + c3eb69c commit 6ac3ca4

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
@@ -290,6 +290,24 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *v1.ServicePort, ser
290290
return info
291291
}
292292

293+
func (network hnsNetworkInfo) findRemoteSubnetProviderAddress(ip string) string {
294+
var providerAddress string
295+
for _, rs := range network.remoteSubnets {
296+
_, ipNet, err := net.ParseCIDR(rs.destinationPrefix)
297+
if err != nil {
298+
klog.Fatalf("%v", err)
299+
}
300+
if ipNet.Contains(net.ParseIP(ip)) {
301+
providerAddress = rs.providerAddress
302+
}
303+
if ip == rs.providerAddress {
304+
providerAddress = rs.providerAddress
305+
}
306+
}
307+
308+
return providerAddress
309+
}
310+
293311
type endpointsChange struct {
294312
previous proxyEndpointsMap
295313
current proxyEndpointsMap
@@ -1169,24 +1187,12 @@ func (proxier *Proxier) syncProxyRules() {
11691187
return
11701188
}
11711189
proxier.network = *updatedNetwork
1172-
var providerAddress string
1173-
for _, rs := range proxier.network.remoteSubnets {
1174-
_, ipNet, err := net.ParseCIDR(rs.destinationPrefix)
1175-
if err != nil {
1176-
klog.Fatalf("%v", err)
1177-
}
1178-
if ipNet.Contains(net.ParseIP(ep.ip)) {
1179-
providerAddress = rs.providerAddress
1180-
}
1181-
if ep.ip == rs.providerAddress {
1182-
providerAddress = rs.providerAddress
1183-
containsNodeIP = true
1184-
}
1185-
}
1190+
1191+
providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip)
1192+
11861193
if len(providerAddress) == 0 {
11871194
klog.Infof("Could not find provider address for %s. Assuming it is a public IP", ep.ip)
11881195
providerAddress = proxier.nodeIP.String()
1189-
containsPublicIP = true
11901196
}
11911197

11921198
hnsEndpoint := &endpointsInfo{
@@ -1216,6 +1222,17 @@ func (proxier *Proxier) syncProxyRules() {
12161222
}
12171223
}
12181224

1225+
if proxier.network.networkType == "Overlay" {
1226+
providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip)
1227+
1228+
isNodeIP := (ep.ip == providerAddress)
1229+
isPublicIP := (len(providerAddress) == 0)
1230+
klog.Infof("Endpoint %s on overlay network %s is classified as NodeIp: %v, Public Ip: %v", ep.ip, hnsNetworkName, isNodeIP, isPublicIP)
1231+
1232+
containsNodeIP = containsNodeIP || isNodeIP
1233+
containsPublicIP = containsPublicIP || isPublicIP
1234+
}
1235+
12191236
// Save the hnsId for reference
12201237
LogJson(newHnsEndpoint, "Hns Endpoint resource", 1)
12211238
hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint)

pkg/proxy/winkernel/proxier_test.go

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

343+
func TestFindRemoteSubnetProviderAddress(t *testing.T) {
344+
networkInfo, _ := newFakeHNS().getNetworkByName("TestNetwork")
345+
pa := networkInfo.findRemoteSubnetProviderAddress(providerAddress)
346+
347+
if pa != providerAddress {
348+
t.Errorf("%v does not match %v", pa, providerAddress)
349+
}
350+
351+
pa = networkInfo.findRemoteSubnetProviderAddress(epIpAddressRemote)
352+
353+
if pa != providerAddress {
354+
t.Errorf("%v does not match %v", pa, providerAddress)
355+
}
356+
357+
pa = networkInfo.findRemoteSubnetProviderAddress(serviceVip)
358+
359+
if len(pa) != 0 {
360+
t.Errorf("Provider address is not empty as expected")
361+
}
362+
}
363+
343364
func makeNSN(namespace, name string) types.NamespacedName {
344365
return types.NamespacedName{Namespace: namespace, Name: name}
345366
}

0 commit comments

Comments
 (0)