@@ -1123,6 +1123,7 @@ func (proxier *Proxier) syncProxyRules() {
1123
1123
klog .Errorf ("Failed to cast serviceInfo %q" , svcName .String ())
1124
1124
continue
1125
1125
}
1126
+ isIPv6 := utilnet .IsIPv6 (svcInfo .ClusterIP ())
1126
1127
protocol := strings .ToLower (string (svcInfo .Protocol ()))
1127
1128
// Precompute svcNameString; with many services the many calls
1128
1129
// to ServicePortName.String() show up in CPU profiles.
@@ -1215,7 +1216,7 @@ func (proxier *Proxier) syncProxyRules() {
1215
1216
klog .V (4 ).Infof ("Port %s was open before and is still needed" , lp .String ())
1216
1217
replacementPortsMap [lp ] = proxier .portsMap [lp ]
1217
1218
} else {
1218
- socket , err := proxier .portMapper .OpenLocalPort (& lp )
1219
+ socket , err := proxier .portMapper .OpenLocalPort (& lp , isIPv6 )
1219
1220
if err != nil {
1220
1221
msg := fmt .Sprintf ("can't open %s, skipping this externalIP: %v" , lp .String (), err )
1221
1222
@@ -1404,13 +1405,12 @@ func (proxier *Proxier) syncProxyRules() {
1404
1405
// We do not start listening on SCTP ports, according to our agreement in the
1405
1406
// SCTP support KEP
1406
1407
} else if svcInfo .Protocol () != v1 .ProtocolSCTP {
1407
- socket , err := proxier .portMapper .OpenLocalPort (& lp )
1408
+ socket , err := proxier .portMapper .OpenLocalPort (& lp , isIPv6 )
1408
1409
if err != nil {
1409
1410
klog .Errorf ("can't open %s, skipping this nodePort: %v" , lp .String (), err )
1410
1411
continue
1411
1412
}
1412
1413
if lp .Protocol == "udp" {
1413
- isIPv6 := utilnet .IsIPv6 (svcInfo .ClusterIP ())
1414
1414
conntrack .ClearEntriesForPort (proxier .exec , lp .Port , isIPv6 , v1 .ProtocolUDP )
1415
1415
}
1416
1416
replacementPortsMap [lp ] = socket
@@ -2101,11 +2101,11 @@ func writeBytesLine(buf *bytes.Buffer, bytes []byte) {
2101
2101
type listenPortOpener struct {}
2102
2102
2103
2103
// OpenLocalPort holds the given local port open.
2104
- func (l * listenPortOpener ) OpenLocalPort (lp * utilproxy.LocalPort ) (utilproxy.Closeable , error ) {
2105
- return openLocalPort (lp )
2104
+ func (l * listenPortOpener ) OpenLocalPort (lp * utilproxy.LocalPort , isIPv6 bool ) (utilproxy.Closeable , error ) {
2105
+ return openLocalPort (lp , isIPv6 )
2106
2106
}
2107
2107
2108
- func openLocalPort (lp * utilproxy.LocalPort ) (utilproxy.Closeable , error ) {
2108
+ func openLocalPort (lp * utilproxy.LocalPort , isIPv6 bool ) (utilproxy.Closeable , error ) {
2109
2109
// For ports on node IPs, open the actual port and hold it, even though we
2110
2110
// use ipvs to redirect traffic.
2111
2111
// This ensures a) that it's safe to use that port and b) that (a) stays
@@ -2121,17 +2121,25 @@ func openLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) {
2121
2121
var socket utilproxy.Closeable
2122
2122
switch lp .Protocol {
2123
2123
case "tcp" :
2124
- listener , err := net .Listen ("tcp" , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2124
+ network := "tcp4"
2125
+ if isIPv6 {
2126
+ network = "tcp6"
2127
+ }
2128
+ listener , err := net .Listen (network , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2125
2129
if err != nil {
2126
2130
return nil , err
2127
2131
}
2128
2132
socket = listener
2129
2133
case "udp" :
2130
- addr , err := net .ResolveUDPAddr ("udp" , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2134
+ network := "udp4"
2135
+ if isIPv6 {
2136
+ network = "udp6"
2137
+ }
2138
+ addr , err := net .ResolveUDPAddr (network , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2131
2139
if err != nil {
2132
2140
return nil , err
2133
2141
}
2134
- conn , err := net .ListenUDP ("udp" , addr )
2142
+ conn , err := net .ListenUDP (network , addr )
2135
2143
if err != nil {
2136
2144
return nil , err
2137
2145
}
0 commit comments