Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A second node joins only after it can reach the Kubernetes API server, verify the cluster CA, authenticate with a valid bootstrap token, and complete TLS bootstrap. Start with a newly generated command from a working control-plane node, then troubleshoot the phase named in the error: preflight, discovery, TLS bootstrap, or kubelet startup.

Use a fresh join command first

On a working control-plane node, generate a new worker command:

sudo kubeadm token create --print-join-command

Run the printed command on the node you are adding. Its usual form is:

sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

Bootstrap tokens can expire. Recreating one and printing the complete command avoids copying an old token, an incorrect API endpoint, or a mismatched CA hash.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall

Identify which kubeadm phase failed

Do not treat every join error as a token problem. Preserve the complete terminal output and rerun the command with higher verbosity, for example by appending --v=5. The failing phase usually narrows the fix:

  • Preflight: the joining host has a blocking local condition.
  • Discovery: the node cannot find or validate the API server using the supplied discovery data.
  • TLS bootstrap: discovery succeeded, but the node cannot authenticate or obtain kubelet credentials.
  • Kubelet start: credentials were obtained, but the local kubelet or runtime cannot start correctly.

Fix “couldn’t validate the identity of the API Server”

This message concerns discovery trust. The token tells the cluster who is attempting to join; the sha256 pin tells kubeadm which cluster CA is trusted. Both checks must succeed.

Confirm the endpoint is the intended cluster

Check that the host name or IP in the command resolves to the control-plane endpoint you actually operate and that the node can reach TCP port 6443. For example:

getent hosts <control-plane-host>
nc -vz <control-plane-host> 6443

Correct DNS, routing, firewall rules, load-balancer listeners, or security-group rules that prevent access. A reachable port is necessary but does not replace CA validation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Regenerate or verify the CA pin

If the hash is missing or suspect, obtain it from the control plane’s CA certificate. The documented OpenSSL pipeline is:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | 
  openssl rsa -pubin -outform der 2>/dev/null | 
  openssl dgst -sha256 -hex | sed 's/^.* //'

Use the resulting hexadecimal value after sha256: in a newly generated join command. Do not casually add --discovery-token-unsafe-skip-ca-verification: it removes the protection that prevents the node from accepting an impostor API server.

Resolve common preflight failures

Preflight checks describe conditions on the joining host that kubeadm expects you to correct. Fix the reported condition rather than suppressing the check.

Stale kubeadm or kubelet state

If the machine was partially joined before, inspect the exact paths and services named in the error. Remove stale state only when you are certain the machine is not an active cluster member, then retry the join. A reset performed on the wrong host can destroy a valid node’s local configuration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Swap enabled

Disable swap when the preflight output reports it. Confirm the change persists across reboot if the host is intended to remain a Kubernetes node.

Insufficient privileges

Run the command with the privileges required to write Kubernetes configuration and manage the kubelet, normally through sudo. Also verify that the account can use the selected container runtime.

Container runtime unavailable

Install and start a supported CRI, and make sure kubeadm is pointed at the runtime socket intended for this host. A running kubelet without a functioning CRI cannot finish node setup.

Should you use --ignore-preflight-errors?

The flag exists for deliberate, documented exceptions. Ignoring every check hides conditions that can make the node unstable or unsafe. If you must ignore one condition, name only that check and record why it is acceptable.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Choice Operational effect Risk and reversibility
Fix the reported condition Restores the host to kubeadm’s expected state before joining. Usually the safer and more reversible path; the underlying cause is visible.
Ignore one named check Allows the join to continue despite a known exception. Acceptable only with a specific rationale; the unresolved condition remains.
Ignore all checks Suppresses broad host validation. Unsafe operational practice because important blockers are concealed.

Check version, runtime, and network compatibility

Version alignment

Verify that kubeadm and Kubernetes versions on the joining host are compatible with the cluster. Version or RBAC mismatches can appear during discovery, certificate requests, or kubelet startup. Use the versions already supported by your cluster rather than copying a command from a different release.

Network interface selection

Hosts with multiple interfaces can advertise an address that other cluster components cannot reach. Confirm that the node’s selected interface and advertised address are on the network that can communicate with the API server and the rest of the cluster. Correct routing or explicitly configure the intended interface before retrying.

Stable endpoint versus a direct control-plane address

Endpoint design Best fit Trade-off
Direct control-plane host or IP Small clusters or a one-control-plane setup. Simple, but joins depend on that node’s address and availability.
Stable DNS name or load-balanced control-plane endpoint Clusters designed for control-plane failover or a changing control-plane address. Requires correctly configured DNS or load balancing and a listener on the Kubernetes API port.

Use the endpoint that is reachable from every node and remains valid for the cluster’s intended lifetime. Changing only the join command cannot compensate for an unavailable or unstable endpoint.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Understand token discovery and alternatives

The usual token-based command combines a bootstrap token with CA-hash pinning. Kubernetes also supports file or HTTPS discovery, which can be useful when you need tighter control over how discovery data is distributed.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Discovery method Security model Operational control
Token discovery with CA hash Short-lived bootstrap credential plus explicit CA identity verification. Easy to regenerate and automate from a control-plane node; protect the token while it is valid.
File or HTTPS discovery Trust is based on the supplied discovery file or HTTPS channel and its configured verification. Useful when distributing a controlled discovery document, but requires managing that document and its transport.

Whichever method you use, discovery and TLS bootstrap remain separate trust steps: finding the API server does not by itself grant the node permanent kubelet credentials.

When the token works but TLS bootstrap fails

A successful discovery phase is followed by a certificate-signing request and secure kubelet credential setup. If this stage fails, inspect the full error for authentication, authorization, certificate, or kubelet messages.

  • Regenerate the token if it is expired or was copied incorrectly.
  • Check that the node’s clock, DNS, and route to the API endpoint are functioning.
  • Verify that the cluster’s bootstrap and node RBAC configuration has not been modified to deny the expected request.
  • Confirm that the kubelet is enabled and that its configured runtime and certificate directories are writable by the required services.

Verify that the node actually registered

Joining is not complete merely because the command returned without an immediate error. From a control-plane machine, run:

kubectl get nodes

Wait for the new node to appear and become Ready. If it appears as NotReady, the join and registration occurred; investigate kubelet health, the container runtime, node networking, and the cluster’s networking add-on separately.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A practical retry sequence

  1. Save the complete failed output and identify the phase.
  2. On a working control-plane node, run sudo kubeadm token create --print-join-command.
  3. Confirm the printed endpoint resolves from the joining host and accepts connections on port 6443.
  4. Run the fresh command with sudo and increased verbosity.
  5. Correct each reported preflight condition; do not suppress all checks.
  6. If discovery identity validation fails, verify the CA hash and endpoint instead of disabling CA verification.
  7. After a successful command, use kubectl get nodes and wait for Ready.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.