-
Notifications
You must be signed in to change notification settings - Fork 242
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement core scripts and logic for running upgrades (#211)
- Loading branch information
1 parent
fc17bba
commit 500b87e
Showing
7 changed files
with
389 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package upgrade | ||
|
||
import ( | ||
"github.com/pkg/errors" | ||
|
||
"github.com/kubermatic/kubeone/pkg/config" | ||
"github.com/kubermatic/kubeone/pkg/installer/util" | ||
) | ||
|
||
const ( | ||
upgradeKubeadmDebianCommand = ` | ||
source /etc/os-release | ||
source /etc/kubeone/proxy-env | ||
sudo apt-get update | ||
kube_ver=$(apt-cache madison kubelet | grep "{{ .KUBERNETES_VERSION }}" | head -1 | awk '{print $3}') | ||
sudo apt-mark unhold kubeadm | ||
sudo apt-get install kubeadm=${kube_ver} | ||
sudo apt-mark hold kubeadm | ||
` | ||
upgradeKubeadmCentOSCommand = ` | ||
source /etc/kubeone/proxy-env | ||
sudo yum install -y --disableexcludes=kubernetes \ | ||
kubeadm-{{ .KUBERNETES_VERSION }}-0 | ||
` | ||
upgradeKubeadmCoreOSCommand = ` | ||
source /etc/kubeone/proxy-env | ||
RELEASE="v{{ .KUBERNETES_VERSION }}" | ||
sudo mkdir -p /opt/bin | ||
cd /opt/bin | ||
sudo curl -L --remote-name-all \ | ||
https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/kubeadm | ||
sudo chmod +x kubeadm | ||
` | ||
) | ||
|
||
func upgradeKubeadm(ctx *util.Context, node *config.HostConfig) error { | ||
var err error | ||
|
||
switch node.OperatingSystem { | ||
case "ubuntu", "debian": | ||
err = upgradeKubeadmDebian(ctx) | ||
|
||
case "coreos": | ||
err = upgradeKubeadmCoreOS(ctx) | ||
|
||
case "centos": | ||
err = upgradeKubeadmCentOS(ctx) | ||
|
||
default: | ||
err = errors.Errorf("'%s' is not a supported operating system", node.OperatingSystem) | ||
} | ||
|
||
return err | ||
} | ||
|
||
func upgradeKubeadmDebian(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeadmDebianCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} | ||
|
||
func upgradeKubeadmCentOS(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeadmCentOSCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} | ||
|
||
func upgradeKubeadmCoreOS(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeadmCoreOSCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package upgrade | ||
|
||
import ( | ||
"github.com/kubermatic/kubeone/pkg/installer/util" | ||
) | ||
|
||
const ( | ||
kubeadmUpgradeLeaderCommand = ` | ||
if [[ -f /etc/kubernetes/kubelet.conf ]]; then exit 0; fi | ||
sudo kubeadm upgrade {{ .VERSION }} | ||
` | ||
kubeadmUpgradeFollowerCommand = ` | ||
if [[ -f /etc/kubernetes/kubelet.conf ]]; then exit 0; fi | ||
sudo kubeadm upgrade node experimental-control-plane | ||
` | ||
) | ||
|
||
func upgradeLeaderControlPlane(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(kubeadmUpgradeLeaderCommand, util.TemplateVariables{ | ||
"VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
return err | ||
} | ||
|
||
func upgradeFollowerControlPlane(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(kubeadmUpgradeFollowerCommand, util.TemplateVariables{}) | ||
return err | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package upgrade | ||
|
||
import ( | ||
"github.com/pkg/errors" | ||
|
||
"github.com/kubermatic/kubeone/pkg/config" | ||
"github.com/kubermatic/kubeone/pkg/installer/util" | ||
) | ||
|
||
const ( | ||
upgradeKubeletDebianCommand = ` | ||
source /etc/os-release | ||
source /etc/kubeone/proxy-env | ||
sudo apt-get update | ||
kube_ver=$(apt-cache madison kubelet | grep "{{ .KUBERNETES_VERSION }}" | head -1 | awk '{print $3}') | ||
sudo apt-mark unhold kubelet | ||
sudo apt-get install kubelet=${kube_ver} | ||
sudo apt-mark hold kubelet | ||
` | ||
upgradeKubeletCentOSCommand = ` | ||
source /etc/kubeone/proxy-env | ||
sudo yum install -y --disableexcludes=kubernetes \ | ||
kubelet-{{ .KUBERNETES_VERSION }}-0 | ||
` | ||
upgradeKubeletCoreOSCommand = ` | ||
source /etc/kubeone/proxy-env | ||
RELEASE="v{{ .KUBERNETES_VERSION }}" | ||
sudo mkdir -p /opt/bin | ||
cd /opt/bin | ||
sudo curl -L --remote-name-all \ | ||
https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/kubelet | ||
sudo chmod +x kubelet | ||
` | ||
) | ||
|
||
func upgradeKubelet(ctx *util.Context, node *config.HostConfig) error { | ||
var err error | ||
|
||
switch node.OperatingSystem { | ||
case "ubuntu", "debian": | ||
err = upgradeKubeletDebian(ctx) | ||
|
||
case "coreos": | ||
err = upgradeKubeletCoreOS(ctx) | ||
|
||
case "centos": | ||
err = upgradeKubeletCentOS(ctx) | ||
|
||
default: | ||
err = errors.Errorf("'%s' is not a supported operating system", node.OperatingSystem) | ||
} | ||
|
||
return err | ||
} | ||
|
||
func upgradeKubeletDebian(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeletDebianCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} | ||
|
||
func upgradeKubeletCentOS(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeletCentOSCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} | ||
|
||
func upgradeKubeletCoreOS(ctx *util.Context) error { | ||
_, _, err := ctx.Runner.Run(upgradeKubeletCoreOSCommand, util.TemplateVariables{ | ||
"KUBERNETES_VERSION": ctx.Cluster.Versions.Kubernetes, | ||
}) | ||
|
||
return errors.WithStack(err) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package upgrade | ||
|
||
import ( | ||
"github.com/pkg/errors" | ||
|
||
"github.com/kubermatic/kubeone/pkg/config" | ||
"github.com/kubermatic/kubeone/pkg/installer/util" | ||
"github.com/kubermatic/kubeone/pkg/ssh" | ||
) | ||
|
||
func upgradeFollower(ctx *util.Context) error { | ||
return ctx.RunTaskOnFollowers(upgradeFollowerExecutor, false) | ||
} | ||
|
||
func upgradeFollowerExecutor(ctx *util.Context, node *config.HostConfig, conn ssh.Connection) error { | ||
ctx.Logger.Infoln("Labeling follower control plane…") | ||
err := labelNode(ctx.Clientset.CoreV1().Nodes(), node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to label leader control plane node") | ||
} | ||
|
||
ctx.Logger.Infoln("Upgrading kubeadm on follower control plane…") | ||
err = upgradeKubeadm(ctx, node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to upgrade kubeadm on follower control plane") | ||
} | ||
|
||
ctx.Logger.Infoln("Running 'kubeadm upgrade' on the follower control plane node…") | ||
err = upgradeFollowerControlPlane(ctx) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to upgrade follower control plane") | ||
} | ||
|
||
ctx.Logger.Infoln("Upgrading kubelet…") | ||
err = upgradeKubelet(ctx, node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to upgrade kubelet") | ||
} | ||
|
||
ctx.Logger.Infoln("Unlabeling follower control plane…") | ||
err = unlabelNode(ctx.Clientset.CoreV1().Nodes(), node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to unlabel follower control plane node") | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package upgrade | ||
|
||
import ( | ||
"github.com/pkg/errors" | ||
|
||
"github.com/kubermatic/kubeone/pkg/config" | ||
"github.com/kubermatic/kubeone/pkg/installer/util" | ||
"github.com/kubermatic/kubeone/pkg/ssh" | ||
) | ||
|
||
func upgradeLeader(ctx *util.Context) error { | ||
return ctx.RunTaskOnLeader(upgradeLeaderExecutor) | ||
} | ||
|
||
func upgradeLeaderExecutor(ctx *util.Context, node *config.HostConfig, conn ssh.Connection) error { | ||
logger := ctx.Logger.WithField("node", node.PublicAddress) | ||
|
||
logger.Infoln("Labeling leader control plane…") | ||
err := labelNode(ctx.Clientset.CoreV1().Nodes(), node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to label leader control plane node") | ||
} | ||
|
||
logger.Infoln("Upgrading kubeadm on leader control plane…") | ||
err = upgradeKubeadm(ctx, node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to upgrade kubeadm on leader control plane") | ||
} | ||
|
||
logger.Infoln("Running 'kubeadm upgrade' on leader control plane node…") | ||
err = upgradeLeaderControlPlane(ctx) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to run 'kubeadm upgrade' on leader control plane") | ||
} | ||
|
||
logger.Infoln("Upgrading kubelet on leader control plane…") | ||
err = upgradeKubelet(ctx, node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to upgrade kubelet on leader control plane") | ||
} | ||
|
||
logger.Infoln("Unlabeling leader control plane…") | ||
err = unlabelNode(ctx.Clientset.CoreV1().Nodes(), node) | ||
if err != nil { | ||
return errors.Wrap(err, "failed to unlabel leader control plane node") | ||
} | ||
|
||
return nil | ||
} |
Oops, something went wrong.