Skip to content

Commit 2490e03

Browse files
authored
Merge pull request kubernetes#71735 from dcbw/userspace-proxy-ratelimiting
proxy/userspace: respect minSyncInterval
2 parents 0148014 + cc2b31a commit 2490e03

File tree

14 files changed

+507
-178
lines changed

14 files changed

+507
-178
lines changed

cmd/kube-proxy/app/server.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -504,8 +504,6 @@ type ProxyServer struct {
504504
OOMScoreAdj *int32
505505
ResourceContainer string
506506
ConfigSyncPeriod time.Duration
507-
ServiceEventHandler config.ServiceHandler
508-
EndpointsEventHandler config.EndpointsHandler
509507
HealthzServer *healthcheck.HealthzServer
510508
}
511509

@@ -660,11 +658,11 @@ func (s *ProxyServer) Run() error {
660658
// only notify on changes, and the initial update (on process start) may be lost if no handlers
661659
// are registered yet.
662660
serviceConfig := config.NewServiceConfig(informerFactory.Core().V1().Services(), s.ConfigSyncPeriod)
663-
serviceConfig.RegisterEventHandler(s.ServiceEventHandler)
661+
serviceConfig.RegisterEventHandler(s.Proxier)
664662
go serviceConfig.Run(wait.NeverStop)
665663

666664
endpointsConfig := config.NewEndpointsConfig(informerFactory.Core().V1().Endpoints(), s.ConfigSyncPeriod)
667-
endpointsConfig.RegisterEventHandler(s.EndpointsEventHandler)
665+
endpointsConfig.RegisterEventHandler(s.Proxier)
668666
go endpointsConfig.Run(wait.NeverStop)
669667

670668
// This has to start after the calls to NewServiceConfig and NewEndpointsConfig because those

cmd/kube-proxy/app/server_others.go

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import (
3333
"k8s.io/client-go/tools/record"
3434
"k8s.io/kubernetes/pkg/proxy"
3535
proxyconfigapi "k8s.io/kubernetes/pkg/proxy/apis/config"
36-
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
3736
"k8s.io/kubernetes/pkg/proxy/healthcheck"
3837
"k8s.io/kubernetes/pkg/proxy/iptables"
3938
"k8s.io/kubernetes/pkg/proxy/ipvs"
@@ -135,8 +134,6 @@ func newProxyServer(
135134
}
136135

137136
var proxier proxy.ProxyProvider
138-
var serviceEventHandler proxyconfig.ServiceHandler
139-
var endpointsEventHandler proxyconfig.EndpointsHandler
140137

141138
proxyMode := getProxyMode(string(config.Mode), iptInterface, kernelHandler, ipsetInterface, iptables.LinuxKernelCompatTester{})
142139
nodeIP := net.ParseIP(config.BindAddress)
@@ -151,7 +148,7 @@ func newProxyServer(
151148
}
152149

153150
// TODO this has side effects that should only happen when Run() is invoked.
154-
proxierIPTables, err := iptables.NewProxier(
151+
proxier, err = iptables.NewProxier(
155152
iptInterface,
156153
utilsysctl.New(),
157154
execer,
@@ -170,12 +167,9 @@ func newProxyServer(
170167
return nil, fmt.Errorf("unable to create proxier: %v", err)
171168
}
172169
metrics.RegisterMetrics()
173-
proxier = proxierIPTables
174-
serviceEventHandler = proxierIPTables
175-
endpointsEventHandler = proxierIPTables
176170
} else if proxyMode == proxyModeIPVS {
177171
klog.V(0).Info("Using ipvs Proxier.")
178-
proxierIPVS, err := ipvs.NewProxier(
172+
proxier, err = ipvs.NewProxier(
179173
iptInterface,
180174
ipvsInterface,
181175
ipsetInterface,
@@ -199,20 +193,12 @@ func newProxyServer(
199193
return nil, fmt.Errorf("unable to create proxier: %v", err)
200194
}
201195
metrics.RegisterMetrics()
202-
proxier = proxierIPVS
203-
serviceEventHandler = proxierIPVS
204-
endpointsEventHandler = proxierIPVS
205196
} else {
206197
klog.V(0).Info("Using userspace Proxier.")
207-
// This is a proxy.LoadBalancer which NewProxier needs but has methods we don't need for
208-
// our config.EndpointsConfigHandler.
209-
loadBalancer := userspace.NewLoadBalancerRR()
210-
// set EndpointsConfigHandler to our loadBalancer
211-
endpointsEventHandler = loadBalancer
212198

213199
// TODO this has side effects that should only happen when Run() is invoked.
214-
proxierUserspace, err := userspace.NewProxier(
215-
loadBalancer,
200+
proxier, err = userspace.NewProxier(
201+
userspace.NewLoadBalancerRR(),
216202
net.ParseIP(config.BindAddress),
217203
iptInterface,
218204
execer,
@@ -225,8 +211,6 @@ func newProxyServer(
225211
if err != nil {
226212
return nil, fmt.Errorf("unable to create proxier: %v", err)
227213
}
228-
serviceEventHandler = proxierUserspace
229-
proxier = proxierUserspace
230214
}
231215

232216
iptInterface.AddReloadFunc(proxier.Sync)
@@ -250,8 +234,6 @@ func newProxyServer(
250234
OOMScoreAdj: config.OOMScoreAdj,
251235
ResourceContainer: config.ResourceContainer,
252236
ConfigSyncPeriod: config.ConfigSyncPeriod.Duration,
253-
ServiceEventHandler: serviceEventHandler,
254-
EndpointsEventHandler: endpointsEventHandler,
255237
HealthzServer: healthzServer,
256238
}, nil
257239
}

cmd/kube-proxy/app/server_windows.go

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"k8s.io/client-go/tools/record"
3535
"k8s.io/kubernetes/pkg/proxy"
3636
proxyconfigapi "k8s.io/kubernetes/pkg/proxy/apis/config"
37-
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
3837
"k8s.io/kubernetes/pkg/proxy/healthcheck"
3938
"k8s.io/kubernetes/pkg/proxy/winkernel"
4039
"k8s.io/kubernetes/pkg/proxy/winuserspace"
@@ -95,13 +94,11 @@ func newProxyServer(config *proxyconfigapi.KubeProxyConfiguration, cleanupAndExi
9594
}
9695

9796
var proxier proxy.ProxyProvider
98-
var serviceEventHandler proxyconfig.ServiceHandler
99-
var endpointsEventHandler proxyconfig.EndpointsHandler
10097

10198
proxyMode := getProxyMode(string(config.Mode), winkernel.WindowsKernelCompatTester{})
10299
if proxyMode == proxyModeKernelspace {
103100
klog.V(0).Info("Using Kernelspace Proxier.")
104-
proxierKernelspace, err := winkernel.NewProxier(
101+
proxier, err = winkernel.NewProxier(
105102
config.IPTables.SyncPeriod.Duration,
106103
config.IPTables.MinSyncPeriod.Duration,
107104
config.IPTables.MasqueradeAll,
@@ -116,23 +113,14 @@ func newProxyServer(config *proxyconfigapi.KubeProxyConfiguration, cleanupAndExi
116113
if err != nil {
117114
return nil, fmt.Errorf("unable to create proxier: %v", err)
118115
}
119-
proxier = proxierKernelspace
120-
endpointsEventHandler = proxierKernelspace
121-
serviceEventHandler = proxierKernelspace
122116
} else {
123117
klog.V(0).Info("Using userspace Proxier.")
124118
execer := exec.New()
125119
var netshInterface utilnetsh.Interface
126120
netshInterface = utilnetsh.New(execer)
127121

128-
// This is a proxy.LoadBalancer which NewProxier needs but has methods we don't need for
129-
// our config.EndpointsConfigHandler.
130-
loadBalancer := winuserspace.NewLoadBalancerRR()
131-
132-
// set EndpointsConfigHandler to our loadBalancer
133-
endpointsEventHandler = loadBalancer
134-
proxierUserspace, err := winuserspace.NewProxier(
135-
loadBalancer,
122+
proxier, err = winuserspace.NewProxier(
123+
winuserspace.NewLoadBalancerRR(),
136124
net.ParseIP(config.BindAddress),
137125
netshInterface,
138126
*utilnet.ParsePortRangeOrDie(config.PortRange),
@@ -143,26 +131,22 @@ func newProxyServer(config *proxyconfigapi.KubeProxyConfiguration, cleanupAndExi
143131
if err != nil {
144132
return nil, fmt.Errorf("unable to create proxier: %v", err)
145133
}
146-
proxier = proxierUserspace
147-
serviceEventHandler = proxierUserspace
148134
}
149135

150136
return &ProxyServer{
151-
Client: client,
152-
EventClient: eventClient,
153-
Proxier: proxier,
154-
Broadcaster: eventBroadcaster,
155-
Recorder: recorder,
156-
ProxyMode: proxyMode,
157-
NodeRef: nodeRef,
158-
MetricsBindAddress: config.MetricsBindAddress,
159-
EnableProfiling: config.EnableProfiling,
160-
OOMScoreAdj: config.OOMScoreAdj,
161-
ResourceContainer: config.ResourceContainer,
162-
ConfigSyncPeriod: config.ConfigSyncPeriod.Duration,
163-
ServiceEventHandler: serviceEventHandler,
164-
EndpointsEventHandler: endpointsEventHandler,
165-
HealthzServer: healthzServer,
137+
Client: client,
138+
EventClient: eventClient,
139+
Proxier: proxier,
140+
Broadcaster: eventBroadcaster,
141+
Recorder: recorder,
142+
ProxyMode: proxyMode,
143+
NodeRef: nodeRef,
144+
MetricsBindAddress: config.MetricsBindAddress,
145+
EnableProfiling: config.EnableProfiling,
146+
OOMScoreAdj: config.OOMScoreAdj,
147+
ResourceContainer: config.ResourceContainer,
148+
ConfigSyncPeriod: config.ConfigSyncPeriod.Duration,
149+
HealthzServer: healthzServer,
166150
}, nil
167151
}
168152

pkg/kubemark/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ go_library(
2626
"//pkg/kubelet/dockershim:go_default_library",
2727
"//pkg/kubelet/types:go_default_library",
2828
"//pkg/proxy:go_default_library",
29-
"//pkg/proxy/config:go_default_library",
3029
"//pkg/proxy/iptables:go_default_library",
3130
"//pkg/util/iptables:go_default_library",
3231
"//pkg/util/mount:go_default_library",

pkg/kubemark/hollow_proxy.go

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"k8s.io/client-go/tools/record"
2828
proxyapp "k8s.io/kubernetes/cmd/kube-proxy/app"
2929
"k8s.io/kubernetes/pkg/proxy"
30-
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
3130
"k8s.io/kubernetes/pkg/proxy/iptables"
3231
utiliptables "k8s.io/kubernetes/pkg/util/iptables"
3332
utilnode "k8s.io/kubernetes/pkg/util/node"
@@ -72,13 +71,12 @@ func NewHollowProxyOrDie(
7271
) (*HollowProxy, error) {
7372
// Create proxier and service/endpoint handlers.
7473
var proxier proxy.ProxyProvider
75-
var serviceHandler proxyconfig.ServiceHandler
76-
var endpointsHandler proxyconfig.EndpointsHandler
74+
var err error
7775

7876
if useRealProxier {
7977
// Real proxier with fake iptables, sysctl, etc underneath it.
8078
//var err error
81-
proxierIPTables, err := iptables.NewProxier(
79+
proxier, err = iptables.NewProxier(
8280
iptInterface,
8381
sysctl,
8482
execer,
@@ -96,13 +94,8 @@ func NewHollowProxyOrDie(
9694
if err != nil {
9795
return nil, fmt.Errorf("unable to create proxier: %v", err)
9896
}
99-
proxier = proxierIPTables
100-
serviceHandler = proxierIPTables
101-
endpointsHandler = proxierIPTables
10297
} else {
10398
proxier = &FakeProxier{}
104-
serviceHandler = &FakeProxier{}
105-
endpointsHandler = &FakeProxier{}
10699
}
107100

108101
// Create a Hollow Proxy instance.
@@ -114,19 +107,17 @@ func NewHollowProxyOrDie(
114107
}
115108
return &HollowProxy{
116109
ProxyServer: &proxyapp.ProxyServer{
117-
Client: client,
118-
EventClient: eventClient,
119-
IptInterface: iptInterface,
120-
Proxier: proxier,
121-
Broadcaster: broadcaster,
122-
Recorder: recorder,
123-
ProxyMode: "fake",
124-
NodeRef: nodeRef,
125-
OOMScoreAdj: utilpointer.Int32Ptr(0),
126-
ResourceContainer: "",
127-
ConfigSyncPeriod: 30 * time.Second,
128-
ServiceEventHandler: serviceHandler,
129-
EndpointsEventHandler: endpointsHandler,
110+
Client: client,
111+
EventClient: eventClient,
112+
IptInterface: iptInterface,
113+
Proxier: proxier,
114+
Broadcaster: broadcaster,
115+
Recorder: recorder,
116+
ProxyMode: "fake",
117+
NodeRef: nodeRef,
118+
OOMScoreAdj: utilpointer.Int32Ptr(0),
119+
ResourceContainer: "",
120+
ConfigSyncPeriod: 30 * time.Second,
130121
},
131122
}, nil
132123
}

pkg/proxy/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ go_library(
1717
importpath = "k8s.io/kubernetes/pkg/proxy",
1818
deps = [
1919
"//pkg/api/v1/service:go_default_library",
20+
"//pkg/proxy/config:go_default_library",
2021
"//pkg/proxy/util:go_default_library",
2122
"//staging/src/k8s.io/api/core/v1:go_default_library",
2223
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",

pkg/proxy/types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ import (
2121

2222
"k8s.io/api/core/v1"
2323
"k8s.io/apimachinery/pkg/types"
24+
"k8s.io/kubernetes/pkg/proxy/config"
2425
)
2526

2627
// ProxyProvider is the interface provided by proxier implementations.
2728
type ProxyProvider interface {
29+
config.EndpointsHandler
30+
config.ServiceHandler
31+
2832
// Sync immediately synchronizes the ProxyProvider's current state to proxy rules.
2933
Sync()
3034
// SyncLoop runs periodic work.

pkg/proxy/userspace/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ go_library(
2121
deps = [
2222
"//pkg/apis/core/v1/helper:go_default_library",
2323
"//pkg/proxy:go_default_library",
24+
"//pkg/proxy/config:go_default_library",
2425
"//pkg/proxy/util:go_default_library",
26+
"//pkg/util/async:go_default_library",
2527
"//pkg/util/conntrack:go_default_library",
2628
"//pkg/util/iptables:go_default_library",
2729
"//pkg/util/slice:go_default_library",
@@ -85,6 +87,7 @@ go_test(
8587
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
8688
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
8789
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
90+
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
8891
"//vendor/k8s.io/utils/exec:go_default_library",
8992
"//vendor/k8s.io/utils/exec/testing:go_default_library",
9093
],

pkg/proxy/userspace/loadbalancer.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package userspace
1919
import (
2020
"k8s.io/api/core/v1"
2121
"k8s.io/kubernetes/pkg/proxy"
22+
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
2223
"net"
2324
)
2425

@@ -31,4 +32,6 @@ type LoadBalancer interface {
3132
DeleteService(service proxy.ServicePortName)
3233
CleanupStaleStickySessions(service proxy.ServicePortName)
3334
ServiceHasEndpoints(service proxy.ServicePortName) bool
35+
36+
proxyconfig.EndpointsHandler
3437
}

0 commit comments

Comments
 (0)