diff --git a/cmd/sealctl/cmd/ipvs.go b/cmd/sealctl/cmd/ipvs.go index 602f59c4b..0388c7100 100644 --- a/cmd/sealctl/cmd/ipvs.go +++ b/cmd/sealctl/cmd/ipvs.go @@ -59,8 +59,10 @@ func newIPVSCmd() *cobra.Command { care.LVS.TargetIP = net.ParseIP(ip) } logger.Debug("found target route ip is %s", care.LVS.TargetIP.String()) - if err := care.LVS.SyncRouter(); err != nil { - return err + if !clean { + if err := care.LVS.SyncRouter(); err != nil { + return err + } } } care.LVS.Clean = true diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index b84c18b3f..e8369f555 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -28,6 +28,7 @@ type Interface interface { HostsDelete(ip, domain string) error Hostname(ip string) (string, error) IPVS(ip, vip string, masters []string) error + IPVSClean(ip, vip string) error StaticPod(ip, vip, name, image string, masters []string) error Token(ip string) (string, error) IsDocker(ip string) (string, error) @@ -79,6 +80,19 @@ func (s *remote) IPVS(ip, vip string, masters []string) error { } return bashCTLSync(s.clusterName, s.sshInterface, ip, out) } +func (s *remote) IPVSClean(ip, vip string) error { + var ipvsCommandTemplate = template.Must(template.New("ipvs").Parse(`` + + `ipvs --vs {{.vip}} -C`, + )) + data := map[string]interface{}{ + "vip": vip, + } + out, err := renderTemplate(ipvsCommandTemplate, data) + if err != nil { + return err + } + return bashCTLSync(s.clusterName, s.sshInterface, ip, out) +} func (s *remote) StaticPod(ip, vip, name, image string, masters []string) error { var staticPodIPVSCommandTemplate = template.Must(template.New("lvscare").Parse(`` + diff --git a/pkg/runtime/reset.go b/pkg/runtime/reset.go index ceb228fd8..15e1611f3 100644 --- a/pkg/runtime/reset.go +++ b/pkg/runtime/reset.go @@ -79,7 +79,9 @@ func (k *KubeadmRuntime) resetNode(node string) error { if err := k.sshCmdAsync(node, removeKubeConfig); err != nil { logger.Error("failed to clean node, exec command %s failed, %v", removeKubeConfig, err) } - + if err := k.execIPVSClean(node); err != nil { + logger.Error("failed to clean node route and ipvs failed, %v", err) + } if err := k.sshCmdAsync(node, deleteShimCmd); err != nil { logger.Error("failed to clean node, exec command %s failed, %v", deleteShimCmd, err) } diff --git a/pkg/runtime/runtime_getter.go b/pkg/runtime/runtime_getter.go index c4ab43fbe..b28a822d1 100644 --- a/pkg/runtime/runtime_getter.go +++ b/pkg/runtime/runtime_getter.go @@ -98,6 +98,10 @@ func (k *KubeadmRuntime) execIPVS(ip string, masters []string) error { return k.getRemoteInterface().IPVS(ip, k.getVipAndPort(), masters) } +func (k *KubeadmRuntime) execIPVSClean(ip string) error { + return k.getRemoteInterface().IPVSClean(ip, k.getVipAndPort()) +} + func (k *KubeadmRuntime) syncNodeIPVSYaml(masterIPs, nodesIPs []string) error { masters := make([]string, 0) for _, master := range masterIPs {