in projects/aws/upgrader/upgrade/kubeadm.go [144:207]
func (u *InPlaceUpgrader) kubeAdmUpgradeVersion130AndAbove(ctx context.Context, cmpDir, clusterConfig string) error {
kubeAdmConfCM := generateKubeAdmConfCM(clusterConfig)
kubeAdmConfCMData, err := yaml.Marshal(kubeAdmConfCM)
if err != nil {
return fmt.Errorf("marshaling kubeadm-config config map: %v", err)
}
KubeAdmConfCMYaml := fmt.Sprintf("%s/kubeadm-config-cm.yaml", cmpDir)
err = u.WriteFile(KubeAdmConfCMYaml, kubeAdmConfCMData, fileMode640)
if err != nil {
return fmt.Errorf("writing kubeadm upgrade config: %v", err)
}
applyKubeAdmConfCMCmd := []string{"kubectl", "apply", "-f", KubeAdmConfCMYaml, "--kubeconfig", kubeConfigPath}
out, err := u.ExecCommand(ctx, applyKubeAdmConfCMCmd[0], applyKubeAdmConfCMCmd[1:]...)
if err != nil {
return execError(applyKubeAdmConfCMCmd, string(out))
}
logger.Info("updated config map kubeadm-config on cluster")
upgradeConfig := generateKubeAdmUpgradeConfig(u.kubernetesVersion)
upgradeConfigData, err := yaml.Marshal(&upgradeConfig)
if err != nil {
return fmt.Errorf("marshaling kubeadm upgrade config: %v", err)
}
kubeAdmUpgradeConfigYaml := fmt.Sprintf("%s/kubeadm-upgrade-config.yaml", cmpDir)
err = u.WriteFile(kubeAdmUpgradeConfigYaml, upgradeConfigData, fileMode640)
if err != nil {
return fmt.Errorf("writing kubeadm upgrade config: %v", err)
}
logger.Info("generated kubeadm upgrade config for k8s version >= 1.30", "fileLocation", kubeAdmUpgradeConfigYaml, "k8sVersion", u.kubernetesVersion)
kubeAdmUpgPlanCmd := []string{"kubeadm", "upgrade", "plan", "--config", kubeAdmUpgradeConfigYaml}
kubeAdmUpgPlan, err := u.ExecCommand(ctx, kubeAdmUpgPlanCmd[0], kubeAdmUpgPlanCmd[1:]...)
if err != nil {
return execError(kubeAdmUpgPlanCmd, string(kubeAdmUpgPlan))
}
logger.Info("components to be upgraded with kubeadm", "output", string(kubeAdmUpgPlan))
kubeAdmUpgCmd := []string{"kubeadm", "upgrade", "apply", "--config", kubeAdmUpgradeConfigYaml}
// 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")
kubeAdmUpgCmd = append(kubeAdmUpgCmd, "--skip-phases=addon/coredns")
}
kubeAdmUpg, err := u.ExecCommand(ctx, kubeAdmUpgCmd[0], kubeAdmUpgCmd[1:]...)
if err != nil {
return execError(kubeAdmUpgCmd, string(kubeAdmUpg))
}
logger.Info("verbose output for kubeadm upgrade", "output", string(kubeAdmUpg))
return nil
}