From c3c6864b4793a4ea6e59c46d4cbd2287c741d9bd Mon Sep 17 00:00:00 2001 From: naison <895703375@qq.com> Date: Fri, 29 Dec 2023 23:07:07 +0800 Subject: [PATCH] fix: remove svc from hosts if svc deleted (#107) --- cmd/kubevpn/cmds/reset.go | 2 ++ pkg/dns/dns.go | 36 +++++++++++++++++++++++++++++++++--- pkg/dns/dns_linux.go | 2 +- pkg/dns/dns_unix.go | 2 +- pkg/dns/dns_windows.go | 2 +- pkg/handler/cleaner.go | 4 ++-- pkg/handler/reset.go | 31 ++++++++++++++++++++++--------- 7 files changed, 62 insertions(+), 17 deletions(-) diff --git a/cmd/kubevpn/cmds/reset.go b/cmd/kubevpn/cmds/reset.go index e66f4c17..d56feb80 100644 --- a/cmd/kubevpn/cmds/reset.go +++ b/cmd/kubevpn/cmds/reset.go @@ -50,6 +50,8 @@ func CmdReset(factory cmdutil.Factory) *cobra.Command { if err := connect.InitClient(factory); err != nil { log.Fatal(err) } + _ = quit(cmd.Context(), true) + _ = quit(cmd.Context(), false) err := connect.Reset(cmd.Context()) if err != nil { log.Fatal(err) diff --git a/pkg/dns/dns.go b/pkg/dns/dns.go index 569d9cab..3615ee16 100644 --- a/pkg/dns/dns.go +++ b/pkg/dns/dns.go @@ -83,6 +83,27 @@ func (c *Config) AddServiceNameToHosts(ctx context.Context, serviceInterface v13 if !rateLimiter.TryAccept() { return } + if event.Type == watch.Deleted { + svc, ok := event.Object.(*v12.Service) + if !ok { + continue + } + var list []Entry + for _, p := range sets.New[string](svc.Spec.ClusterIPs...).Insert(svc.Spec.ClusterIP).UnsortedList() { + if net.ParseIP(p) == nil { + continue + } + list = append(list, Entry{ + IP: p, + Domain: svc.Name, + }) + } + err = c.removeHosts(list) + if err != nil { + log.Errorf("failed to remove hosts(%s) to hosts: %v", entryList2String(list), err) + } + continue + } list, err := serviceInterface.List(ctx, v1.ListOptions{}) if err != nil { return @@ -129,14 +150,23 @@ func (c *Config) addHosts(entryList []Entry) error { return err } -func (c *Config) removeHosts() error { +func (c *Config) removeHosts(entryList []Entry) error { c.Lock.Lock() defer c.Lock.Unlock() - if len(c.Hosts) == 0 { + if len(entryList) == 0 { return nil } + for _, entry := range entryList { + for i := 0; i < len(c.Hosts); i++ { + if entry == c.Hosts[i] { + c.Hosts = append(c.Hosts[:i], c.Hosts[i+1:]...) + i-- + } + } + } + hostFile := GetHostFile() f, err := os.OpenFile(hostFile, os.O_RDWR, 0644) if err != nil { @@ -153,7 +183,7 @@ func (c *Config) removeHosts() error { } var needsRemove bool if strings.Contains(line, config.HostsKeyWord) { - for _, host := range c.Hosts { + for _, host := range entryList { if strings.Contains(line, host.IP) && strings.Contains(line, host.Domain) { needsRemove = true } diff --git a/pkg/dns/dns_linux.go b/pkg/dns/dns_linux.go index 22b5f0e2..791dd4c4 100644 --- a/pkg/dns/dns_linux.go +++ b/pkg/dns/dns_linux.go @@ -116,7 +116,7 @@ func SetupLocalDNS(clientConfig *miekgdns.ClientConfig, existNameservers []strin } func (c *Config) CancelDNS() { - c.removeHosts() + c.removeHosts(c.Hosts) if !c.Lite { filename := filepath.Join("/", "etc", "resolv.conf") diff --git a/pkg/dns/dns_unix.go b/pkg/dns/dns_unix.go index b7a13f32..5d0a6099 100644 --- a/pkg/dns/dns_unix.go +++ b/pkg/dns/dns_unix.go @@ -194,7 +194,7 @@ func (c *Config) CancelDNS() { _ = os.RemoveAll(filepath.Join("/", "etc", "resolver")) } //networkCancel() - c.removeHosts() + c.removeHosts(c.Hosts) } /* diff --git a/pkg/dns/dns_windows.go b/pkg/dns/dns_windows.go index 9e73e703..620fd128 100644 --- a/pkg/dns/dns_windows.go +++ b/pkg/dns/dns_windows.go @@ -46,7 +46,7 @@ func (c *Config) SetupDNS() error { } func (c *Config) CancelDNS() { - c.removeHosts() + c.removeHosts(c.Hosts) tun, err := net.InterfaceByName(c.TunName) if err != nil { return diff --git a/pkg/handler/cleaner.go b/pkg/handler/cleaner.go index d2ddc5d4..f9650012 100644 --- a/pkg/handler/cleaner.go +++ b/pkg/handler/cleaner.go @@ -60,7 +60,7 @@ func (c *ConnectOptions) Cleanup() { if err == nil && count <= 0 { deployment, errs := c.clientset.AppsV1().Deployments(c.Namespace).Get(ctx, config.ConfigMapPodTrafficManager, v1.GetOptions{}) if errs == nil && deployment.Status.UnavailableReplicas != 0 { - cleanup(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, true) + cleanupK8sResource(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, true) } } if err != nil { @@ -149,7 +149,7 @@ func updateRefCount(ctx context.Context, configMapInterface v12.ConfigMapInterfa return } -func cleanup(ctx context.Context, clientset *kubernetes.Clientset, namespace, name string, keepCIDR bool) { +func cleanupK8sResource(ctx context.Context, clientset *kubernetes.Clientset, namespace, name string, keepCIDR bool) { options := v1.DeleteOptions{GracePeriodSeconds: pointer.Int64(0)} if keepCIDR { diff --git a/pkg/handler/reset.go b/pkg/handler/reset.go index a1c783e4..60d94234 100644 --- a/pkg/handler/reset.go +++ b/pkg/handler/reset.go @@ -14,32 +14,45 @@ import ( "github.com/wencaiwulue/kubevpn/pkg/config" "github.com/wencaiwulue/kubevpn/pkg/controlplane" + "github.com/wencaiwulue/kubevpn/pkg/dns" ) // Reset -// 1, get all proxy-resources from configmap -// 2, cleanup all containers +// 1) quit daemon +// 2) get all proxy-resources from configmap +// 3) cleanup all containers +// 4) cleanup hosts func (c *ConnectOptions) Reset(ctx context.Context) error { err := c.LeaveProxyResources(ctx) if err != nil { log.Errorf("leave proxy resources error: %v", err) + } else { + log.Infof("leave proxy resources success") } - cleanup(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, false) - var cli *client.Client - cli, err = client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + log.Infof("cleanup k8s resource") + cleanupK8sResource(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, false) + + _ = c.CleanupLocalContainer(ctx) + + _ = dns.CleanupHosts() + return err +} + +func (c *ConnectOptions) CleanupLocalContainer(ctx context.Context) error { + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { - return nil + return err } var networkResource types.NetworkResource networkResource, err = cli.NetworkInspect(ctx, config.ConfigMapPodTrafficManager, types.NetworkInspectOptions{}) if err != nil { - return nil + return err } if len(networkResource.Containers) == 0 { - return cli.NetworkRemove(ctx, config.ConfigMapPodTrafficManager) + err = cli.NetworkRemove(ctx, config.ConfigMapPodTrafficManager) } - return nil + return err } func (c *ConnectOptions) LeaveProxyResources(ctx context.Context) (err error) {