func()

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
}