Unverified Commit b7f90f38 authored by Daishan Peng's avatar Daishan Peng Committed by GitHub

Wait for kubelet port to be ready before setting (#7041)

* Wait for kubelet port to be ready before setting * Wait for kubelet to update the Ready status before reading port Signed-off-by: 's avatarDaishan Peng <daishan@acorn.io> Signed-off-by: 's avatarBrad Davidson <brad.davidson@rancher.com> Co-authored-by: 's avatarBrad Davidson <brad.davidson@rancher.com>
parent a45d0810
...@@ -41,6 +41,7 @@ type agentTunnel struct { ...@@ -41,6 +41,7 @@ type agentTunnel struct {
ports map[string]bool ports map[string]bool
mode string mode string
kubeletPort string kubeletPort string
startTime time.Time
} }
// explicit interface check // explicit interface check
...@@ -72,12 +73,12 @@ func Setup(ctx context.Context, config *daemonconfig.Node, proxy proxy.Proxy) er ...@@ -72,12 +73,12 @@ func Setup(ctx context.Context, config *daemonconfig.Node, proxy proxy.Proxy) er
} }
tunnel := &agentTunnel{ tunnel := &agentTunnel{
client: client, client: client,
cidrs: cidranger.NewPCTrieRanger(), cidrs: cidranger.NewPCTrieRanger(),
ports: map[string]bool{}, ports: map[string]bool{},
mode: config.EgressSelectorMode, mode: config.EgressSelectorMode,
kubeletPort: fmt.Sprint(ports.KubeletPort), kubeletPort: fmt.Sprint(ports.KubeletPort),
startTime: time.Now().Truncate(time.Second),
} }
apiServerReady := make(chan struct{}) apiServerReady := make(chan struct{})
...@@ -154,13 +155,28 @@ func (a *agentTunnel) setKubeletPort(ctx context.Context, apiServerReady <-chan ...@@ -154,13 +155,28 @@ func (a *agentTunnel) setKubeletPort(ctx context.Context, apiServerReady <-chan
<-apiServerReady <-apiServerReady
wait.PollImmediateWithContext(ctx, time.Second, util.DefaultAPIServerReadyTimeout, func(ctx context.Context) (bool, error) { wait.PollImmediateWithContext(ctx, time.Second, util.DefaultAPIServerReadyTimeout, func(ctx context.Context) (bool, error) {
var readyTime metav1.Time
nodeName := os.Getenv("NODE_NAME") nodeName := os.Getenv("NODE_NAME")
node, err := a.client.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{}) node, err := a.client.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{})
if err != nil { if err != nil {
logrus.Debugf("Tunnel authorizer failed to get Kubelet Port: %v", err) logrus.Debugf("Tunnel authorizer failed to get Kubelet Port: %v", err)
return false, nil return false, nil
} }
a.kubeletPort = strconv.FormatInt(int64(node.Status.DaemonEndpoints.KubeletEndpoint.Port), 10) 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 Kubelet Port to be set")
return false, nil
}
a.kubeletPort = kubeletPort
logrus.Infof("Tunnel authorizer set Kubelet Port %s", a.kubeletPort) logrus.Infof("Tunnel authorizer set Kubelet Port %s", a.kubeletPort)
return true, nil return true, nil
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment