fix: remove svc from hosts if svc deleted (#107)

This commit is contained in:
naison
2023-12-29 23:07:07 +08:00
committed by GitHub
parent 80ffd2f468
commit c3c6864b47
7 changed files with 62 additions and 17 deletions

View File

@@ -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)

View File

@@ -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
} }

View File

@@ -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")

View File

@@ -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)
} }
/* /*

View File

@@ -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

View File

@@ -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 {

View File

@@ -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) {