@@ -1145,6 +1145,7 @@ func (proxier *Proxier) syncProxyRules() {
1145
1145
klog .Errorf ("Failed to cast serviceInfo %q" , svcName .String ())
1146
1146
continue
1147
1147
}
1148
+ isIPv6 := utilnet .IsIPv6 (svcInfo .ClusterIP ())
1148
1149
protocol := strings .ToLower (string (svcInfo .Protocol ()))
1149
1150
// Precompute svcNameString; with many services the many calls
1150
1151
// to ServicePortName.String() show up in CPU profiles.
@@ -1236,7 +1237,7 @@ func (proxier *Proxier) syncProxyRules() {
1236
1237
klog .V (4 ).Infof ("Port %s was open before and is still needed" , lp .String ())
1237
1238
replacementPortsMap [lp ] = proxier .portsMap [lp ]
1238
1239
} else {
1239
- socket , err := proxier .portMapper .OpenLocalPort (& lp )
1240
+ socket , err := proxier .portMapper .OpenLocalPort (& lp , isIPv6 )
1240
1241
if err != nil {
1241
1242
msg := fmt .Sprintf ("can't open %s, skipping this externalIP: %v" , lp .String (), err )
1242
1243
@@ -1425,13 +1426,12 @@ func (proxier *Proxier) syncProxyRules() {
1425
1426
// We do not start listening on SCTP ports, according to our agreement in the
1426
1427
// SCTP support KEP
1427
1428
} else if svcInfo .Protocol () != v1 .ProtocolSCTP {
1428
- socket , err := proxier .portMapper .OpenLocalPort (& lp )
1429
+ socket , err := proxier .portMapper .OpenLocalPort (& lp , isIPv6 )
1429
1430
if err != nil {
1430
1431
klog .Errorf ("can't open %s, skipping this nodePort: %v" , lp .String (), err )
1431
1432
continue
1432
1433
}
1433
1434
if lp .Protocol == "udp" {
1434
- isIPv6 := utilnet .IsIPv6 (svcInfo .ClusterIP ())
1435
1435
conntrack .ClearEntriesForPort (proxier .exec , lp .Port , isIPv6 , v1 .ProtocolUDP )
1436
1436
}
1437
1437
replacementPortsMap [lp ] = socket
@@ -2122,11 +2122,11 @@ func writeBytesLine(buf *bytes.Buffer, bytes []byte) {
2122
2122
type listenPortOpener struct {}
2123
2123
2124
2124
// OpenLocalPort holds the given local port open.
2125
- func (l * listenPortOpener ) OpenLocalPort (lp * utilproxy.LocalPort ) (utilproxy.Closeable , error ) {
2126
- return openLocalPort (lp )
2125
+ func (l * listenPortOpener ) OpenLocalPort (lp * utilproxy.LocalPort , isIPv6 bool ) (utilproxy.Closeable , error ) {
2126
+ return openLocalPort (lp , isIPv6 )
2127
2127
}
2128
2128
2129
- func openLocalPort (lp * utilproxy.LocalPort ) (utilproxy.Closeable , error ) {
2129
+ func openLocalPort (lp * utilproxy.LocalPort , isIPv6 bool ) (utilproxy.Closeable , error ) {
2130
2130
// For ports on node IPs, open the actual port and hold it, even though we
2131
2131
// use ipvs to redirect traffic.
2132
2132
// This ensures a) that it's safe to use that port and b) that (a) stays
@@ -2142,17 +2142,25 @@ func openLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) {
2142
2142
var socket utilproxy.Closeable
2143
2143
switch lp .Protocol {
2144
2144
case "tcp" :
2145
- listener , err := net .Listen ("tcp" , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2145
+ network := "tcp4"
2146
+ if isIPv6 {
2147
+ network = "tcp6"
2148
+ }
2149
+ listener , err := net .Listen (network , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2146
2150
if err != nil {
2147
2151
return nil , err
2148
2152
}
2149
2153
socket = listener
2150
2154
case "udp" :
2151
- addr , err := net .ResolveUDPAddr ("udp" , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2155
+ network := "udp4"
2156
+ if isIPv6 {
2157
+ network = "udp6"
2158
+ }
2159
+ addr , err := net .ResolveUDPAddr (network , net .JoinHostPort (lp .IP , strconv .Itoa (lp .Port )))
2152
2160
if err != nil {
2153
2161
return nil , err
2154
2162
}
2155
- conn , err := net .ListenUDP ("udp" , addr )
2163
+ conn , err := net .ListenUDP (network , addr )
2156
2164
if err != nil {
2157
2165
return nil , err
2158
2166
}
0 commit comments