Another note on using the vSphere provisioner. In your cloud-init section add a wait operation for open-vm-tools. The provisioner sometimes encounters a race condition wherein the node will join cluster-api but the machine secret will be deleted causing a diff between what cluster management vs cluster api. The wait allows VMware tools to report back and prevent looping of nodes as they are being replaced.