From d93b75032629a415718077f70c55eb49a5946981 Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Wed, 27 Apr 2022 12:03:47 -0700 Subject: [PATCH] Don't start embedded kubelet until after apiserver is up Signed-off-by: Brad Davidson --- pkg/daemons/executor/embed.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/daemons/executor/embed.go b/pkg/daemons/executor/embed.go index e78e16de24..2b2ece5076 100644 --- a/pkg/daemons/executor/embed.go +++ b/pkg/daemons/executor/embed.go @@ -10,6 +10,7 @@ import ( "github.com/k3s-io/k3s/pkg/cli/cmds" daemonconfig "github.com/k3s-io/k3s/pkg/daemons/config" + "github.com/k3s-io/k3s/pkg/util" "github.com/k3s-io/k3s/pkg/version" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -19,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/client-go/kubernetes" typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" @@ -49,7 +51,16 @@ func (e *Embedded) Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, return nil } -func (*Embedded) Kubelet(ctx context.Context, args []string) error { +func (e *Embedded) Kubelet(ctx context.Context, args []string) error { + restConfig, err := clientcmd.BuildConfigFromFlags("", e.nodeConfig.AgentConfig.KubeConfigKubelet) + if err != nil { + return err + } + client, err := kubernetes.NewForConfig(restConfig) + if err != nil { + return err + } + command := kubelet.NewKubeletCommand(context.Background()) command.SetArgs(args) @@ -59,6 +70,12 @@ func (*Embedded) Kubelet(ctx context.Context, args []string) error { logrus.Fatalf("kubelet panic: %v", err) } }() + // The embedded executor doesn't need the kubelet to come up to host any components, and + // having it come up on servers before the apiserver is available causes a lot of log spew. + // Agents don't have access to the server's apiReady channel, so just wait directly. + if err := util.WaitForAPIServerReady(ctx, client, util.DefaultAPIServerReadyTimeout); err != nil { + logrus.Fatalf("Kubelet failed to wait for apiserver ready: %v", err) + } logrus.Fatalf("kubelet exited: %v", command.ExecuteContext(ctx)) }()