Skip to content

Commit

Permalink
add docker version checking
Browse files Browse the repository at this point in the history
Signed-off-by: pixiake <guofeng@yunify.com>
  • Loading branch information
pixiake committed Apr 28, 2021
1 parent 95c1b1f commit 70671f7
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 13 deletions.
45 changes: 32 additions & 13 deletions pkg/cluster/upgrade/precheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"fmt"
kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1"
"github.com/kubesphere/kubekey/pkg/kubernetes/preinstall"
"github.com/kubesphere/kubekey/pkg/util"
"github.com/kubesphere/kubekey/pkg/util/manager"
"github.com/mitchellh/mapstructure"
"github.com/modood/table"
Expand Down Expand Up @@ -90,6 +91,37 @@ func GetClusterInfo(mgr *manager.Manager) error {
}
table.OutputA(results)
fmt.Println()

warningFlag := false
cmp, err := versionutil.MustParseSemantic(mgr.Cluster.Kubernetes.Version).Compare("v1.19.0")
if err != nil {
mgr.Logger.Fatal("Failed to compare kubernetes version: %v", err)
}
if cmp == 0 || cmp == 1 {
for _, result := range results {
dockerVersion, err := util.RefineDockerVersion(result.Docker)
if err != nil {
mgr.Logger.Fatal("Failed to get docker version: %v", err)
}
cmp, err := versionutil.MustParseSemantic(dockerVersion).Compare("20.10.0")
if err != nil {
mgr.Logger.Fatal("Failed to compare docker version: %v", err)
}
warningFlag = warningFlag || (cmp == -1)
}

if warningFlag {
fmt.Println(`
Warning:
An old Docker version may cause the failure of upgrade. It is recommended that you upgrade Docker to 20.10+ beforehand.
Issue: https://github.com/kubernetes/kubernetes/issues/101056
`)
}
}

return mgr.RunTaskOnMasterNodes(getClusterInfo, true)
}

Expand Down Expand Up @@ -145,9 +177,6 @@ func getClusterInfo(mgr *manager.Manager, _ *kubekeyapiv1alpha1.HostCfg) error {
if err := getNodestatus(mgr); err != nil {
return err
}
if err := getComponentStatus(mgr); err != nil {
return err
}

fmt.Println("Upgrade Confirmation:")
fmt.Printf("kubernetes version: %s to %s\n", k8sVersionStr, mgr.Cluster.Kubernetes.Version)
Expand Down Expand Up @@ -180,16 +209,6 @@ func getClusterInfo(mgr *manager.Manager, _ *kubekeyapiv1alpha1.HostCfg) error {
return nil
}

func getComponentStatus(mgr *manager.Manager) error {
componentStatusStr, err := mgr.Runner.ExecuteCmd("sudo -E /bin/bash -c \"/usr/local/bin/kubectl get componentstatus -o go-template='{{range .items}}{{ printf \\\"%s: \\\" .metadata.name}}{{range .conditions}}{{ printf \\\"%v\\n\\\" .message }}{{end}}{{end}}'\"", 1, false)
if err != nil {
return err
}
fmt.Println("Components Status:")
fmt.Println(componentStatusStr + "\n")
return nil
}

func getNodestatus(mgr *manager.Manager) error {
nodestatus, err := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"/usr/local/bin/kubectl get node\"", 2, false)
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions pkg/kubernetes/preinstall/precheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ func PrecheckNodes(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) error
results[software] = ""
} else {
results[software] = "y"
if software == "docker" {
dockerVersion, err := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"docker version --format '{{.Server.Version}}'\"", 0, false)
if err == nil {
results[software] = dockerVersion
}
}
}
}
output, err := mgr.Runner.ExecuteCmd("date +\"%Z %H:%M:%S\"", 0, false)
Expand Down
17 changes: 17 additions & 0 deletions pkg/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"os"
"os/exec"
"os/user"
"regexp"
"runtime"
"sort"
"strconv"
Expand Down Expand Up @@ -288,3 +289,19 @@ func GetArgs(argsMap map[string]string, args []string) ([]string, map[string]str
sort.Strings(args)
return args, argsMap
}

func RefineDockerVersion(version string) (string, error) {
var newVersionComponents []string
versionMatchRE := regexp.MustCompile(`^\s*v?([0-9]+(?:\.[0-9]+)*)(.*)*$`)
parts := versionMatchRE.FindStringSubmatch(version)
if parts == nil {
return "", fmt.Errorf("could not parse %q as version", version)
}
numbers, _ := parts[1], parts[2]
components := strings.Split(numbers, ".")

for _, comp := range components {
newVersionComponents = append(newVersionComponents, strings.TrimPrefix(comp, "0"))
}
return strings.Join(newVersionComponents, "."), nil
}

0 comments on commit 70671f7

Please sign in to comment.