add reset cmd

This commit is contained in:
pixiake 2020-04-26 15:14:43 +08:00
parent 107205c14c
commit e9eb8f085c
16 changed files with 169 additions and 31 deletions

View File

@ -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"
)

View File

@ -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

View File

@ -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
}

View File

@ -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"
)

View File

@ -1 +0,0 @@
package cluster

View File

@ -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

View File

@ -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
}

View File

@ -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")
}

View File

@ -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 {

45
pkg/reset/executor.go Normal file
View File

@ -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
}

78
pkg/reset/reset.go Normal file
View File

@ -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
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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"