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
f293e146
Commit
f293e146
authored
Apr 26, 2019
by
galal-hussein
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use NodeSelector when node label is enabled
parent
ac2114ea
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
76 additions
and
37 deletions
+76
-37
controller.go
pkg/servicelb/controller.go
+76
-37
No files found.
pkg/servicelb/controller.go
View file @
f293e146
...
@@ -21,13 +21,16 @@ import (
...
@@ -21,13 +21,16 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes"
v1getter
"k8s.io/client-go/kubernetes/typed/apps/v1"
coregetter
"k8s.io/client-go/kubernetes/typed/core/v1"
coregetter
"k8s.io/client-go/kubernetes/typed/core/v1"
)
)
const
(
const
(
image
=
"rancher/klipper-lb:v0.1.1"
image
=
"rancher/klipper-lb:v0.1.1"
svcNameLabel
=
"svccontroller.k3s.cattle.io/svcname"
svcNameLabel
=
"svccontroller.k3s.cattle.io/svcname"
Ready
=
condition
.
Cond
(
"Ready"
)
daemonsetNodeLabel
=
"svccontroller.k3s.cattle.io/enablelb"
nodeSelectorLabel
=
"svccontroller.k3s.cattle.io/nodeselector"
Ready
=
condition
.
Cond
(
"Ready"
)
)
)
var
(
var
(
...
@@ -44,12 +47,14 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo
...
@@ -44,12 +47,14 @@ func Register(ctx context.Context, kubernetes kubernetes.Interface, enabled, roo
nodeCache
:
clients
.
Node
.
Cache
(),
nodeCache
:
clients
.
Node
.
Cache
(),
podCache
:
clients
.
Pod
.
Cache
(),
podCache
:
clients
.
Pod
.
Cache
(),
processor
:
objectset
.
NewProcessor
(
"svccontroller"
)
.
processor
:
objectset
.
NewProcessor
(
"svccontroller"
)
.
Client
(
appClients
.
D
eploymen
t
),
Client
(
appClients
.
D
aemonSe
t
),
serviceCache
:
clients
.
Service
.
Cache
(),
serviceCache
:
clients
.
Service
.
Cache
(),
services
:
kubernetes
.
CoreV1
(),
services
:
kubernetes
.
CoreV1
(),
daemonsets
:
kubernetes
.
AppsV1
(),
}
}
clients
.
Service
.
OnChange
(
ctx
,
"svccontroller"
,
h
.
onChange
)
clients
.
Service
.
OnChange
(
ctx
,
"svccontroller"
,
h
.
onChangeService
)
clients
.
Node
.
OnChange
(
ctx
,
"svccontroller"
,
h
.
onChangeNode
)
changeset
.
Watch
(
ctx
,
"svccontroller-watcher"
,
changeset
.
Watch
(
ctx
,
"svccontroller-watcher"
,
h
.
onResourceChange
,
h
.
onResourceChange
,
clients
.
Service
,
clients
.
Service
,
...
@@ -67,6 +72,7 @@ type handler struct {
...
@@ -67,6 +72,7 @@ type handler struct {
processor
*
objectset
.
Processor
processor
*
objectset
.
Processor
serviceCache
coreclient
.
ServiceClientCache
serviceCache
coreclient
.
ServiceClientCache
services
coregetter
.
ServicesGetter
services
coregetter
.
ServicesGetter
daemonsets
v1getter
.
DaemonSetsGetter
}
}
func
(
h
*
handler
)
onResourceChange
(
name
,
namespace
string
,
obj
runtime
.
Object
)
([]
changeset
.
Key
,
error
)
{
func
(
h
*
handler
)
onResourceChange
(
name
,
namespace
string
,
obj
runtime
.
Object
)
([]
changeset
.
Key
,
error
)
{
...
@@ -101,7 +107,7 @@ func (h *handler) onResourceChange(name, namespace string, obj runtime.Object) (
...
@@ -101,7 +107,7 @@ func (h *handler) onResourceChange(name, namespace string, obj runtime.Object) (
},
nil
},
nil
}
}
func
(
h
*
handler
)
onChange
(
svc
*
core
.
Service
)
(
runtime
.
Object
,
error
)
{
func
(
h
*
handler
)
onChange
Service
(
svc
*
core
.
Service
)
(
runtime
.
Object
,
error
)
{
if
svc
.
Spec
.
Type
!=
core
.
ServiceTypeLoadBalancer
||
svc
.
Spec
.
ClusterIP
==
""
||
if
svc
.
Spec
.
Type
!=
core
.
ServiceTypeLoadBalancer
||
svc
.
Spec
.
ClusterIP
==
""
||
svc
.
Spec
.
ClusterIP
==
"None"
{
svc
.
Spec
.
ClusterIP
==
"None"
{
return
svc
,
nil
return
svc
,
nil
...
@@ -116,6 +122,18 @@ func (h *handler) onChange(svc *core.Service) (runtime.Object, error) {
...
@@ -116,6 +122,18 @@ func (h *handler) onChange(svc *core.Service) (runtime.Object, error) {
return
nil
,
err
return
nil
,
err
}
}
func
(
h
*
handler
)
onChangeNode
(
node
*
core
.
Node
)
(
runtime
.
Object
,
error
)
{
if
_
,
ok
:=
node
.
Labels
[
daemonsetNodeLabel
];
!
ok
{
return
node
,
nil
}
if
err
:=
h
.
updateDaemonSets
();
err
!=
nil
{
return
node
,
err
}
return
node
,
nil
}
func
(
h
*
handler
)
updateService
(
svc
*
core
.
Service
)
(
runtime
.
Object
,
error
)
{
func
(
h
*
handler
)
updateService
(
svc
*
core
.
Service
)
(
runtime
.
Object
,
error
)
{
pods
,
err
:=
h
.
podCache
.
List
(
svc
.
Namespace
,
labels
.
SelectorFromSet
(
map
[
string
]
string
{
pods
,
err
:=
h
.
podCache
.
List
(
svc
.
Namespace
,
labels
.
SelectorFromSet
(
map
[
string
]
string
{
svcNameLabel
:
svc
.
Name
,
svcNameLabel
:
svc
.
Name
,
...
@@ -200,43 +218,27 @@ func (h *handler) podIPs(pods []*core.Pod) ([]string, error) {
...
@@ -200,43 +218,27 @@ func (h *handler) podIPs(pods []*core.Pod) ([]string, error) {
}
}
func
(
h
*
handler
)
deployPod
(
svc
*
core
.
Service
)
error
{
func
(
h
*
handler
)
deployPod
(
svc
*
core
.
Service
)
error
{
objs
:=
objectset
.
NewObjectSet
()
objs
:=
objectset
.
NewObjectSet
()
if
!
h
.
enabled
{
if
!
h
.
enabled
{
return
h
.
processor
.
NewDesiredSet
(
svc
,
objs
)
.
Apply
()
return
h
.
processor
.
NewDesiredSet
(
svc
,
objs
)
.
Apply
()
}
}
d
ep
,
err
:=
h
.
newDeploymen
t
(
svc
)
d
s
,
err
:=
h
.
newDaemonSe
t
(
svc
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
if
d
ep
!=
nil
{
if
d
s
!=
nil
{
objs
.
Add
(
d
ep
)
objs
.
Add
(
d
s
)
}
}
return
h
.
processor
.
NewDesiredSet
(
svc
,
objs
)
.
Apply
()
return
h
.
processor
.
NewDesiredSet
(
svc
,
objs
)
.
Apply
()
}
}
func
(
h
*
handler
)
newD
eployment
(
svc
*
core
.
Service
)
(
*
apps
.
Deploymen
t
,
error
)
{
func
(
h
*
handler
)
newD
aemonSet
(
svc
*
core
.
Service
)
(
*
apps
.
DaemonSe
t
,
error
)
{
name
:=
fmt
.
Sprintf
(
"svclb-%s"
,
svc
.
Name
)
name
:=
fmt
.
Sprintf
(
"svclb-%s"
,
svc
.
Name
)
zeroInt
:=
intstr
.
FromInt
(
0
)
oneInt
:=
intstr
.
FromInt
(
1
)
oneInt
:=
intstr
.
FromInt
(
1
)
replicas
:=
int32
(
0
)
nodes
,
err
:=
h
.
nodeCache
.
List
(
""
,
labels
.
Everything
())
if
err
!=
nil
{
return
nil
,
err
}
for
_
,
node
:=
range
nodes
{
ds
:=
&
apps
.
DaemonSet
{
if
Ready
.
IsTrue
(
node
)
{
replicas
++
}
if
replicas
>=
2
{
break
}
}
dep
:=
&
apps
.
Deployment
{
ObjectMeta
:
meta
.
ObjectMeta
{
ObjectMeta
:
meta
.
ObjectMeta
{
Name
:
name
,
Name
:
name
,
Namespace
:
svc
.
Namespace
,
Namespace
:
svc
.
Namespace
,
...
@@ -249,13 +251,15 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
...
@@ -249,13 +251,15 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
Controller
:
&
trueVal
,
Controller
:
&
trueVal
,
},
},
},
},
Labels
:
map
[
string
]
string
{
nodeSelectorLabel
:
"false"
,
},
},
},
TypeMeta
:
meta
.
TypeMeta
{
TypeMeta
:
meta
.
TypeMeta
{
Kind
:
"D
eploymen
t"
,
Kind
:
"D
aemonSe
t"
,
APIVersion
:
"apps/v1"
,
APIVersion
:
"apps/v1"
,
},
},
Spec
:
apps
.
DeploymentSpec
{
Spec
:
apps
.
DaemonSetSpec
{
Replicas
:
&
replicas
,
Selector
:
&
meta
.
LabelSelector
{
Selector
:
&
meta
.
LabelSelector
{
MatchLabels
:
map
[
string
]
string
{
MatchLabels
:
map
[
string
]
string
{
"app"
:
name
,
"app"
:
name
,
...
@@ -269,10 +273,9 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
...
@@ -269,10 +273,9 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
},
},
},
},
},
},
Strategy
:
apps
.
DeploymentStrategy
{
UpdateStrategy
:
apps
.
DaemonSetUpdateStrategy
{
Type
:
apps
.
RollingUpdateDeploymentStrategyType
,
Type
:
apps
.
RollingUpdateDaemonSetStrategyType
,
RollingUpdate
:
&
apps
.
RollingUpdateDeployment
{
RollingUpdate
:
&
apps
.
RollingUpdateDaemonSet
{
MaxSurge
:
&
zeroInt
,
MaxUnavailable
:
&
oneInt
,
MaxUnavailable
:
&
oneInt
,
},
},
},
},
...
@@ -319,8 +322,44 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
...
@@ -319,8 +322,44 @@ func (h *handler) newDeployment(svc *core.Service) (*apps.Deployment, error) {
},
},
}
}
dep
.
Spec
.
Template
.
Spec
.
Containers
=
append
(
dep
.
Spec
.
Template
.
Spec
.
Containers
,
container
)
ds
.
Spec
.
Template
.
Spec
.
Containers
=
append
(
ds
.
Spec
.
Template
.
Spec
.
Containers
,
container
)
}
// Add node selector only if label "svccontroller.k3s.cattle.io/enablelb" exists on the nodes
selector
,
err
:=
labels
.
Parse
(
daemonsetNodeLabel
)
if
err
!=
nil
{
return
nil
,
err
}
nodesWithLabel
,
err
:=
h
.
nodeCache
.
List
(
""
,
selector
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
nodesWithLabel
)
>
0
{
ds
.
Spec
.
Template
.
Spec
.
NodeSelector
=
map
[
string
]
string
{
daemonsetNodeLabel
:
"true"
,
}
ds
.
Labels
[
nodeSelectorLabel
]
=
"true"
}
return
ds
,
nil
}
func
(
h
*
handler
)
updateDaemonSets
()
error
{
daemonsets
,
err
:=
h
.
daemonsets
.
DaemonSets
(
""
)
.
List
(
meta
.
ListOptions
{
LabelSelector
:
nodeSelectorLabel
+
"=false"
,
})
if
err
!=
nil
{
return
err
}
for
_
,
ds
:=
range
daemonsets
.
Items
{
ds
.
Spec
.
Template
.
Spec
.
NodeSelector
=
map
[
string
]
string
{
daemonsetNodeLabel
:
"true"
,
}
ds
.
Labels
[
nodeSelectorLabel
]
=
"true"
if
_
,
err
:=
h
.
daemonsets
.
DaemonSets
(
ds
.
Namespace
)
.
Update
(
&
ds
);
err
!=
nil
{
return
err
}
}
}
return
dep
,
nil
return
nil
}
}
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