Skip to content

Commit 1f20a8d

Browse files
committed
Adding etcd upgrade to kubeadm upgrade apply
List of changes: - Refactoring staticpod and waiter functions
1 parent 39830f3 commit 1f20a8d

File tree

13 files changed

+331
-57
lines changed

13 files changed

+331
-57
lines changed

cmd/kubeadm/app/cmd/upgrade/apply.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func NewCmdApply(parentFlags *cmdUpgradeFlags) *cobra.Command {
6363
flags := &applyFlags{
6464
parent: parentFlags,
6565
imagePullTimeout: 15 * time.Minute,
66-
etcdUpgrade: true,
66+
etcdUpgrade: false,
6767
}
6868

6969
cmd := &cobra.Command{
@@ -93,7 +93,7 @@ func NewCmdApply(parentFlags *cmdUpgradeFlags) *cobra.Command {
9393
cmd.Flags().BoolVarP(&flags.nonInteractiveMode, "yes", "y", flags.nonInteractiveMode, "Perform the upgrade and do not prompt for confirmation (non-interactive mode).")
9494
cmd.Flags().BoolVarP(&flags.force, "force", "f", flags.force, "Force upgrading although some requirements might not be met. This also implies non-interactive mode.")
9595
cmd.Flags().BoolVar(&flags.dryRun, "dry-run", flags.dryRun, "Do not change any state, just output what actions would be performed.")
96-
cmd.Flags().BoolVar(&flags.etcdUpgrade, "etcd-upgrade", flags.etcdUpgrade, "Perform the upgrade of ETCD.")
96+
cmd.Flags().BoolVar(&flags.etcdUpgrade, "etcd-upgrade", flags.etcdUpgrade, "Perform the upgrade of etcd.")
9797
cmd.Flags().DurationVar(&flags.imagePullTimeout, "image-pull-timeout", flags.imagePullTimeout, "The maximum amount of time to wait for the control plane pods to be downloaded.")
9898

9999
return cmd
@@ -225,7 +225,7 @@ func PerformControlPlaneUpgrade(flags *applyFlags, client clientset.Interface, w
225225
fmt.Printf("[upgrade/apply] Upgrading your Self-Hosted control plane to version %q...\n", flags.newK8sVersionStr)
226226

227227
// Upgrade the self-hosted cluster
228-
return nil // upgrade.SelfHostedControlPlane(client, waiter, internalcfg, flags.newK8sVersion)
228+
return upgrade.SelfHostedControlPlane(client, waiter, internalcfg, flags.newK8sVersion)
229229
}
230230

231231
// OK, the cluster is hosted using static pods. Upgrade a static-pod hosted cluster

cmd/kubeadm/app/constants/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ go_test(
3434
srcs = ["constants_test.go"],
3535
importpath = "k8s.io/kubernetes/cmd/kubeadm/app/constants",
3636
library = ":go_default_library",
37+
deps = ["//pkg/util/version:go_default_library"],
3738
)

cmd/kubeadm/app/constants/constants.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,15 +201,39 @@ var (
201201
DefaultTokenUsages = []string{"signing", "authentication"}
202202

203203
// MasterComponents defines the master component names
204-
MasterComponents = []string{KubeAPIServer, KubeControllerManager, KubeScheduler, Etcd}
204+
MasterComponents = []string{KubeAPIServer, KubeControllerManager, KubeScheduler}
205205

206206
// MinimumControlPlaneVersion specifies the minimum control plane version kubeadm can deploy
207207
MinimumControlPlaneVersion = version.MustParseSemantic("v1.8.0")
208208

209209
// MinimumKubeletVersion specifies the minimum version of kubelet which kubeadm supports
210210
MinimumKubeletVersion = version.MustParseSemantic("v1.8.0")
211+
212+
// SupportedEtcdVersion lists officially supported etcd versions with corresponding kubernetes releases
213+
SupportedEtcdVersion = map[uint8]string{
214+
8: "3.0.17",
215+
9: "3.1.10",
216+
}
211217
)
212218

219+
// EtcdSupportedVersion returns officially supported version of etcd for a specific kubernetes release
220+
// if passed version is not listed, the function returns nil and an error
221+
func EtcdSupportedVersion(versionString string) (*version.Version, error) {
222+
kubernetesVersion, err := version.ParseSemantic(versionString)
223+
if err != nil {
224+
return nil, err
225+
}
226+
227+
if etcdStringVersion, ok := SupportedEtcdVersion[uint8(kubernetesVersion.Minor())]; ok {
228+
etcdVersion, err := version.ParseSemantic(etcdStringVersion)
229+
if err != nil {
230+
return nil, err
231+
}
232+
return etcdVersion, nil
233+
}
234+
return nil, fmt.Errorf("Unsupported or unknown kubernetes version")
235+
}
236+
213237
// GetStaticPodDirectory returns the location on the disk where the Static Pod should be present
214238
func GetStaticPodDirectory() string {
215239
return filepath.Join(KubernetesDir, ManifestsSubDirName)

cmd/kubeadm/app/constants/constants_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ limitations under the License.
1717
package constants
1818

1919
import (
20+
"fmt"
21+
"k8s.io/kubernetes/pkg/util/version"
22+
"strings"
2023
"testing"
2124
)
2225

@@ -110,3 +113,58 @@ func TestAddSelfHostedPrefix(t *testing.T) {
110113
}
111114
}
112115
}
116+
117+
func TestEtcdSupportedVersion(t *testing.T) {
118+
var tests = []struct {
119+
kubernetesVersion string
120+
expectedVersion *version.Version
121+
expectedError error
122+
}{
123+
{
124+
kubernetesVersion: "1.8.0",
125+
expectedVersion: version.MustParseSemantic("3.0.17"),
126+
expectedError: nil,
127+
},
128+
{
129+
kubernetesVersion: "1.80.0",
130+
expectedVersion: nil,
131+
expectedError: fmt.Errorf("Unsupported or unknown kubernetes version"),
132+
},
133+
{
134+
kubernetesVersion: "1.9.0",
135+
expectedVersion: version.MustParseSemantic("3.1.10"),
136+
expectedError: nil,
137+
},
138+
{
139+
kubernetesVersion: "1.10.0",
140+
expectedVersion: nil,
141+
expectedError: fmt.Errorf("Unsupported or unknown kubernetes version"),
142+
},
143+
{
144+
kubernetesVersion: "1.8.6",
145+
expectedVersion: version.MustParseSemantic("3.0.17"),
146+
expectedError: nil,
147+
},
148+
}
149+
for _, rt := range tests {
150+
actualVersion, actualError := EtcdSupportedVersion(rt.kubernetesVersion)
151+
if actualError != nil {
152+
if actualError.Error() != rt.expectedError.Error() {
153+
t.Errorf(
154+
"failed EtcdSupportedVersion:\n\texpected error: %v\n\t actual error: %v",
155+
rt.expectedError,
156+
actualError,
157+
)
158+
}
159+
160+
} else {
161+
if strings.Compare(actualVersion.String(), rt.expectedVersion.String()) != 0 {
162+
t.Errorf(
163+
"failed EtcdSupportedVersion:\n\texpected version: %s\n\t actual version: %s",
164+
rt.expectedVersion.String(),
165+
actualVersion.String(),
166+
)
167+
}
168+
}
169+
}
170+
}

cmd/kubeadm/app/images/images.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,13 @@ func GetCoreImage(image, repoPrefix, k8sVersion, overrideImage string) string {
3030
return overrideImage
3131
}
3232
kubernetesImageTag := kubeadmutil.KubernetesVersionToImageTag(k8sVersion)
33+
etcdImageTag := constants.DefaultEtcdVersion
34+
etcdImageVersion, err := constants.EtcdSupportedVersion(k8sVersion)
35+
if err == nil {
36+
etcdImageTag = etcdImageVersion.String()
37+
}
3338
return map[string]string{
34-
constants.Etcd: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "etcd", runtime.GOARCH, constants.DefaultEtcdVersion),
39+
constants.Etcd: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "etcd", runtime.GOARCH, etcdImageTag),
3540
constants.KubeAPIServer: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-apiserver", runtime.GOARCH, kubernetesImageTag),
3641
constants.KubeControllerManager: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-controller-manager", runtime.GOARCH, kubernetesImageTag),
3742
constants.KubeScheduler: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-scheduler", runtime.GOARCH, kubernetesImageTag),

cmd/kubeadm/app/phases/etcd/local.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ func CreateLocalEtcdStaticPodManifestFile(manifestDir string, cfg *kubeadmapi.Ma
3636

3737
// gets etcd StaticPodSpec, actualized for the current MasterConfiguration
3838
spec := GetEtcdPodSpec(cfg)
39-
4039
// writes etcd StaticPod to disk
4140
if err := staticpodutil.WriteStaticPodToDisk(kubeadmconstants.Etcd, manifestDir, spec); err != nil {
4241
return err
@@ -56,7 +55,7 @@ func GetEtcdPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.Pod {
5655
return staticpodutil.ComponentPod(v1.Container{
5756
Name: kubeadmconstants.Etcd,
5857
Command: getEtcdCommand(cfg),
59-
Image: images.GetCoreImage(kubeadmconstants.Etcd, cfg.ImageRepository, "", cfg.Etcd.Image),
58+
Image: images.GetCoreImage(kubeadmconstants.Etcd, cfg.ImageRepository, cfg.KubernetesVersion, cfg.Etcd.Image),
6059
// Mount the etcd datadir path read-write so etcd can store data in a more persistent manner
6160
VolumeMounts: []v1.VolumeMount{staticpodutil.NewVolumeMount(etcdVolumeName, cfg.Etcd.DataDir, false)},
6261
LivenessProbe: staticpodutil.ComponentProbe(cfg, kubeadmconstants.Etcd, 2379, "/health", v1.URISchemeHTTP),

cmd/kubeadm/app/phases/upgrade/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ go_library(
2626
"//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library",
2727
"//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library",
2828
"//cmd/kubeadm/app/phases/controlplane:go_default_library",
29+
"//cmd/kubeadm/app/phases/etcd:go_default_library",
2930
"//cmd/kubeadm/app/phases/selfhosting:go_default_library",
3031
"//cmd/kubeadm/app/phases/uploadconfig:go_default_library",
3132
"//cmd/kubeadm/app/util:go_default_library",
@@ -73,6 +74,7 @@ go_test(
7374
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
7475
"//cmd/kubeadm/app/constants:go_default_library",
7576
"//cmd/kubeadm/app/phases/controlplane:go_default_library",
77+
"//cmd/kubeadm/app/phases/etcd:go_default_library",
7678
"//cmd/kubeadm/app/util/apiclient:go_default_library",
7779
"//pkg/api/legacyscheme:go_default_library",
7880
"//pkg/util/version:go_default_library",

0 commit comments

Comments
 (0)