mirror of
				https://github.com/kubenetworks/kubevpn.git
				synced 2025-10-31 18:52:50 +08:00 
			
		
		
		
	fix: remove svc from hosts if svc deleted (#107)
This commit is contained in:
		| @@ -50,6 +50,8 @@ func CmdReset(factory cmdutil.Factory) *cobra.Command { | |||||||
| 			if err := connect.InitClient(factory); err != nil { | 			if err := connect.InitClient(factory); err != nil { | ||||||
| 				log.Fatal(err) | 				log.Fatal(err) | ||||||
| 			} | 			} | ||||||
|  | 			_ = quit(cmd.Context(), true) | ||||||
|  | 			_ = quit(cmd.Context(), false) | ||||||
| 			err := connect.Reset(cmd.Context()) | 			err := connect.Reset(cmd.Context()) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Fatal(err) | 				log.Fatal(err) | ||||||
|   | |||||||
| @@ -83,6 +83,27 @@ func (c *Config) AddServiceNameToHosts(ctx context.Context, serviceInterface v13 | |||||||
| 						if !rateLimiter.TryAccept() { | 						if !rateLimiter.TryAccept() { | ||||||
| 							return | 							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{}) | 						list, err := serviceInterface.List(ctx, v1.ListOptions{}) | ||||||
| 						if err != nil { | 						if err != nil { | ||||||
| 							return | 							return | ||||||
| @@ -129,14 +150,23 @@ func (c *Config) addHosts(entryList []Entry) error { | |||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) removeHosts() error { | func (c *Config) removeHosts(entryList []Entry) error { | ||||||
| 	c.Lock.Lock() | 	c.Lock.Lock() | ||||||
| 	defer c.Lock.Unlock() | 	defer c.Lock.Unlock() | ||||||
|  |  | ||||||
| 	if len(c.Hosts) == 0 { | 	if len(entryList) == 0 { | ||||||
| 		return nil | 		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() | 	hostFile := GetHostFile() | ||||||
| 	f, err := os.OpenFile(hostFile, os.O_RDWR, 0644) | 	f, err := os.OpenFile(hostFile, os.O_RDWR, 0644) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -153,7 +183,7 @@ func (c *Config) removeHosts() error { | |||||||
| 		} | 		} | ||||||
| 		var needsRemove bool | 		var needsRemove bool | ||||||
| 		if strings.Contains(line, config.HostsKeyWord) { | 		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) { | 				if strings.Contains(line, host.IP) && strings.Contains(line, host.Domain) { | ||||||
| 					needsRemove = true | 					needsRemove = true | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ func SetupLocalDNS(clientConfig *miekgdns.ClientConfig, existNameservers []strin | |||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) CancelDNS() { | func (c *Config) CancelDNS() { | ||||||
| 	c.removeHosts() | 	c.removeHosts(c.Hosts) | ||||||
|  |  | ||||||
| 	if !c.Lite { | 	if !c.Lite { | ||||||
| 		filename := filepath.Join("/", "etc", "resolv.conf") | 		filename := filepath.Join("/", "etc", "resolv.conf") | ||||||
|   | |||||||
| @@ -194,7 +194,7 @@ func (c *Config) CancelDNS() { | |||||||
| 		_ = os.RemoveAll(filepath.Join("/", "etc", "resolver")) | 		_ = os.RemoveAll(filepath.Join("/", "etc", "resolver")) | ||||||
| 	} | 	} | ||||||
| 	//networkCancel() | 	//networkCancel() | ||||||
| 	c.removeHosts() | 	c.removeHosts(c.Hosts) | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ func (c *Config) SetupDNS() error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) CancelDNS() { | func (c *Config) CancelDNS() { | ||||||
| 	c.removeHosts() | 	c.removeHosts(c.Hosts) | ||||||
| 	tun, err := net.InterfaceByName(c.TunName) | 	tun, err := net.InterfaceByName(c.TunName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
|   | |||||||
| @@ -60,7 +60,7 @@ func (c *ConnectOptions) Cleanup() { | |||||||
| 		if err == nil && count <= 0 { | 		if err == nil && count <= 0 { | ||||||
| 			deployment, errs := c.clientset.AppsV1().Deployments(c.Namespace).Get(ctx, config.ConfigMapPodTrafficManager, v1.GetOptions{}) | 			deployment, errs := c.clientset.AppsV1().Deployments(c.Namespace).Get(ctx, config.ConfigMapPodTrafficManager, v1.GetOptions{}) | ||||||
| 			if errs == nil && deployment.Status.UnavailableReplicas != 0 { | 			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 { | 		if err != nil { | ||||||
| @@ -149,7 +149,7 @@ func updateRefCount(ctx context.Context, configMapInterface v12.ConfigMapInterfa | |||||||
| 	return | 	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)} | 	options := v1.DeleteOptions{GracePeriodSeconds: pointer.Int64(0)} | ||||||
|  |  | ||||||
| 	if keepCIDR { | 	if keepCIDR { | ||||||
|   | |||||||
| @@ -14,32 +14,45 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/wencaiwulue/kubevpn/pkg/config" | 	"github.com/wencaiwulue/kubevpn/pkg/config" | ||||||
| 	"github.com/wencaiwulue/kubevpn/pkg/controlplane" | 	"github.com/wencaiwulue/kubevpn/pkg/controlplane" | ||||||
|  | 	"github.com/wencaiwulue/kubevpn/pkg/dns" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Reset | // Reset | ||||||
| // 1, get all proxy-resources from configmap | // 1) quit daemon | ||||||
| // 2, cleanup all containers | // 2) get all proxy-resources from configmap | ||||||
|  | // 3) cleanup all containers | ||||||
|  | // 4) cleanup hosts | ||||||
| func (c *ConnectOptions) Reset(ctx context.Context) error { | func (c *ConnectOptions) Reset(ctx context.Context) error { | ||||||
| 	err := c.LeaveProxyResources(ctx) | 	err := c.LeaveProxyResources(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Errorf("leave proxy resources error: %v", err) | 		log.Errorf("leave proxy resources error: %v", err) | ||||||
|  | 	} else { | ||||||
|  | 		log.Infof("leave proxy resources success") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cleanup(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, false) | 	log.Infof("cleanup k8s resource") | ||||||
| 	var cli *client.Client | 	cleanupK8sResource(ctx, c.clientset, c.Namespace, config.ConfigMapPodTrafficManager, false) | ||||||
| 	cli, err = client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) |  | ||||||
|  | 	_ = 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 { | 	if err != nil { | ||||||
| 		return nil | 		return err | ||||||
| 	} | 	} | ||||||
| 	var networkResource types.NetworkResource | 	var networkResource types.NetworkResource | ||||||
| 	networkResource, err = cli.NetworkInspect(ctx, config.ConfigMapPodTrafficManager, types.NetworkInspectOptions{}) | 	networkResource, err = cli.NetworkInspect(ctx, config.ConfigMapPodTrafficManager, types.NetworkInspectOptions{}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil | 		return err | ||||||
| 	} | 	} | ||||||
| 	if len(networkResource.Containers) == 0 { | 	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) { | func (c *ConnectOptions) LeaveProxyResources(ctx context.Context) (err error) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 naison
					naison