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
}