From dc482613849e01c009b5a3728d0a8e73f03a541f Mon Sep 17 00:00:00 2001 From: pixiake Date: Fri, 31 Jul 2020 16:47:49 +0800 Subject: [PATCH] add skip pre pull images Signed-off-by: pixiake --- Makefile | 24 +++++++++++++++++ cmd/cluster.go | 3 ++- cmd/root.go | 1 + cmd/scale.go | 3 ++- cmd/upgrade.go | 3 ++- pkg/cluster/kubernetes/master.go | 15 ++++++++--- pkg/cluster/preinstall/prepull_images.go | 10 +++++-- pkg/delete/delete.go | 2 +- pkg/install/install.go | 4 +-- pkg/scale/scale.go | 4 +-- pkg/upgrade/upgrade.go | 4 +-- pkg/util/executor/executor.go | 23 ++++++++++------- pkg/util/manager/manager.go | 33 ++++++++++++------------ 13 files changed, 88 insertions(+), 41 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..d4fb221c --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +.PHONY: build +build: build-linux-amd64 build-linux-arm64 + +build-linux-amd64: + docker run --rm \ + -v $(shell pwd):/usr/src/myapp \ + -e GOOS=linux \ + -e GOARCH=amd64 \ + -e CGO_ENABLED=0 \ + -e GO111MODULE=on \ + -w /usr/src/myapp golang:1.14 \ + go build -v -o output/linux/amd64/kk ./kubekey.go # linux + sha256sum output/linux/amd64/kk || shasum -a 256 output/linux/amd64/kk + +build-linux-arm64: + docker run --rm \ + -v $(shell pwd):/usr/src/myapp \ + -e GOOS=linux \ + -e GOARCH=arm64 \ + -e CGO_ENABLED=0 \ + -e GO111MODULE=on \ + -w /usr/src/myapp golang:1.14 \ + go build -v -o output/linux/arm64/kk ./kubekey.go # linux + sha256sum output/linux/arm64/kk || shasum -a 256 output/linux/arm64/kk diff --git a/cmd/cluster.go b/cmd/cluster.go index ef93bf72..ec66ed53 100644 --- a/cmd/cluster.go +++ b/cmd/cluster.go @@ -33,7 +33,7 @@ var clusterCmd = &cobra.Command{ ksVersion = "" } logger := util.InitLogger(opt.Verbose) - return install.CreateCluster(opt.ClusterCfgFile, opt.Kubernetes, ksVersion, logger, opt.Kubesphere, opt.Verbose, opt.SkipCheck) + return install.CreateCluster(opt.ClusterCfgFile, opt.Kubernetes, ksVersion, logger, opt.Kubesphere, opt.Verbose, opt.SkipCheck, opt.SkipPullImages) }, } @@ -44,4 +44,5 @@ func init() { clusterCmd.Flags().StringVarP(&opt.Kubernetes, "with-kubernetes", "", "", "Specify a supported version of kubernetes") clusterCmd.Flags().BoolVarP(&opt.Kubesphere, "with-kubesphere", "", false, "Deploy a specific version of kubesphere (default v3.0.0)") clusterCmd.Flags().BoolVarP(&opt.SkipCheck, "yes", "y", false, "Skip pre-check of the installation") + clusterCmd.Flags().BoolVarP(&opt.SkipPullImages, "skip-pull-images", "", false, "Skip pre pull images") } diff --git a/cmd/root.go b/cmd/root.go index 70a90439..c68b3266 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -32,6 +32,7 @@ type Options struct { Kubernetes string Kubesphere bool SkipCheck bool + SkipPullImages bool } var ( diff --git a/cmd/scale.go b/cmd/scale.go index 19a9de37..9bfa2134 100644 --- a/cmd/scale.go +++ b/cmd/scale.go @@ -27,7 +27,7 @@ var scaleCmd = &cobra.Command{ Short: "Scale a cluster according to the new nodes information from the specified configuration file", RunE: func(cmd *cobra.Command, args []string) error { logger := util.InitLogger(opt.Verbose) - return scale.ScaleCluster(opt.ClusterCfgFile, "", "", logger, false, opt.Verbose, opt.SkipCheck) + return scale.ScaleCluster(opt.ClusterCfgFile, "", "", logger, false, opt.Verbose, opt.SkipCheck, opt.SkipPullImages) }, } @@ -35,4 +35,5 @@ func init() { rootCmd.AddCommand(scaleCmd) scaleCmd.Flags().StringVarP(&opt.ClusterCfgFile, "file", "f", "", "Path to a configuration file") scaleCmd.Flags().BoolVarP(&opt.SkipCheck, "yes", "y", false, "Skip pre-check of the installation") + scaleCmd.Flags().BoolVarP(&opt.SkipPullImages, "skip-pull-images", "", false, "Skip pre pull images") } diff --git a/cmd/upgrade.go b/cmd/upgrade.go index 7bb529ef..b4e8e556 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -33,7 +33,7 @@ var upgradeCmd = &cobra.Command{ } else { ksVersion = "" } - return upgrade.UpgradeCluster(opt.ClusterCfgFile, opt.Kubernetes, ksVersion, logger, opt.Kubesphere, opt.Verbose) + return upgrade.UpgradeCluster(opt.ClusterCfgFile, opt.Kubernetes, ksVersion, logger, opt.Kubesphere, opt.Verbose, opt.SkipPullImages) }, } @@ -42,4 +42,5 @@ func init() { upgradeCmd.Flags().StringVarP(&opt.ClusterCfgFile, "file", "f", "", "Path to a configuration file") upgradeCmd.Flags().StringVarP(&opt.Kubernetes, "with-kubernetes", "", "", "Specify a supported version of kubernetes") upgradeCmd.Flags().BoolVarP(&opt.Kubesphere, "with-kubesphere", "", false, "Deploy a specific version of kubesphere (default v3.0.0)") + upgradeCmd.Flags().BoolVarP(&opt.SkipPullImages, "skip-pull-images", "", false, "Skip pre pull images") } diff --git a/pkg/cluster/kubernetes/master.go b/pkg/cluster/kubernetes/master.go index 3976f82f..27a47dca 100644 --- a/pkg/cluster/kubernetes/master.go +++ b/pkg/cluster/kubernetes/master.go @@ -107,10 +107,19 @@ func initKubernetesCluster(mgr *manager.Manager, node *kubekeyapi.HostCfg, _ ssh return errors.Wrap(errors.WithStack(err1), "Failed to generate kubeadm config") } - _, err2 := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"/usr/local/bin/kubeadm init --config=/etc/kubernetes/kubeadm-config.yaml\"", 3, true) - if err2 != nil { - return errors.Wrap(errors.WithStack(err2), "Failed to init kubernetes cluster") + for i := 0; i < 3; i++ { + _, err2 := mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"/usr/local/bin/kubeadm init --config=/etc/kubernetes/kubeadm-config.yaml\"", 0, true) + if err2 != nil { + if i == 2 { + return errors.Wrap(errors.WithStack(err2), "Failed to init kubernetes cluster") + } else { + _, _ = mgr.Runner.ExecuteCmd("sudo -E /bin/sh -c \"/usr/local/bin/kubeadm reset -f\"", 0, true) + } + } else { + break + } } + if err3 := GetKubeConfig(mgr); err3 != nil { return err3 } diff --git a/pkg/cluster/preinstall/prepull_images.go b/pkg/cluster/preinstall/prepull_images.go index 2a0d8972..32a6450a 100644 --- a/pkg/cluster/preinstall/prepull_images.go +++ b/pkg/cluster/preinstall/prepull_images.go @@ -10,9 +10,15 @@ import ( ) func PrePullImages(mgr *manager.Manager) error { - mgr.Logger.Infoln("Start to download images on all nodes") - return mgr.RunTaskOnAllNodes(PullImages, true) + if !mgr.SkipPullImages { + mgr.Logger.Infoln("Start to download images on all nodes") + if err := mgr.RunTaskOnAllNodes(PullImages, true); err != nil { + return err + } + } + + return nil } func PullImages(mgr *manager.Manager, node *kubekeyapi.HostCfg, _ ssh.Connection) error { diff --git a/pkg/delete/delete.go b/pkg/delete/delete.go index 64a5300c..4e4db71a 100644 --- a/pkg/delete/delete.go +++ b/pkg/delete/delete.go @@ -36,7 +36,7 @@ func ResetCluster(clusterCfgFile string, logger *log.Logger, verbose bool) error return errors.Wrap(err, "Failed to download cluster config") } - return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, false)) + return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, false, true)) } func Execute(executor *executor.Executor) error { diff --git a/pkg/install/install.go b/pkg/install/install.go index 07ffca22..d0470cbf 100644 --- a/pkg/install/install.go +++ b/pkg/install/install.go @@ -35,7 +35,7 @@ import ( "path/filepath" ) -func CreateCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose, skipCheck bool) error { +func CreateCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose, skipCheck, skipPullImages bool) error { currentDir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { return errors.Wrap(err, "Faild to get current dir") @@ -49,7 +49,7 @@ func CreateCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Log return errors.Wrap(err, "Failed to download cluster config") } - return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, skipCheck)) + return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, skipCheck, skipPullImages)) } func ExecTasks(mgr *manager.Manager) error { diff --git a/pkg/scale/scale.go b/pkg/scale/scale.go index 981f31be..6201ad27 100644 --- a/pkg/scale/scale.go +++ b/pkg/scale/scale.go @@ -32,7 +32,7 @@ import ( "path/filepath" ) -func ScaleCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose, skipCheck bool) error { +func ScaleCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose, skipCheck, skipPullImages bool) error { currentDir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { return errors.Wrap(err, "Faild to get current dir") @@ -46,7 +46,7 @@ func ScaleCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logg return errors.Wrap(err, "Failed to download cluster config") } - return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, skipCheck)) + return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, skipCheck, skipPullImages)) } func ExecTasks(mgr *manager.Manager) error { diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index c990da7a..fab83912 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -30,7 +30,7 @@ import ( "path/filepath" ) -func UpgradeCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose bool) error { +func UpgradeCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Logger, ksEnabled, verbose, skipPullImages bool) error { currentDir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { return errors.Wrap(err, "Faild to get current dir") @@ -44,7 +44,7 @@ func UpgradeCluster(clusterCfgFile, k8sVersion, ksVersion string, logger *log.Lo return errors.Wrap(err, "Failed to download cluster config") } - return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, true)) + return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, true, skipPullImages)) } func ExecTasks(mgr *manager.Manager) error { diff --git a/pkg/util/executor/executor.go b/pkg/util/executor/executor.go index 692800d3..13df6f98 100644 --- a/pkg/util/executor/executor.go +++ b/pkg/util/executor/executor.go @@ -28,18 +28,20 @@ import ( ) type Executor struct { - Cluster *kubekeyapi.ClusterSpec - Logger *log.Logger - Debug bool - SkipCheck bool + Cluster *kubekeyapi.ClusterSpec + Logger *log.Logger + Debug bool + SkipCheck bool + SkipPullImages bool } -func NewExecutor(cluster *kubekeyapi.ClusterSpec, logger *log.Logger, debug,skipCheck bool) *Executor { +func NewExecutor(cluster *kubekeyapi.ClusterSpec, logger *log.Logger, debug, skipCheck, skipPullImages bool) *Executor { return &Executor{ - Cluster: cluster, - Logger: logger, - Debug: debug, - SkipCheck: skipCheck, + Cluster: cluster, + Logger: logger, + Debug: debug, + SkipCheck: skipCheck, + SkipPullImages: skipPullImages, } } @@ -60,7 +62,8 @@ func (executor *Executor) CreateManager() (*manager.Manager, error) { mgr.KsVersion = executor.Cluster.KubeSphere.Version mgr.Logger = executor.Logger mgr.Debug = executor.Debug - mgr.SkipCheck = executor.SkipCheck + mgr.SkipCheck = executor.SkipCheck + mgr.SkipPullImages = executor.SkipPullImages return mgr, nil } diff --git a/pkg/util/manager/manager.go b/pkg/util/manager/manager.go index 6f05872b..01309b9a 100644 --- a/pkg/util/manager/manager.go +++ b/pkg/util/manager/manager.go @@ -24,22 +24,23 @@ import ( ) type Manager struct { - Cluster *kubekeyapi.ClusterSpec - Logger log.FieldLogger - Connector *ssh.Dialer - Runner *runner.Runner - AllNodes []kubekeyapi.HostCfg - EtcdNodes []kubekeyapi.HostCfg - MasterNodes []kubekeyapi.HostCfg - WorkerNodes []kubekeyapi.HostCfg - K8sNodes []kubekeyapi.HostCfg - ClientNode []kubekeyapi.HostCfg - ClusterHosts []string - WorkDir string - KsEnable bool - KsVersion string - Debug bool - SkipCheck bool + Cluster *kubekeyapi.ClusterSpec + Logger log.FieldLogger + Connector *ssh.Dialer + Runner *runner.Runner + AllNodes []kubekeyapi.HostCfg + EtcdNodes []kubekeyapi.HostCfg + MasterNodes []kubekeyapi.HostCfg + WorkerNodes []kubekeyapi.HostCfg + K8sNodes []kubekeyapi.HostCfg + ClientNode []kubekeyapi.HostCfg + ClusterHosts []string + WorkDir string + KsEnable bool + KsVersion string + Debug bool + SkipCheck bool + SkipPullImages bool } func (mgr *Manager) Copy() *Manager {