in projects/aws/upgrader/upgrade/kubeadm.go [216:279]
func (u *InPlaceUpgrader) KubeAdmInRestCP(ctx context.Context) error {
componentsDir, err := u.upgradeComponentsKubernetesBinDir()
if err != nil {
return fmt.Errorf("getting upgrade components kubernetes binary directory: %v", err)
}
if err = u.BackUpAndReplace(kubeAdmBinDir, componentsDir, fmt.Sprintf("%s/kubeadm", componentsDir)); err != nil {
return fmt.Errorf("backing up and replacing kubeadm binary: %v", err)
}
logger.Info("Backed up and replaced kubeadm binary successfully")
if err = u.backUpAndDeleteCoreDNSConfig(ctx, componentsDir); err != nil {
return fmt.Errorf("backing up and deleting coreDNS config: %v", err)
}
kubeAdmVersionCmd := []string{"kubeadm", "version", "-oshort"}
version, err := u.ExecCommand(ctx, kubeAdmVersionCmd[0], kubeAdmVersionCmd[1:]...)
if err != nil {
return execError(kubeAdmVersionCmd, string(version))
}
logger.Info("current version of kubeadm", "cmd", "kubeadm version -oshort", "output", string(version))
kubeAdmUpgNodeCmd := []string{"kubeadm", "upgrade", "node", "--ignore-preflight-errors=CoreDNSUnsupportedPlugins,CoreDNSMigration"}
// K8s version passed to the upgrader object is of the form vMajor.Minor.Patch-eksd-tag
// so it's safe to parse the version
kubeVersion := semver.MajorMinor(u.kubernetesVersion)
// From version 1.32 and above kubeadm upgrade tries to upgrade coredns
// even when the config map is deleted from the cluster. The coredns
// upgrade fails to update the actual deployment and we want capi
// to handle coredns upgrades.
//
// Ref: https://github.com/kubernetes/kubernetes/pull/126032
if semver.Compare(kubeVersion, kubeVersion132) >= 0 {
logger.Info("detected kubernetes version >= 1.32, skipping CoreDNS upgrade phase", "phase", "addon/coredns")
kubeAdmUpgNodeCmd = append(kubeAdmUpgNodeCmd, "--skip-phases=addon/coredns")
}
kubeAdmUpg, err := u.ExecCommand(ctx, kubeAdmUpgNodeCmd[0], kubeAdmUpgNodeCmd[1:]...)
if err != nil {
return execError(kubeAdmUpgNodeCmd, string(kubeAdmUpg))
}
logger.Info("verbose output for kubeadm upgrade", "output", string(kubeAdmUpg))
upgCmpDir, err := u.upgradeComponentsDir()
if err != nil {
return fmt.Errorf("getting upgrade components directory: %v", err)
}
newKubeVipConfigPath := fmt.Sprintf("%s/kube-vip.yaml", upgCmpDir)
if err := u.copy(staticKubeVipPath, fmt.Sprintf("%s/kube-vip.backup.yaml", upgCmpDir)); err != nil {
return copyError(staticKubeVipPath, fmt.Sprintf("%s/kube-vip.backup.yaml", upgCmpDir), err)
}
if err := u.copy(newKubeVipConfigPath, staticKubeVipPath); err != nil {
return copyError(newKubeVipConfigPath, staticKubeVipPath, err)
}
if err = u.restoreCoreDNSConfig(ctx, componentsDir); err != nil {
return fmt.Errorf("restoring coreDNS config: %v", err)
}
logger.Info("kubeadm upgrade in control plane successful!")
return nil
}