Worker Node Fails to Join the Cluster
Problem
A Kubernetes cluster stays in a scaling-up / provisioning state for an extended period.
In Private Cloud Director, under Kubernetes > Infrastructure > Clusters, opening the affected cluster and going to its Capacity and Health tab shows a Node Groups entry where Ready Replicas is lower than Desired Replicas, and the corresponding worker row in the Nodes table shows a K8s Node status
Unknown(or blank) even though its Machine Status already showsRunning.kubectl get nodesdoes not list the new worker node either, even though it has had enough time to boot and join.
Environment
Private Cloud Director
Component - Kubernetes
Cause
The new worker node booted, but the step that registers it with the cluster (kubeadm join) failed, and nothing retried it automatically. Once this happens, the worker node stays in Unknown state — it never finishes joining, and the cluster keeps waiting for a node that will never appear on its own.
A common trigger is the cluster's control plane not yet being fully ready when the new worker tried to join (for example, right after the cluster was created or scaled). The join step contacts the control plane's API server, and if that call times out, the join fails outright rather than retrying.
Detecting it
In Private Cloud Director dashboard, go to Kubernetes > Infrastructure > Clusters and open the affected cluster, then switch to its Capacity and Health tab. In the Nodes table, find the worker row whose K8s Node status is
Unknown— that's the stuck node.SSH into that worker VM (on an isolated/virtual network this typically requires going through a jumphost) and check the node's boot and kubelet status:
cloud-init statusreportingerror, together with akubeadm join/ preflight error in the kubelet log (for example, a timeout fetching cluster config, or a "kubelet config file ... no such file or directory" error), confirms the join failed on this node.
Check that the cluster's control plane is reachable from the worker, using the same endpoint the node would use to join:
HTTP 200 okmeans the control plane is healthy right now, so the earlier failure was transient — it's safe to retry the join (see Resolution below).If this still fails, the control plane itself is not reachable — that's a separate connectivity/DNS/certificate issue. Resolve that first; retrying the join will not help until this succeeds.
Resolution
The steps below assume the control plane is confirmed reachable and healthy (previous section, step 3).
Confirm the VM is in a clean, failed-join state before retrying — no leftover Kubernetes config means it's safe to simply re-run the join, no reset needed:
Both commands should print MISSING.
If so, the simplest fix is to let Private Cloud Director recreate the node instead of fixing the VM in place: go to Kubernetes > Infrastructure > Clusters, open the cluster, switch to the Capacity and Health tab, select the affected row in the Nodes table, and delete it. The node group will bring up a fresh replacement automatically — this is the recommended option when the exact VM does not need to be preserved.
Alternative: re-run the join on the existing VM instead, using the same configuration it was originally given (reusing it avoids having to regenerate tokens/certificates):
Verify the node joins and becomes
Readywithin a couple of minutes — either from the Nodes table in the Capacity and Health tab, or:
Last updated
