diff --git a/Makefile b/Makefile index 97c41c088..708c7d1d3 100644 --- a/Makefile +++ b/Makefile @@ -55,9 +55,14 @@ build-arm64: CGO_ENABLED=${CGO_ENABLED} GOOS=${OS} GOARCH=arm64 go build -o $(shell pwd)/bin/${OS}_arm64/sealos -tags "containers_image_openpgp" cmd/sealos/main.go CGO_ENABLED=0 GOOS=${OS} GOARCH=arm64 go build -o $(shell pwd)/bin/${OS}_arm64/seactl -tags "containers_image_openpgp" cmd/sealctl/main.go +import: + goimports -l -w cmd + goimports -l -w pkg GORELEASER_BIN = $(shell pwd)/bin/goreleaser install-goreleaser: ## check license if not exist install go-lint tools + #goimports -l -w cmd + #goimports -l -w pkg $(call go-get-tool,$(GORELEASER_BIN),github.com/goreleaser/goreleaser@v1.6.3) build-pack: SHELL:=/bin/bash diff --git a/pkg/apply/applydrivers/apply_drivers_default.go b/pkg/apply/applydrivers/apply_drivers_default.go index 789a31265..13b2d2ed2 100644 --- a/pkg/apply/applydrivers/apply_drivers_default.go +++ b/pkg/apply/applydrivers/apply_drivers_default.go @@ -85,8 +85,8 @@ func (c *Applier) reconcileCluster() error { if err := c.installApp(c.RunNewImages); err != nil { return err } - mj, md := iputils.GetDiffHosts(c.ClusterCurrent.GetMasterIPList(), c.ClusterDesired.GetMasterIPList()) - nj, nd := iputils.GetDiffHosts(c.ClusterCurrent.GetNodeIPList(), c.ClusterDesired.GetNodeIPList()) + mj, md := iputils.GetDiffHosts(c.ClusterCurrent.GetMasterIPAndPortList(), c.ClusterDesired.GetMasterIPAndPortList()) + nj, nd := iputils.GetDiffHosts(c.ClusterCurrent.GetNodeIPAndPortList(), c.ClusterDesired.GetNodeIPAndPortList()) //if len(mj) == 0 && len(md) == 0 && len(nj) == 0 && len(nd) == 0 { // return c.upgrade() //} @@ -128,8 +128,8 @@ func (c *Applier) installApp(images []string) error { func (c *Applier) scaleCluster(mj, md, nj, nd []string) error { logger.Info("start to scale this cluster") - logger.Debug("current cluster: master %s, worker %s", c.ClusterCurrent.GetMasterIPList(), c.ClusterCurrent.GetNodeIPList()) - logger.Debug("desired cluster: master %s, worker %s", c.ClusterDesired.GetMasterIPList(), c.ClusterDesired.GetNodeIPList()) + logger.Debug("current cluster: master %s, worker %s", c.ClusterCurrent.GetMasterIPAndPortList(), c.ClusterCurrent.GetNodeIPAndPortList()) + logger.Debug("desired cluster: master %s, worker %s", c.ClusterDesired.GetMasterIPAndPortList(), c.ClusterDesired.GetNodeIPAndPortList()) if len(mj) == 0 && len(md) == 0 && len(nj) == 0 && len(nd) == 0 { logger.Info("succeeded in scaling this cluster: no change nodes") return nil diff --git a/pkg/apply/scale.go b/pkg/apply/scale.go index 265f9afc7..33f43e8f3 100644 --- a/pkg/apply/scale.go +++ b/pkg/apply/scale.go @@ -19,6 +19,8 @@ import ( "strconv" "strings" + "k8s.io/apimachinery/pkg/util/sets" + "github.com/labring/sealos/pkg/utils/logger" "github.com/labring/sealos/pkg/apply/applydrivers" @@ -165,6 +167,20 @@ func deleteNodes(cluster *v2.Cluster, scaleArgs *RunArgs) error { } defaultPort := strconv.Itoa(int(cluster.Spec.SSH.Port)) + + hostsSet := sets.NewString() + + for _, node := range cluster.Spec.Hosts { + hostsSet.Insert(node.IPS...) + } + + for _, node := range strings.Split(scaleArgs.Nodes, ",") { + targetIP, targetPort := iputils.GetHostIPAndPortOrDefault(node, defaultPort) + if !hostsSet.Has(fmt.Sprintf("%s:%s", targetIP, targetPort)) { + return fmt.Errorf("parameter error: to delete IP %s must in cluster IP list", targetIP) + } + } + if scaleArgs.Masters != "" && IsIPList(scaleArgs.Masters) { for i := range cluster.Spec.Hosts { if strings2.InList(v2.MASTER, cluster.Spec.Hosts[i].Roles) { diff --git a/pkg/runtime/reset.go b/pkg/runtime/reset.go index bff21cec0..8d2ada172 100644 --- a/pkg/runtime/reset.go +++ b/pkg/runtime/reset.go @@ -23,9 +23,8 @@ import ( ) const ( - RemoveKubeConfig = "rm -rf .kube" - RemoteCleanMasterOrNode = `if which kubeadm;then kubeadm reset -f %s;fi && \ -modprobe -r ipip && lsmod && \ + removeKubeConfig = "rm -rf .kube" + remoteCleanMasterOrNode = `if which kubeadm;then kubeadm reset -f %s;fi && \ rm -rf /etc/kubernetes/ && \ rm -rf /etc/cni && rm -rf /opt/cni && \ rm -rf %s @@ -69,21 +68,29 @@ func (k *KubeadmRuntime) resetMasters(nodes []string) { func (k *KubeadmRuntime) resetNode(node string) error { logger.Info("start to reset node: %s", node) - if err := k.sshCmdAsync(node, fmt.Sprintf(RemoteCleanMasterOrNode, vlogToStr(k.vlog), k.getEtcdDataDir()), - RemoveKubeConfig, DeleteImageShimCMD(k.getContentData().RootFSPath())); err != nil { - return fmt.Errorf("exec node clean in sealos failed %v", err) + resetCmd := fmt.Sprintf(remoteCleanMasterOrNode, vlogToStr(k.vlog), k.getEtcdDataDir()) + deleteShimCmd := DeleteImageShimCMD(k.getContentData().RootFSPath()) + if err := k.sshCmdAsync(node, resetCmd); err != nil { + logger.Error("failed to clean node, exec command %s failed, %v", resetCmd, err) + } + if err := k.sshCmdAsync(node, removeKubeConfig); err != nil { + logger.Error("failed to clean node, exec command %s failed, %v", removeKubeConfig, err) + } + + if err := k.sshCmdAsync(node, deleteShimCmd); err != nil { + logger.Error("failed to clean node, exec command %s failed, %v", deleteShimCmd, err) } err := k.execClean(node) if err != nil { - return fmt.Errorf("exec clean.sh failed %v", err) + logger.Error("exec clean.sh failed %v", err) } err = k.execHostsDelete(node, k.getRegistry().Domain) if err != nil { - return fmt.Errorf("delete registry hosts failed %v", err) + logger.Error("delete registry hosts failed %v", err) } err = k.execHostsDelete(node, k.getAPIServerDomain()) if err != nil { - return fmt.Errorf("delete apiserver hosts failed %v", err) + logger.Error("delete apiserver hosts failed %v", err) } return nil diff --git a/pkg/runtime/utils.go b/pkg/runtime/utils.go index 77bbc7dd4..01d7d623e 100644 --- a/pkg/runtime/utils.go +++ b/pkg/runtime/utils.go @@ -20,6 +20,8 @@ import ( "context" "fmt" + "github.com/labring/sealos/pkg/utils/iputils" + "github.com/labring/sealos/pkg/client-go/kubernetes" "github.com/labring/sealos/pkg/utils/contants" "github.com/labring/sealos/pkg/utils/logger" @@ -101,6 +103,7 @@ func (k *KubeadmRuntime) sendFileToHosts(Hosts []string, src, dst string) error } func (k *KubeadmRuntime) deleteKubeNode(ip string) error { + ip = iputils.GetHostIP(ip) logger.Info("start to remove node from k8s %s", ip) cli, err := kubernetes.NewKubernetesClient(k.getContentData().AdminFile(), k.getMaster0IPAPIServer()) if err != nil { @@ -115,7 +118,7 @@ func (k *KubeadmRuntime) deleteKubeNode(ip string) error { for _, n := range nodeList.Items { for _, addr := range n.Status.Addresses { if addr.Type == v12.NodeInternalIP && addr.Address == ip { - nodeType = &n + nodeType = n.DeepCopy() } } } diff --git a/pkg/utils/iputils/iputils_v2.go b/pkg/utils/iputils/iputils_v2.go index 6a598f6ff..4a9c1e13a 100644 --- a/pkg/utils/iputils/iputils_v2.go +++ b/pkg/utils/iputils/iputils_v2.go @@ -39,10 +39,25 @@ func GetDiffHosts(hostsOld, hostsNew []string) (add, sub []string) { // s2 = {a1, a2, a4, a5} // s1.Difference(s2) = {a3} // s2.Difference(s1) = {a4, a5} - oldSet := sets.NewString(hostsOld...) - newSet := sets.NewString(hostsNew...) - add = newSet.Difference(oldSet).List() - sub = oldSet.Difference(newSet).List() + oldSet := sets.NewString(GetHostIPs(hostsOld)...) + newSet := sets.NewString(GetHostIPs(hostsNew)...) + addIPs := newSet.Difference(oldSet).List() + subIPs := oldSet.Difference(newSet).List() + + for _, ip := range hostsNew { + for _, aIP := range addIPs { + if aIP == GetHostIP(ip) { + add = append(add, ip) + } + } + } + for _, ip := range hostsOld { + for _, aIP := range subIPs { + if aIP == GetHostIP(ip) { + sub = append(sub, ip) + } + } + } return }