Skip to content
This repository was archived by the owner on Feb 6, 2025. It is now read-only.

Commit

Permalink
Support Patternless kubernetes packages
Browse files Browse the repository at this point in the history
Without this patch, skuba is not able to install the new
kind of packages (patternless).

This is a problem, as it is necessary to install
caasp5 this way, which itself is necessary because
migrations from caasp4 to caasp5 break clusters by
auto-upgrading to kubernetes 1.18 without using
skuba.

This patch tackles both the greenfield and the upgrade
cases, where we remove the previous packages,
and install the new kind of pkgs.

Partial Fix: SUSE/avant-garde#1663
  • Loading branch information
evrardjp committed Jun 24, 2020
1 parent 9d92ffd commit 1d7dd99
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 24 deletions.
83 changes: 75 additions & 8 deletions internal/pkg/skuba/deployments/ssh/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ const (
func init() {
stateMap["kubernetes.bootstrap.upload-secrets"] = kubernetesUploadSecrets(KubernetesUploadSecretsContinueOnError)
stateMap["kubernetes.join.upload-secrets"] = kubernetesUploadSecrets(KubernetesUploadSecretsFailOnError)
stateMap["kubernetes.install-node-pattern"] = kubernetesInstallNodePattern
stateMap["kubernetes.install-fresh-pkgs"] = kubernetesFreshInstallAllPkgs
stateMap["kubernetes.upgrade-kubeadm-pkg"] = kubernetesUpgradeKubeadmPkg
stateMap["kubernetes.upgrade-other-kubernetes-pkgs"] = kubernetesUpgradeOtherPkgs
stateMap["kubernetes.restart-services"] = kubernetesRestartServices
}

Expand All @@ -56,24 +58,89 @@ func kubernetesUploadSecrets(errorHandling KubernetesUploadSecretsErrorBehavior)
}
}

func kubernetesInstallNodePattern(t *Target, data interface{}) error {
func kubernetesParseInterfaceVersions(data interface{}) (string, string, error) {
kubernetesBaseOSConfiguration, ok := data.(deployments.KubernetesBaseOSConfiguration)
if !ok {
return errors.New("couldn't access kubernetes base OS configuration")
return "", "", errors.New("couldn't access kubernetes base OS configuration")
}

v, err := version.ParseSemantic(kubernetesBaseOSConfiguration.CurrentVersion)
if err != nil {
return err
return "", "", err
}
currentVersion := kubernetes.MajorMinorVersion(v)
patternName := fmt.Sprintf("patterns-caasp-Node-%s", currentVersion)
updatedVersion := ""

if kubernetesBaseOSConfiguration.UpdatedVersion != "" {
updatedVersion := kubernetes.MajorMinorVersion(version.MustParseSemantic(kubernetesBaseOSConfiguration.UpdatedVersion))
patternName = fmt.Sprintf("patterns-caasp-Node-%s-%s", currentVersion, updatedVersion)
updatedVersion = kubernetes.MajorMinorVersion(version.MustParseSemantic(kubernetesBaseOSConfiguration.UpdatedVersion))
}
return currentVersion, updatedVersion, nil
}

func kubernetesFreshInstallAllPkgs(t *Target, data interface{}) error {
current, _, err := kubernetesParseInterfaceVersions(data)
if err != nil {
return err
}
_, _, err = t.ssh("zypper", "--userdata", "skuba", "--non-interactive", "install", patternName)
var pkgs []string

pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-kubeadm", current))
pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-kubelet", current))
pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-client", current))
_, _, err = t.zypperInstall(pkgs...)
return err
}

func kubernetesUpgradeKubeadmPkg(t *Target, data interface{}) error {
// zypper install -- -kubernetes-old-kubeadm +kubernetes-new-kubeadm
currentV, nextV, err := kubernetesParseInterfaceVersions(data)
if err != nil {
return err
}
if nextV == "" {
return errors.New("Incorrect upgrade version")
}

var pkgs []string

if currentV == "1.17" {
// on 1.17 we can't remove kubernetes-1.17-kubeadm, doesn't exist.
// removing kubeadm remove many things, but keeps kubelet alive, to
// be removed on the next step
pkgs = append(pkgs, "-patterns-caasp-Node-1.17", "-kubernetes-kubeadm", "-cri-o-kubeadm-criconfig")
} else {
pkgs = append(pkgs, fmt.Sprintf("-kubernetes-%s-kubeadm", currentV))
}

pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-kubeadm", nextV))
_, _, err = t.zypperInstall(pkgs...)
return err
}

func kubernetesUpgradeOtherPkgs(t *Target, data interface{}) error {
// Installs the rest of the zypper kubernetes packages during the upgrade
// with zypper install -- -kubernetes-old-* +kubernetes-new-*
// We might need some fine grained installation instead
currentV, nextV, err := kubernetesParseInterfaceVersions(data)
if err != nil {
return err
}
if nextV == "" {
return errors.New("Incorrect upgrade version")
}

var pkgs []string

if currentV == "1.17" {
// on 1.17 we need to finalize the cleanup
pkgs = append(pkgs, "-kubernetes-kubelet -kubernetes-common -kubernetes-client")
} else {
pkgs = append(pkgs, fmt.Sprintf("-kubernetes-%s-*", currentV))
}

pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-client", nextV))
pkgs = append(pkgs, fmt.Sprintf("+kubernetes-%s-kubelet", nextV))
_, _, err = t.zypperInstall(pkgs...)
return err
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019 SUSE LLC.
* Copyright (c) 2020 SUSE LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -15,12 +15,13 @@
*
*/

package deployments
package ssh

func (t *Target) InstallNodePattern(kubernetesBaseOSConfiguration KubernetesBaseOSConfiguration) (bool, error) {
err := t.Apply(kubernetesBaseOSConfiguration, "kubernetes.install-node-pattern")
if err != nil {
return false, err
}
return true, nil
func (t *Target) zypperInstall(packages ...string) (stdout string, stderr string, error error) {
// Runs a zypper install command wrapped with the right userdata and parameters
var cliArgs []string
cliArgs = append(cliArgs, "--userdata", "skuba")
cliArgs = append(cliArgs, "--non-interactive", "install", "--")
cliArgs = append(cliArgs, packages...)
return t.ssh("zypper", cliArgs...)
}
4 changes: 2 additions & 2 deletions pkg/skuba/actions/node/bootstrap/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@ func Bootstrap(bootstrapConfiguration deployments.BootstrapConfiguration, target
func coreBootstrap(initConfiguration *kubeadmapi.InitConfiguration, bootstrapConfiguration deployments.BootstrapConfiguration, target *deployments.Target) error {
versionToDeploy := version.MustParseSemantic(initConfiguration.KubernetesVersion)

if _, err := target.InstallNodePattern(deployments.KubernetesBaseOSConfiguration{
if err := target.Apply(deployments.KubernetesBaseOSConfiguration{
CurrentVersion: versionToDeploy.String(),
}); err != nil {
}, "kubernetes.install-fresh-pkgs"); err != nil {
return err
}

Expand Down
5 changes: 2 additions & 3 deletions pkg/skuba/actions/node/join/join.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,9 @@ func Join(client clientset.Interface, joinConfiguration deployments.JoinConfigur
return err
}

_, err = target.InstallNodePattern(deployments.KubernetesBaseOSConfiguration{
if err := target.Apply(deployments.KubernetesBaseOSConfiguration{
CurrentVersion: currentClusterVersion.String(),
})
if err != nil {
}, "kubernetes.install-fresh-pkgs"); err != nil {
return err
}

Expand Down
7 changes: 4 additions & 3 deletions pkg/skuba/actions/node/upgrade/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ func Apply(client clientset.Interface, target *deployments.Target) error {
err = target.Apply(deployments.KubernetesBaseOSConfiguration{
UpdatedVersion: nodeVersionInfoUpdate.Update.KubeletVersion.String(),
CurrentVersion: nodeVersionInfoUpdate.Current.KubeletVersion.String(),
}, "kubernetes.install-node-pattern")
}, "kubernetes.upgrade-kubadm-pkg")
if err != nil {
return err
}
Expand All @@ -164,8 +164,9 @@ func Apply(client clientset.Interface, target *deployments.Target) error {
return err
}
err = target.Apply(deployments.KubernetesBaseOSConfiguration{
CurrentVersion: nodeVersionInfoUpdate.Update.KubeletVersion.String(),
}, "kubernetes.install-node-pattern")
UpdatedVersion: nodeVersionInfoUpdate.Update.KubeletVersion.String(),
CurrentVersion: nodeVersionInfoUpdate.Current.KubeletVersion.String(),
}, "kubernetes.upgrade-other-kubernetes-pkgs")
if err != nil {
return err
}
Expand Down

0 comments on commit 1d7dd99

Please sign in to comment.