feature(main): fix delete add node and skip error (#1027)

* feature(main): fix delete add node and skip error
This commit is contained in:
cuisongliu
2022-05-17 14:45:28 +08:00
committed by GitHub
parent fb452f03f8
commit eae61dcd00
6 changed files with 64 additions and 18 deletions
+5
View File
@@ -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
@@ -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
+16
View File
@@ -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) {
+16 -9
View File
@@ -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
+4 -1
View File
@@ -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()
}
}
}
+19 -4
View File
@@ -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
}