This repository has been archived by the owner on Apr 18, 2024. It is now read-only.
/
upgrade.go
100 lines (85 loc) · 3.21 KB
/
upgrade.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package provision
import (
"fmt"
"time"
"github.com/flanksource/karina/pkg/phases/kubeadm"
"github.com/flanksource/karina/pkg/platform"
"github.com/flanksource/kommons"
"gopkg.in/yaml.v2"
)
const ClusterConfiguration = "ClusterConfiguration"
const upgradePrepCommand =
// install the correct version kubeadm
"apt-get install -y --allow-change-held-packages kubeadm=%s-00 ;" +
// prevent it from being automatically updated
" apt-mark hold kubeadm &&" +
// download the most recent kubeadm configuration
" (kubectl --kubeconfig /etc/kubernetes/admin.conf get cm kubeadm-config -o json -n kube-system | jq -r '.data.ClusterConfiguration' > /etc/kubernetes/kubeadm.conf)"
// perform the upgrade
const upgradeCluster = "kubeadm upgrade apply -y --allow-experimental-upgrades --allow-release-candidate-upgrades --config /etc/kubernetes/kubeadm.conf %s"
const upgradeNode = "apt-get install -y --allow-change-held-packages kubeadm=%s-00;" +
" apt-mark hold kubeadm &&" +
" kubeadm upgrade node"
// Upgrade the kubernetes control plane to the declared version
func Upgrade(platform *platform.Platform) error {
cluster, err := GetCluster(platform)
if err != nil {
return err
}
newConfig := kubeadm.NewClusterConfig(platform)
newData, err := yaml.Marshal(newConfig)
if err != nil {
return err
}
kubeadmConfig := (*platform.GetConfigMap("kube-system", "kubeadm-config"))
kubeadmConfig[ClusterConfiguration] = string(newData)
// update kubeadm-config with any changes introduced since last provision/update
if err := platform.CreateOrUpdateConfigMap("kubeadm-config", "kube-system", kubeadmConfig); err != nil {
return err
}
version, err := kubeadm.GetClusterVersion(platform)
if err != nil {
return err
}
if platform.Kubernetes.Version == version {
platform.Infof("At least 1 master has been upgraded to : %s\n", platform.Kubernetes.Version)
} else {
platform.Infof("Starting upgrade from %s to %s", version, platform.Kubernetes.Version)
}
var toUpgrade = []string{}
var upgraded = []string{}
for _, nodeMachine := range cluster.Nodes {
node := nodeMachine.Node
if !kommons.IsMasterNode(node) {
continue
}
nodeVersion := kubeadm.GetNodeVersion(platform, node)
if nodeVersion != platform.Kubernetes.Version {
toUpgrade = append(toUpgrade, node.Name)
} else {
upgraded = append(upgraded, node.Name)
}
}
platform.Infof("Nodes needing upgrade: %s", toUpgrade)
platform.Infof("Nodes already upgraded: %s", upgraded)
if len(upgraded) == 0 {
out, err := platform.Executef(toUpgrade[0], 5*time.Minute, upgradePrepCommand, platform.Kubernetes.Version[1:])
if err != nil {
return fmt.Errorf("failed to prep for upgrade: %s, %s", err, out)
}
out, err = platform.Executef(toUpgrade[0], 5*time.Minute, upgradeCluster, platform.Kubernetes.Version)
if err != nil {
return fmt.Errorf("failed to upgrade: %s, %s", err, out)
}
platform.Infof("Completed upgrade via %s: %s", toUpgrade[0], out)
toUpgrade = toUpgrade[1:]
}
for _, node := range toUpgrade {
out, err := platform.Executef(node, 5*time.Minute, upgradeNode, platform.Kubernetes.Version[1:])
if err != nil {
return fmt.Errorf("failed to upgrade: %s, %s", err, out)
}
platform.Infof("Upgraded node via %s: %s", node, out)
}
return nil
}