mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 04:33:26 +00:00
Adding etcd version for kubeadm upgrade plan
This commit is contained in:
parent
db4134d03f
commit
a9ea1b881b
@ -56,8 +56,10 @@ func RunPlan(parentFlags *cmdUpgradeFlags) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Define Local Etcd cluster to be able to retrieve information
|
||||||
|
etcdCluster := kubeadmutil.LocalEtcdCluster{}
|
||||||
// Compute which upgrade possibilities there are
|
// Compute which upgrade possibilities there are
|
||||||
availUpgrades, err := upgrade.GetAvailableUpgrades(upgradeVars.versionGetter, parentFlags.allowExperimentalUpgrades, parentFlags.allowRCUpgrades)
|
availUpgrades, err := upgrade.GetAvailableUpgrades(upgradeVars.versionGetter, parentFlags.allowExperimentalUpgrades, parentFlags.allowRCUpgrades, etcdCluster)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("[upgrade/versions] FATAL: %v", err)
|
return fmt.Errorf("[upgrade/versions] FATAL: %v", err)
|
||||||
}
|
}
|
||||||
@ -112,6 +114,7 @@ func printAvailableUpgrades(upgrades []upgrade.Upgrade, w io.Writer) {
|
|||||||
fmt.Fprintf(tabw, "Scheduler\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion)
|
fmt.Fprintf(tabw, "Scheduler\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion)
|
||||||
fmt.Fprintf(tabw, "Kube Proxy\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion)
|
fmt.Fprintf(tabw, "Kube Proxy\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion)
|
||||||
fmt.Fprintf(tabw, "Kube DNS\t%s\t%s\n", upgrade.Before.DNSVersion, upgrade.After.DNSVersion)
|
fmt.Fprintf(tabw, "Kube DNS\t%s\t%s\n", upgrade.Before.DNSVersion, upgrade.After.DNSVersion)
|
||||||
|
fmt.Fprintf(tabw, "Etcd\t%s\t%s\n", upgrade.Before.EtcdVersion, upgrade.After.EtcdVersion)
|
||||||
|
|
||||||
// The tabwriter should be flushed at this stage as we have now put in all the required content for this time. This is required for the tabs' size to be correct.
|
// The tabwriter should be flushed at this stage as we have now put in all the required content for this time. This is required for the tabs' size to be correct.
|
||||||
tabw.Flush()
|
tabw.Flush()
|
||||||
|
@ -73,40 +73,43 @@ func TestPrintAvailableUpgrades(t *testing.T) {
|
|||||||
{
|
{
|
||||||
upgrades: []upgrade.Upgrade{
|
upgrades: []upgrade.Upgrade{
|
||||||
{
|
{
|
||||||
Description: "version in the v1.7 series",
|
Description: "version in the v1.8 series",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.1",
|
KubeVersion: "v1.8.1",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.1": 1,
|
"v1.8.1": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.2",
|
KubeadmVersion: "v1.8.2",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeadmVersion: "v1.7.3",
|
KubeadmVersion: "v1.8.3",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.1 v1.7.3
|
Kubelet 1 x v1.8.1 v1.8.3
|
||||||
|
|
||||||
Upgrade to the latest version in the v1.7 series:
|
Upgrade to the latest version in the v1.8 series:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.1 v1.7.3
|
API Server v1.8.1 v1.8.3
|
||||||
Controller Manager v1.7.1 v1.7.3
|
Controller Manager v1.8.1 v1.8.3
|
||||||
Scheduler v1.7.1 v1.7.3
|
Scheduler v1.8.1 v1.8.3
|
||||||
Kube Proxy v1.7.1 v1.7.3
|
Kube Proxy v1.8.1 v1.8.3
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.5
|
||||||
|
Etcd 3.0.17 3.0.17
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.7.3
|
kubeadm upgrade apply v1.8.3
|
||||||
|
|
||||||
Note: Before you can perform this upgrade, you have to update kubeadm to v1.7.3.
|
Note: Before you can perform this upgrade, you have to update kubeadm to v1.8.3.
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
@ -117,36 +120,39 @@ _____________________________________________________________________
|
|||||||
{
|
{
|
||||||
Description: "stable version",
|
Description: "stable version",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.3": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.0",
|
KubeadmVersion: "v1.9.0",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.8.0",
|
KubeVersion: "v1.9.0",
|
||||||
KubeadmVersion: "v1.8.0",
|
KubeadmVersion: "v1.9.0",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.3 v1.8.0
|
Kubelet 1 x v1.8.3 v1.9.0
|
||||||
|
|
||||||
Upgrade to the latest stable version:
|
Upgrade to the latest stable version:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.3 v1.8.0
|
API Server v1.8.3 v1.9.0
|
||||||
Controller Manager v1.7.3 v1.8.0
|
Controller Manager v1.8.3 v1.9.0
|
||||||
Scheduler v1.7.3 v1.8.0
|
Scheduler v1.8.3 v1.9.0
|
||||||
Kube Proxy v1.7.3 v1.8.0
|
Kube Proxy v1.8.3 v1.9.0
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.7
|
||||||
|
Etcd 3.0.17 3.1.10
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.8.0
|
kubeadm upgrade apply v1.9.0
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
@ -155,75 +161,81 @@ _____________________________________________________________________
|
|||||||
{
|
{
|
||||||
upgrades: []upgrade.Upgrade{
|
upgrades: []upgrade.Upgrade{
|
||||||
{
|
{
|
||||||
Description: "version in the v1.7 series",
|
Description: "version in the v1.8 series",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.3": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.1",
|
KubeadmVersion: "v1.8.3",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeadmVersion: "v1.8.1",
|
KubeadmVersion: "v1.8.3",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Description: "stable version",
|
Description: "stable version",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.3": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.1",
|
KubeadmVersion: "v1.8.3",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.8.2",
|
KubeVersion: "v1.9.0",
|
||||||
KubeadmVersion: "v1.8.2",
|
KubeadmVersion: "v1.9.0",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.3 v1.7.5
|
Kubelet 1 x v1.8.3 v1.8.5
|
||||||
|
|
||||||
Upgrade to the latest version in the v1.7 series:
|
Upgrade to the latest version in the v1.8 series:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.3 v1.7.5
|
API Server v1.8.3 v1.8.5
|
||||||
Controller Manager v1.7.3 v1.7.5
|
Controller Manager v1.8.3 v1.8.5
|
||||||
Scheduler v1.7.3 v1.7.5
|
Scheduler v1.8.3 v1.8.5
|
||||||
Kube Proxy v1.7.3 v1.7.5
|
Kube Proxy v1.8.3 v1.8.5
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.5
|
||||||
|
Etcd 3.0.17 3.0.17
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.7.5
|
kubeadm upgrade apply v1.8.5
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.3 v1.8.2
|
Kubelet 1 x v1.8.3 v1.9.0
|
||||||
|
|
||||||
Upgrade to the latest stable version:
|
Upgrade to the latest stable version:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.3 v1.8.2
|
API Server v1.8.3 v1.9.0
|
||||||
Controller Manager v1.7.3 v1.8.2
|
Controller Manager v1.8.3 v1.9.0
|
||||||
Scheduler v1.7.3 v1.8.2
|
Scheduler v1.8.3 v1.9.0
|
||||||
Kube Proxy v1.7.3 v1.8.2
|
Kube Proxy v1.8.3 v1.9.0
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.7
|
||||||
|
Etcd 3.0.17 3.1.10
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.8.2
|
kubeadm upgrade apply v1.9.0
|
||||||
|
|
||||||
Note: Before you can perform this upgrade, you have to update kubeadm to v1.8.2.
|
Note: Before you can perform this upgrade, you have to update kubeadm to v1.9.0.
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
@ -234,38 +246,41 @@ _____________________________________________________________________
|
|||||||
{
|
{
|
||||||
Description: "experimental version",
|
Description: "experimental version",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.8.0-beta.1",
|
KubeVersion: "v1.9.0-beta.1",
|
||||||
KubeadmVersion: "v1.8.0-beta.1",
|
KubeadmVersion: "v1.9.0-beta.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.5 v1.8.0-beta.1
|
Kubelet 1 x v1.8.5 v1.9.0-beta.1
|
||||||
|
|
||||||
Upgrade to the latest experimental version:
|
Upgrade to the latest experimental version:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.5 v1.8.0-beta.1
|
API Server v1.8.5 v1.9.0-beta.1
|
||||||
Controller Manager v1.7.5 v1.8.0-beta.1
|
Controller Manager v1.8.5 v1.9.0-beta.1
|
||||||
Scheduler v1.7.5 v1.8.0-beta.1
|
Scheduler v1.8.5 v1.9.0-beta.1
|
||||||
Kube Proxy v1.7.5 v1.8.0-beta.1
|
Kube Proxy v1.8.5 v1.9.0-beta.1
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.7
|
||||||
|
Etcd 3.0.17 3.1.10
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.8.0-beta.1
|
kubeadm upgrade apply v1.9.0-beta.1
|
||||||
|
|
||||||
Note: Before you can perform this upgrade, you have to update kubeadm to v1.8.0-beta.1.
|
Note: Before you can perform this upgrade, you have to update kubeadm to v1.9.0-beta.1.
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
@ -276,38 +291,41 @@ _____________________________________________________________________
|
|||||||
{
|
{
|
||||||
Description: "release candidate version",
|
Description: "release candidate version",
|
||||||
Before: upgrade.ClusterState{
|
Before: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
After: upgrade.ClusterState{
|
After: upgrade.ClusterState{
|
||||||
KubeVersion: "v1.8.0-rc.1",
|
KubeVersion: "v1.9.0-rc.1",
|
||||||
KubeadmVersion: "v1.8.0-rc.1",
|
KubeadmVersion: "v1.9.0-rc.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
expectedBytes: []byte(`Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
Kubelet 1 x v1.7.5 v1.8.0-rc.1
|
Kubelet 1 x v1.8.5 v1.9.0-rc.1
|
||||||
|
|
||||||
Upgrade to the latest release candidate version:
|
Upgrade to the latest release candidate version:
|
||||||
|
|
||||||
COMPONENT CURRENT AVAILABLE
|
COMPONENT CURRENT AVAILABLE
|
||||||
API Server v1.7.5 v1.8.0-rc.1
|
API Server v1.8.5 v1.9.0-rc.1
|
||||||
Controller Manager v1.7.5 v1.8.0-rc.1
|
Controller Manager v1.8.5 v1.9.0-rc.1
|
||||||
Scheduler v1.7.5 v1.8.0-rc.1
|
Scheduler v1.8.5 v1.9.0-rc.1
|
||||||
Kube Proxy v1.7.5 v1.8.0-rc.1
|
Kube Proxy v1.8.5 v1.9.0-rc.1
|
||||||
Kube DNS 1.14.5 1.14.5
|
Kube DNS 1.14.5 1.14.7
|
||||||
|
Etcd 3.0.17 3.1.10
|
||||||
|
|
||||||
You can now apply the upgrade by executing the following command:
|
You can now apply the upgrade by executing the following command:
|
||||||
|
|
||||||
kubeadm upgrade apply v1.8.0-rc.1
|
kubeadm upgrade apply v1.9.0-rc.1
|
||||||
|
|
||||||
Note: Before you can perform this upgrade, you have to update kubeadm to v1.8.0-rc.1.
|
Note: Before you can perform this upgrade, you have to update kubeadm to v1.9.0-rc.1.
|
||||||
|
|
||||||
_____________________________________________________________________
|
_____________________________________________________________________
|
||||||
|
|
||||||
|
@ -226,8 +226,9 @@ var (
|
|||||||
|
|
||||||
// SupportedEtcdVersion lists officially supported etcd versions with corresponding kubernetes releases
|
// SupportedEtcdVersion lists officially supported etcd versions with corresponding kubernetes releases
|
||||||
SupportedEtcdVersion = map[uint8]string{
|
SupportedEtcdVersion = map[uint8]string{
|
||||||
8: "3.0.17",
|
8: "3.0.17",
|
||||||
9: "3.1.10",
|
9: "3.1.10",
|
||||||
|
10: "3.1.11",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -137,8 +137,8 @@ func TestEtcdSupportedVersion(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
kubernetesVersion: "1.10.0",
|
kubernetesVersion: "1.10.0",
|
||||||
expectedVersion: nil,
|
expectedVersion: version.MustParseSemantic("3.1.11"),
|
||||||
expectedError: fmt.Errorf("Unsupported or unknown kubernetes version"),
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
kubernetesVersion: "1.8.6",
|
kubernetesVersion: "1.8.6",
|
||||||
|
@ -78,6 +78,7 @@ go_test(
|
|||||||
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
"//cmd/kubeadm/app/util/apiclient:go_default_library",
|
||||||
"//pkg/api/legacyscheme:go_default_library",
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/util/version:go_default_library",
|
"//pkg/util/version:go_default_library",
|
||||||
|
"//vendor/github.com/coreos/etcd/clientv3:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
|
|
||||||
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
|
"k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
|
||||||
|
"k8s.io/kubernetes/cmd/kubeadm/app/util"
|
||||||
"k8s.io/kubernetes/pkg/util/version"
|
"k8s.io/kubernetes/pkg/util/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -58,11 +59,13 @@ type ClusterState struct {
|
|||||||
KubeadmVersion string
|
KubeadmVersion string
|
||||||
// KubeletVersions is a map with a version number linked to the amount of kubelets running that version in the cluster
|
// KubeletVersions is a map with a version number linked to the amount of kubelets running that version in the cluster
|
||||||
KubeletVersions map[string]uint16
|
KubeletVersions map[string]uint16
|
||||||
|
// EtcdVersion represents the version of etcd used in the cluster
|
||||||
|
EtcdVersion string
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAvailableUpgrades fetches all versions from the specified VersionGetter and computes which
|
// GetAvailableUpgrades fetches all versions from the specified VersionGetter and computes which
|
||||||
// kinds of upgrades can be performed
|
// kinds of upgrades can be performed
|
||||||
func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesAllowed, rcUpgradesAllowed bool) ([]Upgrade, error) {
|
func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesAllowed, rcUpgradesAllowed bool, cluster util.EtcdCluster) ([]Upgrade, error) {
|
||||||
fmt.Println("[upgrade] Fetching available versions to upgrade to")
|
fmt.Println("[upgrade] Fetching available versions to upgrade to")
|
||||||
|
|
||||||
// Collect the upgrades kubeadm can do in this list
|
// Collect the upgrades kubeadm can do in this list
|
||||||
@ -94,6 +97,12 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get current etcd version
|
||||||
|
etcdStatus, err := cluster.GetEtcdClusterStatus()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// Construct a descriptor for the current state of the world
|
// Construct a descriptor for the current state of the world
|
||||||
// TODO: Make CoreDNS available here.
|
// TODO: Make CoreDNS available here.
|
||||||
beforeState := ClusterState{
|
beforeState := ClusterState{
|
||||||
@ -101,6 +110,7 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
DNSVersion: dns.GetDNSVersion(clusterVersion, kubeadmconstants.KubeDNS),
|
DNSVersion: dns.GetDNSVersion(clusterVersion, kubeadmconstants.KubeDNS),
|
||||||
KubeadmVersion: kubeadmVersionStr,
|
KubeadmVersion: kubeadmVersionStr,
|
||||||
KubeletVersions: kubeletVersions,
|
KubeletVersions: kubeletVersions,
|
||||||
|
EtcdVersion: etcdStatus.Version,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do a "dumb guess" that a new minor upgrade is available just because the latest stable version is higher than the cluster version
|
// Do a "dumb guess" that a new minor upgrade is available just because the latest stable version is higher than the cluster version
|
||||||
@ -111,7 +121,6 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
// in the case that a user is trying to upgrade from, let's say, v1.8.0-beta.2 to v1.8.0-rc.1 (given we support such upgrades experimentally)
|
// in the case that a user is trying to upgrade from, let's say, v1.8.0-beta.2 to v1.8.0-rc.1 (given we support such upgrades experimentally)
|
||||||
// a stable-1.8 branch doesn't exist yet. Hence this check.
|
// a stable-1.8 branch doesn't exist yet. Hence this check.
|
||||||
if patchVersionBranchExists(clusterVersion, stableVersion) {
|
if patchVersionBranchExists(clusterVersion, stableVersion) {
|
||||||
|
|
||||||
currentBranch := getBranchFromVersion(clusterVersionStr)
|
currentBranch := getBranchFromVersion(clusterVersionStr)
|
||||||
versionLabel := fmt.Sprintf("stable-%s", currentBranch)
|
versionLabel := fmt.Sprintf("stable-%s", currentBranch)
|
||||||
description := fmt.Sprintf("version in the v%s series", currentBranch)
|
description := fmt.Sprintf("version in the v%s series", currentBranch)
|
||||||
@ -143,6 +152,7 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
KubeVersion: patchVersionStr,
|
KubeVersion: patchVersionStr,
|
||||||
DNSVersion: dns.GetDNSVersion(patchVersion, kubeadmconstants.KubeDNS),
|
DNSVersion: dns.GetDNSVersion(patchVersion, kubeadmconstants.KubeDNS),
|
||||||
KubeadmVersion: newKubeadmVer,
|
KubeadmVersion: newKubeadmVer,
|
||||||
|
EtcdVersion: getSuggestedEtcdVersion(patchVersionStr),
|
||||||
// KubeletVersions is unset here as it is not used anywhere in .After
|
// KubeletVersions is unset here as it is not used anywhere in .After
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -158,6 +168,7 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
KubeVersion: stableVersionStr,
|
KubeVersion: stableVersionStr,
|
||||||
DNSVersion: dns.GetDNSVersion(stableVersion, kubeadmconstants.KubeDNS),
|
DNSVersion: dns.GetDNSVersion(stableVersion, kubeadmconstants.KubeDNS),
|
||||||
KubeadmVersion: stableVersionStr,
|
KubeadmVersion: stableVersionStr,
|
||||||
|
EtcdVersion: getSuggestedEtcdVersion(stableVersionStr),
|
||||||
// KubeletVersions is unset here as it is not used anywhere in .After
|
// KubeletVersions is unset here as it is not used anywhere in .After
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -202,6 +213,7 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
KubeVersion: previousBranchLatestVersionStr,
|
KubeVersion: previousBranchLatestVersionStr,
|
||||||
DNSVersion: dns.GetDNSVersion(previousBranchLatestVersion, kubeadmconstants.KubeDNS),
|
DNSVersion: dns.GetDNSVersion(previousBranchLatestVersion, kubeadmconstants.KubeDNS),
|
||||||
KubeadmVersion: previousBranchLatestVersionStr,
|
KubeadmVersion: previousBranchLatestVersionStr,
|
||||||
|
EtcdVersion: getSuggestedEtcdVersion(previousBranchLatestVersionStr),
|
||||||
// KubeletVersions is unset here as it is not used anywhere in .After
|
// KubeletVersions is unset here as it is not used anywhere in .After
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -227,6 +239,7 @@ func GetAvailableUpgrades(versionGetterImpl VersionGetter, experimentalUpgradesA
|
|||||||
KubeVersion: unstableKubeVersion,
|
KubeVersion: unstableKubeVersion,
|
||||||
DNSVersion: unstableKubeDNSVersion,
|
DNSVersion: unstableKubeDNSVersion,
|
||||||
KubeadmVersion: unstableKubeVersion,
|
KubeadmVersion: unstableKubeVersion,
|
||||||
|
EtcdVersion: getSuggestedEtcdVersion(unstableKubeVersion),
|
||||||
// KubeletVersions is unset here as it is not used anywhere in .After
|
// KubeletVersions is unset here as it is not used anywhere in .After
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -258,3 +271,12 @@ func rcUpgradePossible(clusterVersion, previousBranchLatestVersion *version.Vers
|
|||||||
func minorUpgradePossibleWithPatchRelease(stableVersion, patchVersion *version.Version) bool {
|
func minorUpgradePossibleWithPatchRelease(stableVersion, patchVersion *version.Version) bool {
|
||||||
return patchVersion.LessThan(stableVersion)
|
return patchVersion.LessThan(stableVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSuggestedEtcdVersion(kubernetesVersion string) string {
|
||||||
|
etcdVersion, err := kubeadmconstants.EtcdSupportedVersion(kubernetesVersion)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("[upgrade/versions] WARNING: No recommended etcd for requested kubernetes version (%s)\n", kubernetesVersion)
|
||||||
|
return "N/A"
|
||||||
|
}
|
||||||
|
return etcdVersion.String()
|
||||||
|
}
|
||||||
|
@ -17,10 +17,10 @@ limitations under the License.
|
|||||||
package upgrade
|
package upgrade
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/coreos/etcd/clientv3"
|
||||||
|
versionutil "k8s.io/kubernetes/pkg/util/version"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
versionutil "k8s.io/kubernetes/pkg/util/version"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type fakeVersionGetter struct {
|
type fakeVersionGetter struct {
|
||||||
@ -47,7 +47,7 @@ func (f *fakeVersionGetter) VersionFromCILabel(ciVersionLabel, _ string) (string
|
|||||||
if ciVersionLabel == "latest" {
|
if ciVersionLabel == "latest" {
|
||||||
return f.latestVersion, versionutil.MustParseSemantic(f.latestVersion), nil
|
return f.latestVersion, versionutil.MustParseSemantic(f.latestVersion), nil
|
||||||
}
|
}
|
||||||
if ciVersionLabel == "latest-1.8" {
|
if ciVersionLabel == "latest-1.9" {
|
||||||
return f.latestDevBranchVersion, versionutil.MustParseSemantic(f.latestDevBranchVersion), nil
|
return f.latestDevBranchVersion, versionutil.MustParseSemantic(f.latestDevBranchVersion), nil
|
||||||
}
|
}
|
||||||
return f.stablePatchVersion, versionutil.MustParseSemantic(f.stablePatchVersion), nil
|
return f.stablePatchVersion, versionutil.MustParseSemantic(f.stablePatchVersion), nil
|
||||||
@ -60,6 +60,14 @@ func (f *fakeVersionGetter) KubeletVersions() (map[string]uint16, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type fakeEtcdCluster struct{}
|
||||||
|
|
||||||
|
func (f fakeEtcdCluster) GetEtcdClusterStatus() (*clientv3.StatusResponse, error) {
|
||||||
|
client := &clientv3.StatusResponse{}
|
||||||
|
client.Version = "3.0.14"
|
||||||
|
return client, nil
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetAvailableUpgrades(t *testing.T) {
|
func TestGetAvailableUpgrades(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
vg *fakeVersionGetter
|
vg *fakeVersionGetter
|
||||||
@ -69,12 +77,12 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{ // no action needed, already up-to-date
|
{ // no action needed, already up-to-date
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.3",
|
clusterVersion: "v1.8.3",
|
||||||
kubeletVersion: "v1.7.3",
|
kubeletVersion: "v1.8.3",
|
||||||
kubeadmVersion: "v1.7.3",
|
kubeadmVersion: "v1.8.3",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.3",
|
stablePatchVersion: "v1.8.3",
|
||||||
stableVersion: "v1.7.3",
|
stableVersion: "v1.8.3",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{},
|
expectedUpgrades: []Upgrade{},
|
||||||
allowExperimental: false,
|
allowExperimental: false,
|
||||||
@ -82,28 +90,30 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // simple patch version upgrade
|
{ // simple patch version upgrade
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.1",
|
clusterVersion: "v1.8.1",
|
||||||
kubeletVersion: "v1.7.1", // the kubelet are on the same version as the control plane
|
kubeletVersion: "v1.8.1", // the kubelet are on the same version as the control plane
|
||||||
kubeadmVersion: "v1.7.2",
|
kubeadmVersion: "v1.8.2",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.3",
|
stablePatchVersion: "v1.8.3",
|
||||||
stableVersion: "v1.7.3",
|
stableVersion: "v1.8.3",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "version in the v1.7 series",
|
Description: "version in the v1.8 series",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.1",
|
KubeVersion: "v1.8.1",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.1": 1,
|
"v1.8.1": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.2",
|
KubeadmVersion: "v1.8.2",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeadmVersion: "v1.7.3",
|
KubeadmVersion: "v1.8.3",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -112,28 +122,30 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // minor version upgrade only
|
{ // minor version upgrade only
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.3",
|
clusterVersion: "v1.8.1",
|
||||||
kubeletVersion: "v1.7.3", // the kubelet are on the same version as the control plane
|
kubeletVersion: "v1.8.1", // the kubelet are on the same version as the control plane
|
||||||
kubeadmVersion: "v1.8.0",
|
kubeadmVersion: "v1.9.0",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.3",
|
stablePatchVersion: "v1.8.1",
|
||||||
stableVersion: "v1.8.0",
|
stableVersion: "v1.9.0",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "stable version",
|
Description: "stable version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.1",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.1": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.0",
|
KubeadmVersion: "v1.9.0",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0",
|
KubeVersion: "v1.9.0",
|
||||||
KubeadmVersion: "v1.8.0",
|
KubeadmVersion: "v1.9.0",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -142,44 +154,48 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // both minor version upgrade and patch version upgrade available
|
{ // both minor version upgrade and patch version upgrade available
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.3",
|
clusterVersion: "v1.8.3",
|
||||||
kubeletVersion: "v1.7.3", // the kubelet are on the same version as the control plane
|
kubeletVersion: "v1.8.3", // the kubelet are on the same version as the control plane
|
||||||
kubeadmVersion: "v1.8.1",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.8.2",
|
stableVersion: "v1.9.1",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "version in the v1.7 series",
|
Description: "version in the v1.8 series",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.3": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.1",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeadmVersion: "v1.8.1", // Note: The kubeadm version mustn't be "downgraded" here
|
KubeadmVersion: "v1.8.5", // Note: The kubeadm version mustn't be "downgraded" here
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.17",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Description: "stable version",
|
Description: "stable version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.3",
|
KubeVersion: "v1.8.3",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.3": 1,
|
"v1.8.3": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.8.1",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.2",
|
KubeVersion: "v1.9.1",
|
||||||
KubeadmVersion: "v1.8.2",
|
KubeadmVersion: "v1.9.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -188,13 +204,13 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // allow experimental upgrades, but no upgrade available
|
{ // allow experimental upgrades, but no upgrade available
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.8.0-alpha.2",
|
clusterVersion: "v1.9.0-alpha.2",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestVersion: "v1.8.0-alpha.2",
|
latestVersion: "v1.9.0-alpha.2",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{},
|
expectedUpgrades: []Upgrade{},
|
||||||
allowExperimental: true,
|
allowExperimental: true,
|
||||||
@ -202,29 +218,31 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // upgrade to an unstable version should be supported
|
{ // upgrade to an unstable version should be supported
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.5",
|
clusterVersion: "v1.8.5",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestVersion: "v1.8.0-alpha.2",
|
latestVersion: "v1.9.0-alpha.2",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "experimental version",
|
Description: "experimental version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-alpha.2",
|
KubeVersion: "v1.9.0-alpha.2",
|
||||||
KubeadmVersion: "v1.8.0-alpha.2",
|
KubeadmVersion: "v1.9.0-alpha.2",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -233,29 +251,31 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // upgrade from an unstable version to an unstable version should be supported
|
{ // upgrade from an unstable version to an unstable version should be supported
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.8.0-alpha.1",
|
clusterVersion: "v1.9.0-alpha.1",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestVersion: "v1.8.0-alpha.2",
|
latestVersion: "v1.9.0-alpha.2",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "experimental version",
|
Description: "experimental version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.8.0-alpha.1",
|
KubeVersion: "v1.9.0-alpha.1",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-alpha.2",
|
KubeVersion: "v1.9.0-alpha.2",
|
||||||
KubeadmVersion: "v1.8.0-alpha.2",
|
KubeadmVersion: "v1.9.0-alpha.2",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -264,30 +284,32 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // v1.X.0-alpha.0 should be ignored
|
{ // v1.X.0-alpha.0 should be ignored
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.5",
|
clusterVersion: "v1.8.5",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestDevBranchVersion: "v1.8.0-beta.1",
|
latestDevBranchVersion: "v1.9.0-beta.1",
|
||||||
latestVersion: "v1.9.0-alpha.0",
|
latestVersion: "v1.10.0-alpha.0",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "experimental version",
|
Description: "experimental version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-beta.1",
|
KubeVersion: "v1.9.0-beta.1",
|
||||||
KubeadmVersion: "v1.8.0-beta.1",
|
KubeadmVersion: "v1.9.0-beta.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -296,30 +318,32 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // upgrade to an RC version should be supported
|
{ // upgrade to an RC version should be supported
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.5",
|
clusterVersion: "v1.8.5",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestDevBranchVersion: "v1.8.0-rc.1",
|
latestDevBranchVersion: "v1.9.0-rc.1",
|
||||||
latestVersion: "v1.9.0-alpha.1",
|
latestVersion: "v1.10.0-alpha.1",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "release candidate version",
|
Description: "release candidate version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-rc.1",
|
KubeVersion: "v1.9.0-rc.1",
|
||||||
KubeadmVersion: "v1.8.0-rc.1",
|
KubeadmVersion: "v1.9.0-rc.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -328,30 +352,32 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // it is possible (but very uncommon) that the latest version from the previous branch is an rc and the current latest version is alpha.0. In that case, show the RC
|
{ // it is possible (but very uncommon) that the latest version from the previous branch is an rc and the current latest version is alpha.0. In that case, show the RC
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.5",
|
clusterVersion: "v1.8.5",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestDevBranchVersion: "v1.8.0-rc.1",
|
latestDevBranchVersion: "v1.9.6-rc.1",
|
||||||
latestVersion: "v1.9.0-alpha.0",
|
latestVersion: "v1.10.1-alpha.0",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "experimental version", // Note that this is considered an experimental version in this uncommon scenario
|
Description: "experimental version", // Note that this is considered an experimental version in this uncommon scenario
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-rc.1",
|
KubeVersion: "v1.9.6-rc.1",
|
||||||
KubeadmVersion: "v1.8.0-rc.1",
|
KubeadmVersion: "v1.9.6-rc.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -360,46 +386,50 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{ // upgrade to an RC version should be supported. There may also be an even newer unstable version.
|
{ // upgrade to an RC version should be supported. There may also be an even newer unstable version.
|
||||||
vg: &fakeVersionGetter{
|
vg: &fakeVersionGetter{
|
||||||
clusterVersion: "v1.7.5",
|
clusterVersion: "v1.8.5",
|
||||||
kubeletVersion: "v1.7.5",
|
kubeletVersion: "v1.8.5",
|
||||||
kubeadmVersion: "v1.7.5",
|
kubeadmVersion: "v1.8.5",
|
||||||
|
|
||||||
stablePatchVersion: "v1.7.5",
|
stablePatchVersion: "v1.8.5",
|
||||||
stableVersion: "v1.7.5",
|
stableVersion: "v1.8.5",
|
||||||
latestDevBranchVersion: "v1.8.0-rc.1",
|
latestDevBranchVersion: "v1.9.0-rc.1",
|
||||||
latestVersion: "v1.9.0-alpha.1",
|
latestVersion: "v1.10.0-alpha.2",
|
||||||
},
|
},
|
||||||
expectedUpgrades: []Upgrade{
|
expectedUpgrades: []Upgrade{
|
||||||
{
|
{
|
||||||
Description: "release candidate version",
|
Description: "release candidate version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.8.0-rc.1",
|
KubeVersion: "v1.9.0-rc.1",
|
||||||
KubeadmVersion: "v1.8.0-rc.1",
|
KubeadmVersion: "v1.9.0-rc.1",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Description: "experimental version",
|
Description: "experimental version",
|
||||||
Before: ClusterState{
|
Before: ClusterState{
|
||||||
KubeVersion: "v1.7.5",
|
KubeVersion: "v1.8.5",
|
||||||
KubeletVersions: map[string]uint16{
|
KubeletVersions: map[string]uint16{
|
||||||
"v1.7.5": 1,
|
"v1.8.5": 1,
|
||||||
},
|
},
|
||||||
KubeadmVersion: "v1.7.5",
|
KubeadmVersion: "v1.8.5",
|
||||||
DNSVersion: "1.14.5",
|
DNSVersion: "1.14.5",
|
||||||
|
EtcdVersion: "3.0.14",
|
||||||
},
|
},
|
||||||
After: ClusterState{
|
After: ClusterState{
|
||||||
KubeVersion: "v1.9.0-alpha.1",
|
KubeVersion: "v1.10.0-alpha.2",
|
||||||
KubeadmVersion: "v1.9.0-alpha.1",
|
KubeadmVersion: "v1.10.0-alpha.2",
|
||||||
DNSVersion: "1.14.7",
|
DNSVersion: "1.14.7",
|
||||||
|
EtcdVersion: "3.1.11",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -409,9 +439,12 @@ func TestGetAvailableUpgrades(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instantiating a fake etcd cluster for being able to get etcd version for a corresponding
|
||||||
|
// kubernetes release.
|
||||||
|
testCluster := fakeEtcdCluster{}
|
||||||
for _, rt := range tests {
|
for _, rt := range tests {
|
||||||
|
|
||||||
actualUpgrades, actualErr := GetAvailableUpgrades(rt.vg, rt.allowExperimental, rt.allowRCs)
|
actualUpgrades, actualErr := GetAvailableUpgrades(rt.vg, rt.allowExperimental, rt.allowRCs, testCluster)
|
||||||
if !reflect.DeepEqual(actualUpgrades, rt.expectedUpgrades) {
|
if !reflect.DeepEqual(actualUpgrades, rt.expectedUpgrades) {
|
||||||
t.Errorf("failed TestGetAvailableUpgrades\n\texpected upgrades: %v\n\tgot: %v", rt.expectedUpgrades, actualUpgrades)
|
t.Errorf("failed TestGetAvailableUpgrades\n\texpected upgrades: %v\n\tgot: %v", rt.expectedUpgrades, actualUpgrades)
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,8 @@ func performEtcdStaticPodUpgrade(waiter apiclient.Waiter, pathMgr StaticPodPathM
|
|||||||
return false, fmt.Errorf("external etcd cannot be upgraded with kubeadm")
|
return false, fmt.Errorf("external etcd cannot be upgraded with kubeadm")
|
||||||
}
|
}
|
||||||
// Checking health state of etcd before proceeding with the upgrtade
|
// Checking health state of etcd before proceeding with the upgrtade
|
||||||
etcdStatus, err := util.GetEtcdClusterStatus()
|
etcdCluster := util.LocalEtcdCluster{}
|
||||||
|
etcdStatus, err := etcdCluster.GetEtcdClusterStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, fmt.Errorf("etcd cluster is not healthy: %v", err)
|
return true, fmt.Errorf("etcd cluster is not healthy: %v", err)
|
||||||
}
|
}
|
||||||
@ -222,7 +223,7 @@ func performEtcdStaticPodUpgrade(waiter apiclient.Waiter, pathMgr StaticPodPathM
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Checking health state of etcd after the upgrade
|
// Checking health state of etcd after the upgrade
|
||||||
etcdStatus, err = util.GetEtcdClusterStatus()
|
etcdStatus, err = etcdCluster.GetEtcdClusterStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, rollbackEtcdData(cfg, fmt.Errorf("etcd cluster is not healthy after upgrade: %v rolling back", err), pathMgr)
|
return true, rollbackEtcdData(cfg, fmt.Errorf("etcd cluster is not healthy after upgrade: %v rolling back", err), pathMgr)
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,16 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// EtcdCluster is an interface to get etcd cluster related information
|
||||||
|
type EtcdCluster interface {
|
||||||
|
GetEtcdClusterStatus() (*clientv3.StatusResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LocalEtcdCluster represents an instance of a local etcd cluster
|
||||||
|
type LocalEtcdCluster struct{}
|
||||||
|
|
||||||
// GetEtcdClusterStatus returns nil for status Up or error for status Down
|
// GetEtcdClusterStatus returns nil for status Up or error for status Down
|
||||||
func GetEtcdClusterStatus() (*clientv3.StatusResponse, error) {
|
func (cluster LocalEtcdCluster) GetEtcdClusterStatus() (*clientv3.StatusResponse, error) {
|
||||||
ep := []string{"localhost:2379"}
|
ep := []string{"localhost:2379"}
|
||||||
cli, err := clientv3.New(clientv3.Config{
|
cli, err := clientv3.New(clientv3.Config{
|
||||||
Endpoints: ep,
|
Endpoints: ep,
|
||||||
|
Loading…
Reference in New Issue
Block a user