diff --git a/cmd/kubeadm/app/phases/upgrade/staticpods.go b/cmd/kubeadm/app/phases/upgrade/staticpods.go index 26b43b850c8..450a54a0910 100644 --- a/cmd/kubeadm/app/phases/upgrade/staticpods.go +++ b/cmd/kubeadm/app/phases/upgrade/staticpods.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "time" "github.com/pkg/errors" @@ -286,7 +287,8 @@ func performEtcdStaticPodUpgrade(certsRenewMgr *renewal.Manager, client clientse // or the kubeadm preferred one for the desired Kubernetes version var desiredEtcdVersion *version.Version if cfg.Etcd.Local.ImageTag != "" { - desiredEtcdVersion, err = version.ParseSemantic(cfg.Etcd.Local.ImageTag) + desiredEtcdVersion, err = version.ParseSemantic( + convertImageTagMetadataToSemver(cfg.Etcd.Local.ImageTag)) if err != nil { return true, errors.Wrapf(err, "failed to parse tag %q as a semantic version", cfg.Etcd.Local.ImageTag) } @@ -643,5 +645,14 @@ func GetEtcdImageTagFromStaticPod(manifestDir string) (string, error) { return "", err } - return image.TagFromImage(pod.Spec.Containers[0].Image), nil + return convertImageTagMetadataToSemver(image.TagFromImage(pod.Spec.Containers[0].Image)), nil +} + +// convertImageTagMetadataToSemver converts imagetag in the format of semver_metadata to semver+metadata +func convertImageTagMetadataToSemver(tag string) string { + // Container registries do not support `+` characters in tag names. This prevents imagetags from + // correctly representing semantic versions which use the plus symbol to delimit build metadata. + // Kubernetes uses the convention of using an underscore in image registries to preserve + // build metadata information in imagetags. + return strings.Replace(tag, "_", "+", 1) }