Skip to content

Commit 23957a6

Browse files
committed
Allow kube-proxy iptables mode to support dual-stack, with the meta-proxier.
1 parent 4a8205b commit 23957a6

File tree

8 files changed

+123
-20
lines changed

8 files changed

+123
-20
lines changed

cmd/kube-proxy/app/server_others.go

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,55 @@ func newProxyServer(
148148
return nil, fmt.Errorf("unable to read IPTables MasqueradeBit from config")
149149
}
150150

151-
// TODO this has side effects that should only happen when Run() is invoked.
152-
proxier, err = iptables.NewProxier(
153-
iptInterface,
154-
utilsysctl.New(),
155-
execer,
156-
config.IPTables.SyncPeriod.Duration,
157-
config.IPTables.MinSyncPeriod.Duration,
158-
config.IPTables.MasqueradeAll,
159-
int(*config.IPTables.MasqueradeBit),
160-
config.ClusterCIDR,
161-
hostname,
162-
nodeIP,
163-
recorder,
164-
healthzServer,
165-
config.NodePortAddresses,
166-
)
151+
if utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) {
152+
klog.V(0).Info("creating dualStackProxier for iptables.")
153+
154+
// Create iptables handlers for both families, one is already created
155+
// Always ordered as IPv4, IPv6
156+
var ipt [2]utiliptables.Interface
157+
if iptInterface.IsIpv6() {
158+
ipt[1] = iptInterface
159+
ipt[0] = utiliptables.New(execer, utiliptables.ProtocolIpv4)
160+
} else {
161+
ipt[0] = iptInterface
162+
ipt[1] = utiliptables.New(execer, utiliptables.ProtocolIpv6)
163+
}
164+
165+
// TODO this has side effects that should only happen when Run() is invoked.
166+
proxier, err = iptables.NewDualStackProxier(
167+
ipt,
168+
utilsysctl.New(),
169+
execer,
170+
config.IPTables.SyncPeriod.Duration,
171+
config.IPTables.MinSyncPeriod.Duration,
172+
config.IPTables.MasqueradeAll,
173+
int(*config.IPTables.MasqueradeBit),
174+
cidrTuple(config.ClusterCIDR),
175+
hostname,
176+
nodeIPTuple(config.BindAddress),
177+
recorder,
178+
healthzServer,
179+
config.NodePortAddresses,
180+
)
181+
} else { // Create a single-stack proxier.
182+
// TODO this has side effects that should only happen when Run() is invoked.
183+
proxier, err = iptables.NewProxier(
184+
iptInterface,
185+
utilsysctl.New(),
186+
execer,
187+
config.IPTables.SyncPeriod.Duration,
188+
config.IPTables.MinSyncPeriod.Duration,
189+
config.IPTables.MasqueradeAll,
190+
int(*config.IPTables.MasqueradeBit),
191+
config.ClusterCIDR,
192+
hostname,
193+
nodeIP,
194+
recorder,
195+
healthzServer,
196+
config.NodePortAddresses,
197+
)
198+
}
199+
167200
if err != nil {
168201
return nil, fmt.Errorf("unable to create proxier: %v", err)
169202
}
@@ -174,6 +207,7 @@ func newProxyServer(
174207
klog.V(0).Info("creating dualStackProxier for ipvs.")
175208

176209
// Create iptables handlers for both families, one is already created
210+
// Always ordered as IPv4, IPv6
177211
var ipt [2]utiliptables.Interface
178212
if iptInterface.IsIpv6() {
179213
ipt[1] = iptInterface

pkg/proxy/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ filegroup(
4848
"//pkg/proxy/healthcheck:all-srcs",
4949
"//pkg/proxy/iptables:all-srcs",
5050
"//pkg/proxy/ipvs:all-srcs",
51+
"//pkg/proxy/metaproxier:all-srcs",
5152
"//pkg/proxy/metrics:all-srcs",
5253
"//pkg/proxy/userspace:all-srcs",
5354
"//pkg/proxy/util:all-srcs",

pkg/proxy/iptables/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ go_library(
1414
"//pkg/features:go_default_library",
1515
"//pkg/proxy:go_default_library",
1616
"//pkg/proxy/healthcheck:go_default_library",
17+
"//pkg/proxy/metaproxier:go_default_library",
1718
"//pkg/proxy/metrics:go_default_library",
1819
"//pkg/proxy/util:go_default_library",
1920
"//pkg/util/async:go_default_library",

pkg/proxy/iptables/proxier.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"k8s.io/kubernetes/pkg/features"
4444
"k8s.io/kubernetes/pkg/proxy"
4545
"k8s.io/kubernetes/pkg/proxy/healthcheck"
46+
"k8s.io/kubernetes/pkg/proxy/metaproxier"
4647
"k8s.io/kubernetes/pkg/proxy/metrics"
4748
utilproxy "k8s.io/kubernetes/pkg/proxy/util"
4849
"k8s.io/kubernetes/pkg/util/async"
@@ -333,6 +334,42 @@ func NewProxier(ipt utiliptables.Interface,
333334
return proxier, nil
334335
}
335336

337+
// NewDualStackProxier creates a MetaProxier instance, with IPv4 and IPv6 proxies.
338+
func NewDualStackProxier(
339+
ipt [2]utiliptables.Interface,
340+
sysctl utilsysctl.Interface,
341+
exec utilexec.Interface,
342+
syncPeriod time.Duration,
343+
minSyncPeriod time.Duration,
344+
masqueradeAll bool,
345+
masqueradeBit int,
346+
clusterCIDR [2]string,
347+
hostname string,
348+
nodeIP [2]net.IP,
349+
recorder record.EventRecorder,
350+
healthzServer healthcheck.ProxierHealthUpdater,
351+
nodePortAddresses []string,
352+
) (proxy.Provider, error) {
353+
// Create an ipv4 instance of the single-stack proxier
354+
ipv4Proxier, err := NewProxier(ipt[0], sysctl,
355+
exec, syncPeriod, minSyncPeriod,
356+
masqueradeAll, masqueradeBit, clusterCIDR[0], hostname, nodeIP[0],
357+
recorder, healthzServer, nodePortAddresses)
358+
if err != nil {
359+
return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err)
360+
}
361+
362+
ipv6Proxier, err := NewProxier(ipt[1], sysctl,
363+
exec, syncPeriod, minSyncPeriod,
364+
masqueradeAll, masqueradeBit, clusterCIDR[1], hostname, nodeIP[1],
365+
recorder, healthzServer, nodePortAddresses)
366+
if err != nil {
367+
return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err)
368+
}
369+
370+
return metaproxier.NewMetaProxier(ipv4Proxier, ipv6Proxier), nil // TODO move meta-proxier to mode-neutral package
371+
}
372+
336373
type iptablesJumpChain struct {
337374
table utiliptables.Table
338375
dstChain utiliptables.Chain

pkg/proxy/ipvs/BUILD

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ go_library(
4545
srcs = [
4646
"graceful_termination.go",
4747
"ipset.go",
48-
"meta_proxier.go",
4948
"netlink.go",
5049
"netlink_linux.go",
5150
"netlink_unsupported.go",
@@ -56,8 +55,8 @@ go_library(
5655
deps = [
5756
"//pkg/features:go_default_library",
5857
"//pkg/proxy:go_default_library",
59-
"//pkg/proxy/config:go_default_library",
6058
"//pkg/proxy/healthcheck:go_default_library",
59+
"//pkg/proxy/metaproxier:go_default_library",
6160
"//pkg/proxy/metrics:go_default_library",
6261
"//pkg/proxy/util:go_default_library",
6362
"//pkg/util/async:go_default_library",

pkg/proxy/ipvs/proxier.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import (
4646
"k8s.io/kubernetes/pkg/features"
4747
"k8s.io/kubernetes/pkg/proxy"
4848
"k8s.io/kubernetes/pkg/proxy/healthcheck"
49+
"k8s.io/kubernetes/pkg/proxy/metaproxier"
4950
"k8s.io/kubernetes/pkg/proxy/metrics"
5051
utilproxy "k8s.io/kubernetes/pkg/proxy/util"
5152
"k8s.io/kubernetes/pkg/util/async"
@@ -515,7 +516,7 @@ func NewDualStackProxier(
515516

516517
// Return a meta-proxier that dispatch calls between the two
517518
// single-stack proxier instances
518-
return NewMetaProxier(ipv4Proxier, ipv6Proxier), nil
519+
return metaproxier.NewMetaProxier(ipv4Proxier, ipv6Proxier), nil
519520
}
520521

521522
func filterCIDRs(wantIPv6 bool, cidrs []string) []string {

pkg/proxy/metaproxier/BUILD

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
4+
5+
go_library(
6+
name = "go_default_library",
7+
srcs = ["meta_proxier.go"],
8+
importpath = "k8s.io/kubernetes/pkg/proxy/metaproxier",
9+
deps = [
10+
"//pkg/proxy:go_default_library",
11+
"//pkg/proxy/config:go_default_library",
12+
"//staging/src/k8s.io/api/core/v1:go_default_library",
13+
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
14+
"//vendor/k8s.io/klog:go_default_library",
15+
"//vendor/k8s.io/utils/net:go_default_library",
16+
],
17+
)
18+
19+
filegroup(
20+
name = "package-srcs",
21+
srcs = glob(["**"]),
22+
tags = ["automanaged"],
23+
visibility = ["//visibility:private"],
24+
)
25+
26+
filegroup(
27+
name = "all-srcs",
28+
srcs = [":package-srcs"],
29+
tags = ["automanaged"],
30+
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package ipvs
17+
package metaproxier
1818

1919
import (
2020
"fmt"

0 commit comments

Comments
 (0)