Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
04602bb9
Commit
04602bb9
authored
Jul 08, 2016
by
k8s-merge-robot
Committed by
GitHub
Jul 08, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #28655 from freehan/kubeproxyfix
Automatic merge from submit-queue Don't delete affinity when endpoints are empty closes: #25316
parents
becb3b44
e1df5c8b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
44 additions
and
28 deletions
+44
-28
loadbalancer.go
pkg/proxy/userspace/loadbalancer.go
+1
-0
proxier.go
pkg/proxy/userspace/proxier.go
+1
-0
proxier_test.go
pkg/proxy/userspace/proxier_test.go
+29
-27
roundrobin.go
pkg/proxy/userspace/roundrobin.go
+13
-1
No files found.
pkg/proxy/userspace/loadbalancer.go
View file @
04602bb9
...
@@ -29,5 +29,6 @@ type LoadBalancer interface {
...
@@ -29,5 +29,6 @@ type LoadBalancer interface {
// service-port and source address.
// service-port and source address.
NextEndpoint
(
service
proxy
.
ServicePortName
,
srcAddr
net
.
Addr
,
sessionAffinityReset
bool
)
(
string
,
error
)
NextEndpoint
(
service
proxy
.
ServicePortName
,
srcAddr
net
.
Addr
,
sessionAffinityReset
bool
)
(
string
,
error
)
NewService
(
service
proxy
.
ServicePortName
,
sessionAffinityType
api
.
ServiceAffinity
,
stickyMaxAgeMinutes
int
)
error
NewService
(
service
proxy
.
ServicePortName
,
sessionAffinityType
api
.
ServiceAffinity
,
stickyMaxAgeMinutes
int
)
error
DeleteService
(
service
proxy
.
ServicePortName
)
CleanupStaleStickySessions
(
service
proxy
.
ServicePortName
)
CleanupStaleStickySessions
(
service
proxy
.
ServicePortName
)
}
}
pkg/proxy/userspace/proxier.go
View file @
04602bb9
...
@@ -447,6 +447,7 @@ func (proxier *Proxier) OnServiceUpdate(services []api.Service) {
...
@@ -447,6 +447,7 @@ func (proxier *Proxier) OnServiceUpdate(services []api.Service) {
if
err
!=
nil
{
if
err
!=
nil
{
glog
.
Errorf
(
"Failed to stop service %q: %v"
,
name
,
err
)
glog
.
Errorf
(
"Failed to stop service %q: %v"
,
name
,
err
)
}
}
proxier
.
loadBalancer
.
DeleteService
(
name
)
}
}
}
}
}
}
...
...
pkg/proxy/userspace/proxier_test.go
View file @
04602bb9
...
@@ -536,15 +536,14 @@ func TestUDPProxyUpdateDelete(t *testing.T) {
...
@@ -536,15 +536,14 @@ func TestUDPProxyUpdateDelete(t *testing.T) {
func
TestTCPProxyUpdateDeleteUpdate
(
t
*
testing
.
T
)
{
func
TestTCPProxyUpdateDeleteUpdate
(
t
*
testing
.
T
)
{
lb
:=
NewLoadBalancerRR
()
lb
:=
NewLoadBalancerRR
()
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
:=
api
.
Endpoints
{
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
Subsets
:
[]
api
.
EndpointSubset
{{
Subsets
:
[]
api
.
EndpointSubset
{{
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
tcpServerPort
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
tcpServerPort
}},
}},
}},
}
},
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
})
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -569,6 +568,8 @@ func TestTCPProxyUpdateDeleteUpdate(t *testing.T) {
...
@@ -569,6 +568,8 @@ func TestTCPProxyUpdateDeleteUpdate(t *testing.T) {
}
}
waitForNumProxyLoops
(
t
,
p
,
0
)
waitForNumProxyLoops
(
t
,
p
,
0
)
// need to add endpoint here because it got clean up during service delete
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
p
.
OnServiceUpdate
([]
api
.
Service
{{
p
.
OnServiceUpdate
([]
api
.
Service
{{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
Spec
:
api
.
ServiceSpec
{
ClusterIP
:
"1.2.3.4"
,
Ports
:
[]
api
.
ServicePort
{{
Spec
:
api
.
ServiceSpec
{
ClusterIP
:
"1.2.3.4"
,
Ports
:
[]
api
.
ServicePort
{{
...
@@ -588,15 +589,14 @@ func TestTCPProxyUpdateDeleteUpdate(t *testing.T) {
...
@@ -588,15 +589,14 @@ func TestTCPProxyUpdateDeleteUpdate(t *testing.T) {
func
TestUDPProxyUpdateDeleteUpdate
(
t
*
testing
.
T
)
{
func
TestUDPProxyUpdateDeleteUpdate
(
t
*
testing
.
T
)
{
lb
:=
NewLoadBalancerRR
()
lb
:=
NewLoadBalancerRR
()
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
:=
api
.
Endpoints
{
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
Subsets
:
[]
api
.
EndpointSubset
{{
Subsets
:
[]
api
.
EndpointSubset
{{
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
udpServerPort
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
udpServerPort
}},
}},
}},
}
},
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
})
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -621,6 +621,8 @@ func TestUDPProxyUpdateDeleteUpdate(t *testing.T) {
...
@@ -621,6 +621,8 @@ func TestUDPProxyUpdateDeleteUpdate(t *testing.T) {
}
}
waitForNumProxyLoops
(
t
,
p
,
0
)
waitForNumProxyLoops
(
t
,
p
,
0
)
// need to add endpoint here because it got clean up during service delete
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
p
.
OnServiceUpdate
([]
api
.
Service
{{
p
.
OnServiceUpdate
([]
api
.
Service
{{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
Spec
:
api
.
ServiceSpec
{
ClusterIP
:
"1.2.3.4"
,
Ports
:
[]
api
.
ServicePort
{{
Spec
:
api
.
ServiceSpec
{
ClusterIP
:
"1.2.3.4"
,
Ports
:
[]
api
.
ServicePort
{{
...
@@ -785,15 +787,14 @@ func TestProxyUpdatePublicIPs(t *testing.T) {
...
@@ -785,15 +787,14 @@ func TestProxyUpdatePublicIPs(t *testing.T) {
func
TestProxyUpdatePortal
(
t
*
testing
.
T
)
{
func
TestProxyUpdatePortal
(
t
*
testing
.
T
)
{
lb
:=
NewLoadBalancerRR
()
lb
:=
NewLoadBalancerRR
()
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
service
:=
proxy
.
ServicePortName
{
NamespacedName
:
types
.
NamespacedName
{
Namespace
:
"testnamespace"
,
Name
:
"echo"
},
Port
:
"p"
}
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
:=
api
.
Endpoints
{
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
service
.
Name
,
Namespace
:
service
.
Namespace
},
Subsets
:
[]
api
.
EndpointSubset
{{
Subsets
:
[]
api
.
EndpointSubset
{{
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Addresses
:
[]
api
.
EndpointAddress
{{
IP
:
"127.0.0.1"
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
tcpServerPort
}},
Ports
:
[]
api
.
EndpointPort
{{
Name
:
"p"
,
Port
:
tcpServerPort
}},
}},
}},
}
},
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
})
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
p
,
err
:=
createProxier
(
lb
,
net
.
ParseIP
(
"0.0.0.0"
),
ipttest
.
NewFake
(),
net
.
ParseIP
(
"127.0.0.1"
),
nil
,
time
.
Minute
,
udpIdleTimeoutForTest
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -842,6 +843,7 @@ func TestProxyUpdatePortal(t *testing.T) {
...
@@ -842,6 +843,7 @@ func TestProxyUpdatePortal(t *testing.T) {
Protocol
:
"TCP"
,
Protocol
:
"TCP"
,
}}},
}}},
}})
}})
lb
.
OnEndpointsUpdate
([]
api
.
Endpoints
{
endpoint
})
svcInfo
,
exists
=
p
.
getServiceInfo
(
service
)
svcInfo
,
exists
=
p
.
getServiceInfo
(
service
)
if
!
exists
{
if
!
exists
{
t
.
Fatalf
(
"service with ClusterIP set not found in the proxy"
)
t
.
Fatalf
(
"service with ClusterIP set not found in the proxy"
)
...
...
pkg/proxy/userspace/roundrobin.go
View file @
04602bb9
...
@@ -82,6 +82,7 @@ func NewLoadBalancerRR() *LoadBalancerRR {
...
@@ -82,6 +82,7 @@ func NewLoadBalancerRR() *LoadBalancerRR {
}
}
func
(
lb
*
LoadBalancerRR
)
NewService
(
svcPort
proxy
.
ServicePortName
,
affinityType
api
.
ServiceAffinity
,
ttlMinutes
int
)
error
{
func
(
lb
*
LoadBalancerRR
)
NewService
(
svcPort
proxy
.
ServicePortName
,
affinityType
api
.
ServiceAffinity
,
ttlMinutes
int
)
error
{
glog
.
V
(
4
)
.
Infof
(
"LoadBalancerRR NewService %q"
,
svcPort
)
lb
.
lock
.
Lock
()
lb
.
lock
.
Lock
()
defer
lb
.
lock
.
Unlock
()
defer
lb
.
lock
.
Unlock
()
lb
.
newServiceInternal
(
svcPort
,
affinityType
,
ttlMinutes
)
lb
.
newServiceInternal
(
svcPort
,
affinityType
,
ttlMinutes
)
...
@@ -103,6 +104,13 @@ func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affi
...
@@ -103,6 +104,13 @@ func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affi
return
lb
.
services
[
svcPort
]
return
lb
.
services
[
svcPort
]
}
}
func
(
lb
*
LoadBalancerRR
)
DeleteService
(
svcPort
proxy
.
ServicePortName
)
{
glog
.
V
(
4
)
.
Infof
(
"LoadBalancerRR DeleteService %q"
,
svcPort
)
lb
.
lock
.
Lock
()
defer
lb
.
lock
.
Unlock
()
delete
(
lb
.
services
,
svcPort
)
}
// return true if this service is using some form of session affinity.
// return true if this service is using some form of session affinity.
func
isSessionAffinity
(
affinity
*
affinityPolicy
)
bool
{
func
isSessionAffinity
(
affinity
*
affinityPolicy
)
bool
{
// Should never be empty string, but checking for it to be safe.
// Should never be empty string, but checking for it to be safe.
...
@@ -281,7 +289,11 @@ func (lb *LoadBalancerRR) OnEndpointsUpdate(allEndpoints []api.Endpoints) {
...
@@ -281,7 +289,11 @@ func (lb *LoadBalancerRR) OnEndpointsUpdate(allEndpoints []api.Endpoints) {
for
k
:=
range
lb
.
services
{
for
k
:=
range
lb
.
services
{
if
_
,
exists
:=
registeredEndpoints
[
k
];
!
exists
{
if
_
,
exists
:=
registeredEndpoints
[
k
];
!
exists
{
glog
.
V
(
2
)
.
Infof
(
"LoadBalancerRR: Removing endpoints for %s"
,
k
)
glog
.
V
(
2
)
.
Infof
(
"LoadBalancerRR: Removing endpoints for %s"
,
k
)
delete
(
lb
.
services
,
k
)
// Reset but don't delete.
state
:=
lb
.
services
[
k
]
state
.
endpoints
=
[]
string
{}
state
.
index
=
0
state
.
affinity
.
affinityMap
=
map
[
string
]
*
affinityState
{}
}
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment