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
38896344
Commit
38896344
authored
Oct 29, 2021
by
Brad Davidson
Committed by
Brad Davidson
Oct 29, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Watch the local Node object instead of get/sleep looping
Signed-off-by:
Brad Davidson
<
brad.davidson@rancher.com
>
(cherry picked from commit
5acd0b90
)
parent
afa1981f
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
50 additions
and
42 deletions
+50
-42
setup.go
pkg/agent/flannel/setup.go
+30
-20
run.go
pkg/agent/run.go
+20
-22
No files found.
pkg/agent/flannel/setup.go
View file @
38896344
...
@@ -2,20 +2,21 @@ package flannel
...
@@ -2,20 +2,21 @@ package flannel
import
(
import
(
"context"
"context"
"errors"
"fmt"
"fmt"
"net"
"net"
"os"
"os"
"path/filepath"
"path/filepath"
"strings"
"strings"
"time"
"github.com/pkg/errors"
"github.com/rancher/k3s/pkg/agent/util"
"github.com/rancher/k3s/pkg/agent/util"
"github.com/rancher/k3s/pkg/daemons/config"
"github.com/rancher/k3s/pkg/daemons/config"
"github.com/rancher/k3s/pkg/version"
"github.com/rancher/k3s/pkg/version"
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus"
corev1
"k8s.io/api/core/v1"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
v1
"k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/apimachinery/pkg/fields"
typedcorev1
"k8s.io/client-go/kubernetes/typed/core/v1"
utilsnet
"k8s.io/utils/net"
utilsnet
"k8s.io/utils/net"
)
)
...
@@ -87,27 +88,14 @@ func Prepare(ctx context.Context, nodeConfig *config.Node) error {
...
@@ -87,27 +88,14 @@ func Prepare(ctx context.Context, nodeConfig *config.Node) error {
return
createFlannelConf
(
nodeConfig
)
return
createFlannelConf
(
nodeConfig
)
}
}
func
Run
(
ctx
context
.
Context
,
nodeConfig
*
config
.
Node
,
nodes
v1
.
NodeInterface
)
error
{
func
Run
(
ctx
context
.
Context
,
nodeConfig
*
config
.
Node
,
nodes
typedcorev1
.
NodeInterface
)
error
{
nodeName
:=
nodeConfig
.
AgentConfig
.
NodeName
if
err
:=
waitForPodCIDR
(
ctx
,
nodeConfig
.
AgentConfig
.
NodeName
,
nodes
);
err
!=
nil
{
return
errors
.
Wrap
(
err
,
"failed to wait for PodCIDR assignment"
)
for
{
node
,
err
:=
nodes
.
Get
(
ctx
,
nodeName
,
metav1
.
GetOptions
{})
if
err
==
nil
&&
node
.
Spec
.
PodCIDR
!=
""
{
break
}
if
err
==
nil
{
logrus
.
Info
(
"Waiting for node "
+
nodeName
+
" CIDR not assigned yet"
)
}
else
{
logrus
.
Infof
(
"Waiting for node %s: %v"
,
nodeName
,
err
)
}
time
.
Sleep
(
2
*
time
.
Second
)
}
}
logrus
.
Info
(
"Node CIDR assigned for: "
+
nodeName
)
netMode
,
err
:=
findNetMode
(
nodeConfig
.
AgentConfig
.
ClusterCIDRs
)
netMode
,
err
:=
findNetMode
(
nodeConfig
.
AgentConfig
.
ClusterCIDRs
)
if
err
!=
nil
{
if
err
!=
nil
{
logrus
.
Fatalf
(
"Error checking netMode"
)
return
errors
.
Wrap
(
err
,
"failed to check netMode for flannel"
)
return
err
}
}
go
func
()
{
go
func
()
{
err
:=
flannel
(
ctx
,
nodeConfig
.
FlannelIface
,
nodeConfig
.
FlannelConf
,
nodeConfig
.
AgentConfig
.
KubeConfigKubelet
,
netMode
)
err
:=
flannel
(
ctx
,
nodeConfig
.
FlannelIface
,
nodeConfig
.
FlannelConf
,
nodeConfig
.
AgentConfig
.
KubeConfigKubelet
,
netMode
)
...
@@ -119,6 +107,28 @@ func Run(ctx context.Context, nodeConfig *config.Node, nodes v1.NodeInterface) e
...
@@ -119,6 +107,28 @@ func Run(ctx context.Context, nodeConfig *config.Node, nodes v1.NodeInterface) e
return
nil
return
nil
}
}
// waitForPodCIDR watches nodes with this node's name, and returns when the PodCIDR has been set.
func
waitForPodCIDR
(
ctx
context
.
Context
,
nodeName
string
,
nodes
typedcorev1
.
NodeInterface
)
error
{
fieldSelector
:=
fields
.
Set
{
metav1
.
ObjectNameField
:
nodeName
}
.
String
()
watch
,
err
:=
nodes
.
Watch
(
ctx
,
metav1
.
ListOptions
{
FieldSelector
:
fieldSelector
})
if
err
!=
nil
{
return
err
}
defer
watch
.
Stop
()
for
ev
:=
range
watch
.
ResultChan
()
{
node
,
ok
:=
ev
.
Object
.
(
*
corev1
.
Node
)
if
!
ok
{
return
fmt
.
Errorf
(
"could not convert event object to node: %v"
,
ev
)
}
if
node
.
Spec
.
PodCIDR
!=
""
{
break
}
}
logrus
.
Info
(
"PodCIDR assigned for node "
+
nodeName
)
return
nil
}
func
createCNIConf
(
dir
string
)
error
{
func
createCNIConf
(
dir
string
)
error
{
if
dir
==
""
{
if
dir
==
""
{
return
nil
return
nil
...
...
pkg/agent/run.go
View file @
38896344
...
@@ -31,11 +31,13 @@ import (
...
@@ -31,11 +31,13 @@ import (
"github.com/rancher/k3s/pkg/rootless"
"github.com/rancher/k3s/pkg/rootless"
"github.com/rancher/k3s/pkg/util"
"github.com/rancher/k3s/pkg/util"
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus"
corev1
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/equality"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes"
v1
"k8s.io/client-go/kubernetes/typed/core/v1"
typedcore
v1
"k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/clientcmd"
app2
"k8s.io/kubernetes/cmd/kube-proxy/app"
app2
"k8s.io/kubernetes/cmd/kube-proxy/app"
kubeproxyconfig
"k8s.io/kubernetes/pkg/proxy/apis/config"
kubeproxyconfig
"k8s.io/kubernetes/pkg/proxy/apis/config"
...
@@ -137,16 +139,16 @@ func run(ctx context.Context, cfg cmds.Agent, proxy proxy.Proxy) error {
...
@@ -137,16 +139,16 @@ func run(ctx context.Context, cfg cmds.Agent, proxy proxy.Proxy) error {
util
.
WaitForAPIServerReady
(
coreClient
,
30
*
time
.
Second
)
util
.
WaitForAPIServerReady
(
coreClient
,
30
*
time
.
Second
)
if
err
:=
configureNode
(
ctx
,
&
nodeConfig
.
AgentConfig
,
coreClient
.
CoreV1
()
.
Nodes
());
err
!=
nil
{
return
err
}
if
!
nodeConfig
.
NoFlannel
{
if
!
nodeConfig
.
NoFlannel
{
if
err
:=
flannel
.
Run
(
ctx
,
nodeConfig
,
coreClient
.
CoreV1
()
.
Nodes
());
err
!=
nil
{
if
err
:=
flannel
.
Run
(
ctx
,
nodeConfig
,
coreClient
.
CoreV1
()
.
Nodes
());
err
!=
nil
{
return
err
return
err
}
}
}
}
if
err
:=
configureNode
(
ctx
,
&
nodeConfig
.
AgentConfig
,
coreClient
.
CoreV1
()
.
Nodes
());
err
!=
nil
{
return
err
}
if
!
nodeConfig
.
AgentConfig
.
DisableNPC
{
if
!
nodeConfig
.
AgentConfig
.
DisableNPC
{
if
err
:=
netpol
.
Run
(
ctx
,
nodeConfig
);
err
!=
nil
{
if
err
:=
netpol
.
Run
(
ctx
,
nodeConfig
);
err
!=
nil
{
return
err
return
err
...
@@ -298,17 +300,18 @@ func validateCgroupsV2() error {
...
@@ -298,17 +300,18 @@ func validateCgroupsV2() error {
return
nil
return
nil
}
}
func
configureNode
(
ctx
context
.
Context
,
agentConfig
*
daemonconfig
.
Agent
,
nodes
v1
.
NodeInterface
)
error
{
func
configureNode
(
ctx
context
.
Context
,
agentConfig
*
daemonconfig
.
Agent
,
nodes
typedcorev1
.
NodeInterface
)
error
{
count
:=
0
fieldSelector
:=
fields
.
Set
{
metav1
.
ObjectNameField
:
agentConfig
.
NodeName
}
.
String
()
for
{
watch
,
err
:=
nodes
.
Watch
(
ctx
,
metav1
.
ListOptions
{
FieldSelector
:
fieldSelector
})
node
,
err
:=
nodes
.
Get
(
ctx
,
agentConfig
.
NodeName
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
if
count
%
30
==
0
{
}
logrus
.
Infof
(
"Waiting for kubelet to be ready on node %s: %v"
,
agentConfig
.
NodeName
,
err
)
defer
watch
.
Stop
()
}
count
++
for
ev
:=
range
watch
.
ResultChan
()
{
time
.
Sleep
(
1
*
time
.
Second
)
node
,
ok
:=
ev
.
Object
.
(
*
corev1
.
Node
)
continue
if
!
ok
{
return
fmt
.
Errorf
(
"could not convert event object to node: %v"
,
ev
)
}
}
updateNode
:=
false
updateNode
:=
false
...
@@ -338,12 +341,7 @@ func configureNode(ctx context.Context, agentConfig *daemonconfig.Agent, nodes v
...
@@ -338,12 +341,7 @@ func configureNode(ctx context.Context, agentConfig *daemonconfig.Agent, nodes v
if
updateNode
{
if
updateNode
{
if
_
,
err
:=
nodes
.
Update
(
ctx
,
node
,
metav1
.
UpdateOptions
{});
err
!=
nil
{
if
_
,
err
:=
nodes
.
Update
(
ctx
,
node
,
metav1
.
UpdateOptions
{});
err
!=
nil
{
logrus
.
Infof
(
"Failed to update node %s: %v"
,
agentConfig
.
NodeName
,
err
)
logrus
.
Infof
(
"Failed to update node %s: %v"
,
agentConfig
.
NodeName
,
err
)
select
{
continue
case
<-
ctx
.
Done
()
:
return
ctx
.
Err
()
case
<-
time
.
After
(
time
.
Second
)
:
continue
}
}
}
logrus
.
Infof
(
"labels have been set successfully on node: %s"
,
agentConfig
.
NodeName
)
logrus
.
Infof
(
"labels have been set successfully on node: %s"
,
agentConfig
.
NodeName
)
}
else
{
}
else
{
...
...
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