func()

in projects/aws/upgrader/upgrade/kubeadm.go [39:137]


func (u *InPlaceUpgrader) KubeAdmInFirstCP(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")

	kubeAdmConfigBackUp := fmt.Sprintf("%s/kubeadm-config.backup.yaml", componentsDir)
	newKubeAdmConfig := fmt.Sprintf("%s/kubeadm-config.yaml", componentsDir)

	getClusterConfigCmd := []string{"kubectl", "get", "cm", "-n", kubeSystemNS, "kubeadm-config", "-ojsonpath='{.data.ClusterConfiguration}'", "--kubeconfig", kubeConfigPath}
	out, err := u.ExecCommand(ctx, getClusterConfigCmd[0], getClusterConfigCmd[1:]...)
	if err != nil {
		return execError(getClusterConfigCmd, string(out))
	}

	trimmedOut := strings.Trim(string(out), "`'")
	err = u.WriteFile(kubeAdmConfigBackUp, []byte(trimmedOut), fileMode640)
	if err != nil {
		return fmt.Errorf("writing kubeadm config to backup file: %v", err)
	}

	if u.etcdVersion != noEtcdUpdate {
		if err = u.updateEtcdVersion(kubeAdmConfigBackUp, newKubeAdmConfig, u.etcdVersion); err != nil {
			return fmt.Errorf("updating etcd version to %s: %v", u.etcdVersion, err)
		}
	}

	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))

	// 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.30 and above kubeadm upgrade needs special handling from legacy flow
	// as --config flag starts supporting and actual kubeadm upgradeConfiguration type and not cluster configuration type
	// Ref: https://github.com/kubernetes/kubernetes/pull/123068
	// Issue: https://github.com/kubernetes/kubeadm/issues/3054
	if semver.Compare(kubeVersion, kubeVersion130) >= 0 {
		updatedClusterConfig, err := u.ReadFile(newKubeAdmConfig)
		if err != nil {
			return err
		}
		err = u.kubeAdmUpgradeVersion130AndAbove(ctx, componentsDir, string(updatedClusterConfig))
		if err != nil {
			return err
		}
	} else {
		if err = u.appendKubeletConfig(ctx, newKubeAdmConfig); err != nil {
			return fmt.Errorf("appending kubelet config: %v", err)
		}
		kubeAdmUpgPlanCmd := []string{"kubeadm", "upgrade", "plan", "--ignore-preflight-errors=CoreDNSUnsupportedPlugins,CoreDNSMigration", "--config", newKubeAdmConfig}
		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", "--ignore-preflight-errors=CoreDNSUnsupportedPlugins,CoreDNSMigration", "--config", newKubeAdmConfig, "--allow-experimental-upgrades", "--yes", "--force"}
		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))
	}
	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 first control plane successful!", "version", u.kubernetesVersion)

	return nil
}