Commit 9360022b authored by Brad Davidson's avatar Brad Davidson Committed by Brad Davidson

Wait for kubelet to update the Ready status before reading port

parent abda5307
...@@ -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,15 +155,25 @@ func (a *agentTunnel) setKubeletPort(ctx context.Context, apiServerReady <-chan ...@@ -154,15 +155,25 @@ 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
} }
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) kubeletPort := strconv.FormatInt(int64(node.Status.DaemonEndpoints.KubeletEndpoint.Port), 10)
if kubeletPort == "0" { 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 return false, nil
} }
a.kubeletPort = kubeletPort a.kubeletPort = kubeletPort
......
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