in kinder/pkg/cluster/manager/actions/kubeadm-join.go [40:91]
func joinControlPlanes(c *status.Cluster, usePhases bool, copyCertsMode CopyCertsMode, discoveryMode DiscoveryMode, kubeadmConfigVersion, patchesDir, ignorePreflightErrors string, wait time.Duration, vLevel int) (err error) {
cpX := []*status.Node{c.BootstrapControlPlane()}
for _, cp2 := range c.SecondaryControlPlanes().EligibleForActions() {
if err := copyPatchesToNode(cp2, patchesDir); err != nil {
return err
}
// if not automatic copy certs, simulate manual copy
if copyCertsMode == CopyCertsModeManual {
if err := copyCertificatesToNode(c, cp2); err != nil {
return err
}
}
// checks pre-loaded images available on the node (this will report missing images, if any)
kubeVersion, err := cp2.KubeVersion()
if err != nil {
return err
}
if err := checkImagesForVersion(cp2, kubeVersion); err != nil {
return err
}
// prepares the kubeadm config on this node
if err := KubeadmJoinConfig(c, kubeadmConfigVersion, copyCertsMode, discoveryMode, cp2); err != nil {
return err
}
// executes the kubeadm join control-plane workflow
if usePhases {
err = kubeadmJoinControlPlaneWithPhases(cp2, patchesDir, ignorePreflightErrors, vLevel)
} else {
err = kubeadmJoinControlPlane(cp2, patchesDir, ignorePreflightErrors, vLevel)
}
if err != nil {
return err
}
// updates the loadbalancer config with the new cp node
cpX = append(cpX, cp2)
if err := LoadBalancer(c, cpX...); err != nil {
return err
}
if err := waitNewControlPlaneNodeReady(c, cp2, wait); err != nil {
return err
}
}
return nil
}