diff --git a/controlplane/kubeadm/internal/controllers/controller.go b/controlplane/kubeadm/internal/controllers/controller.go index 3e6bc71af9ea..c75f8e3d10e7 100644 --- a/controlplane/kubeadm/internal/controllers/controller.go +++ b/controlplane/kubeadm/internal/controllers/controller.go @@ -222,11 +222,22 @@ func (r *KubeadmControlPlaneReconciler) Reconcile(ctx context.Context, req ctrl. reterr = kerrors.NewAggregate([]error{reterr, err}) } - // TODO: remove this as soon as we have a proper remote cluster cache in place. - // Make KCP to requeue in case status is not ready, so we can check for node status without waiting for a full resync (by default 10 minutes). - // Only requeue if we are not going in exponential backoff due to error, or if we are not already re-queueing, or if the object has a deletion timestamp. - if reterr == nil && !res.Requeue && res.RequeueAfter <= 0 && kcp.ObjectMeta.DeletionTimestamp.IsZero() { - if !kcp.Status.Ready { + if reterr == nil && kcp.ObjectMeta.DeletionTimestamp.IsZero() { + // TODO: remove this as soon as we have a proper remote cluster cache in place. + // Make KCP to requeue in case status is not ready, so we can check for node status without waiting for a full resync (by default 10 minutes). + // Only requeue if we are not going in exponential backoff due to error, or if we are not already re-queueing, or if the object has a deletion timestamp. + if !res.Requeue && res.RequeueAfter <= 0 { + if !kcp.Status.Ready { + res = ctrl.Result{RequeueAfter: 20 * time.Second} + } + } + + // Make sure KCP gets requeued if ControlPlaneComponentsHealthyCondition is still false. + // Otherwise KCP would only get requeued when KCP or the Cluster gets a change or via reaching the resyncperiod. + // That would lead to a delay in provisioning MachineDeployments when preflight checks are enabled. + // The alternative solution to this requeue would be watching the relevant pods inside each workload + // cluster which would be very expensive. + if res.IsZero() && conditions.IsFalse(kcp, controlplanev1.ControlPlaneComponentsHealthyCondition) { res = ctrl.Result{RequeueAfter: 20 * time.Second} } }