From 9360022bbec39281c515148e9ad0c2e8836d5ea4 Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Fri, 10 Mar 2023 00:23:46 +0000 Subject: [PATCH] Wait for kubelet to update the Ready status before reading port Signed-off-by: Brad Davidson --- pkg/agent/tunnel/tunnel.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/pkg/agent/tunnel/tunnel.go b/pkg/agent/tunnel/tunnel.go index 0e7b8bd9e3..5a77ea550a 100644 --- a/pkg/agent/tunnel/tunnel.go +++ b/pkg/agent/tunnel/tunnel.go @@ -41,6 +41,7 @@ type agentTunnel struct { ports map[string]bool mode string kubeletPort string + startTime time.Time } // explicit interface check @@ -72,12 +73,12 @@ func Setup(ctx context.Context, config *daemonconfig.Node, proxy proxy.Proxy) er } tunnel := &agentTunnel{ - client: client, - cidrs: cidranger.NewPCTrieRanger(), - ports: map[string]bool{}, - mode: config.EgressSelectorMode, - + client: client, + cidrs: cidranger.NewPCTrieRanger(), + ports: map[string]bool{}, + mode: config.EgressSelectorMode, kubeletPort: fmt.Sprint(ports.KubeletPort), + startTime: time.Now().Truncate(time.Second), } apiServerReady := make(chan struct{}) @@ -154,15 +155,25 @@ func (a *agentTunnel) setKubeletPort(ctx context.Context, apiServerReady <-chan <-apiServerReady wait.PollImmediateWithContext(ctx, time.Second, util.DefaultAPIServerReadyTimeout, func(ctx context.Context) (bool, error) { + var readyTime metav1.Time nodeName := os.Getenv("NODE_NAME") node, err := a.client.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{}) if err != nil { logrus.Debugf("Tunnel authorizer failed to get Kubelet Port: %v", err) return false, nil } + for _, cond := range node.Status.Conditions { + if cond.Type == v1.NodeReady && cond.Status == v1.ConditionTrue { + readyTime = cond.LastHeartbeatTime + } + } + if readyTime.Time.Before(a.startTime) { + logrus.Debugf("Waiting for Ready condition to be updated for Kubelet Port assignment") + return false, nil + } kubeletPort := strconv.FormatInt(int64(node.Status.DaemonEndpoints.KubeletEndpoint.Port), 10) if kubeletPort == "0" { - logrus.Debugf("Waiting for the kubelet port to be populated") + logrus.Debugf("Waiting for Kubelet Port to be set") return false, nil } a.kubeletPort = kubeletPort