diff --git a/cmd/create/cluster.go b/cmd/create/cluster.go index b916fb08..57030235 100644 --- a/cmd/create/cluster.go +++ b/cmd/create/cluster.go @@ -1,7 +1,7 @@ package create import ( - "github.com/pixiake/kubekey/install" + "github.com/pixiake/kubekey/pkg/install" "github.com/pixiake/kubekey/pkg/util" "github.com/spf13/cobra" ) diff --git a/cmd/create/config.go b/cmd/create/config.go index f81179c7..e132cc01 100644 --- a/cmd/create/config.go +++ b/cmd/create/config.go @@ -36,9 +36,10 @@ spec: domain: lb.kubesphere.local address: "" port: "6443" - kubeVersion: v1.17.4 - kubeImageRepo: kubekey - kubeClusterName: cluster.local + kubeCluster: + version: v1.17.4 + imageRepo: kubekey + clusterName: cluster.local network: plugin: calico kube_pods_cidr: 10.233.64.0/18 diff --git a/cmd/reset.go b/cmd/reset.go index ff40002a..e1587f16 100644 --- a/cmd/reset.go +++ b/cmd/reset.go @@ -7,8 +7,6 @@ import ( "github.com/spf13/cobra" ) -var etcdFiles = []string{"/usr/local/bin/etcd", "/etc/ssl/etcd/ssl", "/var/lib/etcd", "/etc/etcd.env", "/etc/systemd/system/etcd.service"} - func NewCmdResetCluster() *cobra.Command { var ( clusterCfgFile string @@ -22,7 +20,7 @@ func NewCmdResetCluster() *cobra.Command { }, } - clusterCmd.Flags().StringVarP(&clusterCfgFile, "cluster-info", "", "", "") + clusterCmd.Flags().StringVarP(&clusterCfgFile, "config", "f", "", "") return clusterCmd } diff --git a/cmd/scale.go b/cmd/scale.go index d796e27f..99eb3fd7 100644 --- a/cmd/scale.go +++ b/cmd/scale.go @@ -1,8 +1,8 @@ package cmd import ( + "github.com/pixiake/kubekey/pkg/scale" "github.com/pixiake/kubekey/pkg/util" - "github.com/pixiake/kubekey/scale" "github.com/spf13/cobra" ) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go deleted file mode 100644 index 916b1b53..00000000 --- a/pkg/cluster/cluster.go +++ /dev/null @@ -1 +0,0 @@ -package cluster diff --git a/pkg/cluster/preinstall/tmpl/InitOS.go b/pkg/cluster/preinstall/tmpl/InitOS.go index 243c876b..e4a21ed6 100644 --- a/pkg/cluster/preinstall/tmpl/InitOS.go +++ b/pkg/cluster/preinstall/tmpl/InitOS.go @@ -26,7 +26,6 @@ sed -r -i "s@#{0,}?net.bridge.bridge-nf-call-iptables ?= ?(0|1)@net.bridge.brid sed -r -i "s@#{0,}?net.ipv4.ip_local_reserved_ports ?= ?(0|1)@net.ipv4.ip_local_reserved_ports = 30000-32767@g" /etc/sysctl.conf awk ' !x[$0]++{print > "/etc/sysctl.conf"}' /etc/sysctl.conf -sysctl -p systemctl stop firewald 1>/dev/null 2>/dev/null systemctl disable firewald 1>/dev/null 2>/dev/null @@ -59,6 +58,7 @@ else modprobe nf_conntrack echo 'nf_conntrack' > /etc/modules-load.d/kube_proxy-ipvs.conf fi +sysctl -p sed -i ':a;$!{N;ba};s@# kubekey hosts BEGIN.*# kubekey hosts END@@' /etc/hosts sed -i '/^$/N;/\n$/N;//D' /etc/hosts diff --git a/pkg/config/config.go b/pkg/config/config.go index 711e74d1..5457161b 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -49,6 +49,7 @@ func SetDefaultK2ClusterSpec(cfg *kubekeyapi.K2ClusterSpec) kubekeyapi.K2Cluster clusterCfg.Hosts = SetDefaultHostsCfg(cfg) clusterCfg.LBKubeApiserver = SetDefaultLBCfg(cfg) clusterCfg.Network = SetDefaultNetworkCfg(cfg) + clusterCfg.KubeCluster = SetDefaultClusterCfg(cfg) clusterCfg.Registry = cfg.Registry if cfg.KubeCluster.ImageRepo == "" { clusterCfg.KubeCluster.ImageRepo = kubekeyapi.DefaultKubeImageRepo @@ -161,3 +162,19 @@ func SetDefaultNetworkCfg(cfg *kubekeyapi.K2ClusterSpec) kubekeyapi.NetworkConfi return defaultNetworkCfg } + +func SetDefaultClusterCfg(cfg *kubekeyapi.K2ClusterSpec) kubekeyapi.KubeCluster { + if cfg.KubeCluster.Version == "" { + cfg.KubeCluster.Version = kubekeyapi.DefaultKubeVersion + } + if cfg.KubeCluster.ImageRepo == "" { + cfg.KubeCluster.ImageRepo = kubekeyapi.DefaultKubeImageRepo + } + if cfg.KubeCluster.ClusterName == "" { + cfg.KubeCluster.ClusterName = kubekeyapi.DefaultClusterName + } + + defaultClusterCfg := cfg.KubeCluster + + return defaultClusterCfg +} diff --git a/pkg/container-engine/docker/docker.go b/pkg/container-engine/docker/docker.go index fa5ba953..5ed3b56c 100644 --- a/pkg/container-engine/docker/docker.go +++ b/pkg/container-engine/docker/docker.go @@ -70,7 +70,7 @@ func installDockerOnNode(mgr *manager.Manager, node *kubekeyapi.HostCfg, conn ss return err } dockerConfigBase64 := base64.StdEncoding.EncodeToString([]byte(dockerConfig)) - _, err1 := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d > /etc/docker/daemon.json && systemctl daemon-reload\"", dockerConfigBase64)) + _, err1 := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d > /etc/docker/daemon.json && systemctl reload docker\"", dockerConfigBase64)) if err1 != nil { return errors.Wrap(errors.WithStack(err1), "failed to add docker config") } diff --git a/install/executor.go b/pkg/install/executor.go similarity index 100% rename from install/executor.go rename to pkg/install/executor.go diff --git a/install/install.go b/pkg/install/install.go similarity index 57% rename from install/install.go rename to pkg/install/install.go index fe810607..b37f8764 100644 --- a/install/install.go +++ b/pkg/install/install.go @@ -30,17 +30,17 @@ func CreateCluster(clusterCfgFile string, logger *log.Logger, addons string, pkg func ExecTasks(mgr *manager.Manager) error { createTasks := []manager.Task{ - {Fn: preinstall.InitOS, ErrMsg: "failed to download kube binaries"}, - {Fn: docker.InstallerDocker, ErrMsg: "failed to install docker"}, - {Fn: kubernetes.SyncKubeBinaries, ErrMsg: "failed to sync kube binaries"}, - {Fn: etcd.GenerateEtcdCerts, ErrMsg: "failed to generate etcd certs"}, - {Fn: etcd.SyncEtcdCertsToMaster, ErrMsg: "failed to sync etcd certs"}, - {Fn: etcd.GenerateEtcdService, ErrMsg: "failed to start etcd cluster"}, - {Fn: kubernetes.ConfigureKubeletService, ErrMsg: "failed to sync kube binaries"}, - {Fn: kubernetes.InitKubernetesCluster, ErrMsg: "failed to init kubernetes cluster"}, - {Fn: network.DeployNetworkPlugin, ErrMsg: "failed to deploy network plugin"}, - {Fn: kubernetes.GetJoinNodesCmd, ErrMsg: "failed to get join cmd"}, - {Fn: kubernetes.JoinNodesToCluster, ErrMsg: "failed to join node"}, + {Task: preinstall.InitOS, ErrMsg: "failed to download kube binaries"}, + {Task: docker.InstallerDocker, ErrMsg: "failed to install docker"}, + {Task: kubernetes.SyncKubeBinaries, ErrMsg: "failed to sync kube binaries"}, + {Task: etcd.GenerateEtcdCerts, ErrMsg: "failed to generate etcd certs"}, + {Task: etcd.SyncEtcdCertsToMaster, ErrMsg: "failed to sync etcd certs"}, + {Task: etcd.GenerateEtcdService, ErrMsg: "failed to start etcd cluster"}, + {Task: kubernetes.ConfigureKubeletService, ErrMsg: "failed to sync kube binaries"}, + {Task: kubernetes.InitKubernetesCluster, ErrMsg: "failed to init kubernetes cluster"}, + {Task: network.DeployNetworkPlugin, ErrMsg: "failed to deploy network plugin"}, + {Task: kubernetes.GetJoinNodesCmd, ErrMsg: "failed to get join cmd"}, + {Task: kubernetes.JoinNodesToCluster, ErrMsg: "failed to join node"}, } for _, step := range createTasks { diff --git a/pkg/reset/executor.go b/pkg/reset/executor.go new file mode 100644 index 00000000..f896b298 --- /dev/null +++ b/pkg/reset/executor.go @@ -0,0 +1,45 @@ +package reset + +import ( + kubekeyapi "github.com/pixiake/kubekey/pkg/apis/kubekey/v1alpha1" + "github.com/pixiake/kubekey/pkg/util/manager" + "github.com/pixiake/kubekey/pkg/util/ssh" + log "github.com/sirupsen/logrus" +) + +type Executor struct { + cluster *kubekeyapi.K2ClusterSpec + logger *log.Logger +} + +func NewExecutor(cluster *kubekeyapi.K2ClusterSpec, logger *log.Logger) *Executor { + return &Executor{ + cluster: cluster, + logger: logger, + } +} + +func (executor *Executor) Execute() error { + mgr, err := executor.createManager() + if err != nil { + return err + } + return ExecTasks(mgr) +} + +func (executor *Executor) createManager() (*manager.Manager, error) { + mgr := &manager.Manager{} + allNodes, etcdNodes, masterNodes, workerNodes, k8sNodes, clientNode := executor.cluster.GroupHosts() + mgr.AllNodes = allNodes + mgr.EtcdNodes = etcdNodes + mgr.MasterNodes = masterNodes + mgr.WorkerNodes = workerNodes + mgr.K8sNodes = k8sNodes + mgr.ClientNode = clientNode + mgr.Cluster = executor.cluster + mgr.Connector = ssh.NewConnector() + mgr.Logger = executor.logger + mgr.Verbose = true + + return mgr, nil +} diff --git a/pkg/reset/reset.go b/pkg/reset/reset.go new file mode 100644 index 00000000..47dc1e3e --- /dev/null +++ b/pkg/reset/reset.go @@ -0,0 +1,78 @@ +package reset + +import ( + "encoding/json" + "fmt" + kubekeyapi "github.com/pixiake/kubekey/pkg/apis/kubekey/v1alpha1" + "github.com/pixiake/kubekey/pkg/cluster/preinstall" + "github.com/pixiake/kubekey/pkg/config" + "github.com/pixiake/kubekey/pkg/util/manager" + "github.com/pixiake/kubekey/pkg/util/ssh" + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" +) + +func CreateCluster(clusterCfgFile string, logger *log.Logger, addons string, pkg string) error { + cfg, err := config.ParseClusterCfg(clusterCfgFile, logger) + if err != nil { + return errors.Wrap(err, "failed to download cluster config") + } + + out, _ := json.MarshalIndent(cfg, "", " ") + fmt.Println(string(out)) + if err := preinstall.Prepare(&cfg.Spec, logger); err != nil { + return errors.Wrap(err, "failed to load kube binarys") + } + return NewExecutor(&cfg.Spec, logger).Execute() +} + +func ExecTasks(mgr *manager.Manager) error { + resetTasks := []manager.Task{ + {Task: ResetKubeCluster, ErrMsg: "failed to reset kube cluster"}, + {Task: ResetEtcdCluster, ErrMsg: "failed to clean etcd files"}, + } + + for _, step := range resetTasks { + if err := step.Run(mgr); err != nil { + return errors.Wrap(err, step.ErrMsg) + } + } + return nil +} + +func ResetKubeCluster(mgr *manager.Manager) error { + mgr.Logger.Infoln("Reset cluster") + + return mgr.RunTaskOnK8sNodes(resetKubeCluster, true) +} + +func resetKubeCluster(mgr *manager.Manager, node *kubekeyapi.HostCfg, conn ssh.Connection) error { + _, err := mgr.Runner.RunCmd("sudo -E /bin/sh -c \"/user/local/bin/kubeadm reset -f\"") + if err != nil { + return errors.Wrap(errors.WithStack(err), "failed to reset kube cluster") + } + return nil +} + +var etcdFiles = []string{"/usr/local/bin/etcd", "/etc/ssl/etcd/ssl", "/var/lib/etcd", "/etc/etcd.env", "/etc/systemd/system/etcd.service"} + +func ResetEtcdCluster(mgr *manager.Manager) error { + mgr.Logger.Infoln("Reset cluster") + + return mgr.RunTaskOnEtcdNodes(resetKubeCluster, false) +} + +func resetEtcdCluster(mgr *manager.Manager, node *kubekeyapi.HostCfg, conn ssh.Connection) error { + _, err := mgr.Runner.RunCmd("sudo -E /bin/sh -c \"systemctl stop etcd\"") + if err != nil { + return errors.Wrap(errors.WithStack(err), "failed to reset etcd cluster") + } + + for _, file := range etcdFiles { + _, err := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E /bin/sh -c \"rm -rf %s\"", file)) + if err != nil { + return errors.Wrap(errors.WithStack(err), fmt.Sprintf("failed to clean etcd files: %s", file)) + } + } + return nil +} diff --git a/scale/executor.go b/pkg/scale/executor.go similarity index 100% rename from scale/executor.go rename to pkg/scale/executor.go diff --git a/scale/scale.go b/pkg/scale/scale.go similarity index 69% rename from scale/scale.go rename to pkg/scale/scale.go index 4880de13..cd347e76 100644 --- a/scale/scale.go +++ b/pkg/scale/scale.go @@ -28,12 +28,12 @@ func ScaleCluster(clusterCfgFile string, logger *log.Logger, pkg string) error { func ExecTasks(mgr *manager.Manager) error { scaleTasks := []manager.Task{ - {Fn: preinstall.InitOS, ErrMsg: "failed to download kube binaries"}, - {Fn: docker.InstallerDocker, ErrMsg: "failed to install docker"}, - {Fn: kubernetes.SyncKubeBinaries, ErrMsg: "failed to sync kube binaries"}, - {Fn: kubernetes.ConfigureKubeletService, ErrMsg: "failed to sync kube binaries"}, - {Fn: kubernetes.GetJoinNodesCmd, ErrMsg: "failed to get join cmd"}, - {Fn: kubernetes.JoinNodesToCluster, ErrMsg: "failed to join node"}, + {Task: preinstall.InitOS, ErrMsg: "failed to download kube binaries"}, + {Task: docker.InstallerDocker, ErrMsg: "failed to install docker"}, + {Task: kubernetes.SyncKubeBinaries, ErrMsg: "failed to sync kube binaries"}, + {Task: kubernetes.ConfigureKubeletService, ErrMsg: "failed to sync kube binaries"}, + {Task: kubernetes.GetJoinNodesCmd, ErrMsg: "failed to get join cmd"}, + {Task: kubernetes.JoinNodesToCluster, ErrMsg: "failed to join node"}, } for _, task := range scaleTasks { diff --git a/pkg/util/manager/task-control.go b/pkg/util/manager/task-control.go index b8c274c0..dad37f05 100644 --- a/pkg/util/manager/task-control.go +++ b/pkg/util/manager/task-control.go @@ -16,7 +16,7 @@ func defaultRetryBackoff(retries int) wait.Backoff { // Task is a runnable task type Task struct { - Fn func(*Manager) error + Task func(*Manager) error ErrMsg string Retries int } @@ -33,7 +33,7 @@ func (t *Task) Run(mgrTask *Manager) error { if lastError != nil { mgrTask.Logger.Warn("Retrying task…") } - lastError = t.Fn(mgrTask) + lastError = t.Task(mgrTask) if lastError != nil { mgrTask.Logger.Warn("Task failed…") if mgrTask.Verbose { diff --git a/scripts/docker-install.sh b/scripts/docker-install.sh index bc5420e8..d4a71f4e 100644 --- a/scripts/docker-install.sh +++ b/scripts/docker-install.sh @@ -62,7 +62,7 @@ echo_docker_as_nonroot() { $sh_c 'docker version' ) || true fi -# config_Accelerator + config_Accelerator your_user=your-user [ "$user" != 'root' ] && your_user="$user"