Просмотр исходного кода

Make cleanup on shutdown optional (#327)

* Make cleanup on shutdown optional

* Make clean-up on shutdown the default

* Sync cmdline help and docs
Alex Stockinger 3 лет назад
Родитель
Сommit
2fa4ae7e93
3 измененных файлов с 17 добавлено и 5 удалено
  1. 3 1
      cmd/kg/main.go
  2. 1 0
      docs/kg.md
  3. 13 4
      pkg/mesh/mesh.go

+ 3 - 1
cmd/kg/main.go

@@ -95,6 +95,7 @@ var cmd = &cobra.Command{
 
 var (
 	backend               string
+	cleanUp               bool
 	cleanUpIface          bool
 	createIface           bool
 	cni                   bool
@@ -126,6 +127,7 @@ var (
 
 func init() {
 	cmd.Flags().StringVar(&backend, "backend", k8s.Backend, fmt.Sprintf("The backend for the mesh. Possible values: %s", availableBackends))
+	cmd.Flags().BoolVar(&cleanUp, "clean-up", true, "Should kilo clean up network modifications on shutdown?")
 	cmd.Flags().BoolVar(&cleanUpIface, "clean-up-interface", false, "Should Kilo delete its interface when it shuts down?")
 	cmd.Flags().BoolVar(&createIface, "create-interface", true, "Should kilo create an interface on startup?")
 	cmd.Flags().BoolVar(&cni, "cni", true, "Should Kilo manage the node's CNI configuration?")
@@ -257,7 +259,7 @@ func runRoot(_ *cobra.Command, _ []string) error {
 		serviceCIDRs = append(serviceCIDRs, s)
 	}
 
-	m, err := mesh.New(b, enc, gr, hostname, port, s, local, cni, cniPath, iface, cleanUpIface, createIface, mtu, resyncPeriod, prioritisePrivateAddr, iptablesForwardRule, serviceCIDRs, log.With(logger, "component", "kilo"), registry)
+	m, err := mesh.New(b, enc, gr, hostname, port, s, local, cni, cniPath, iface, cleanUp, cleanUpIface, createIface, mtu, resyncPeriod, prioritisePrivateAddr, iptablesForwardRule, serviceCIDRs, log.With(logger, "component", "kilo"), registry)
 	if err != nil {
 		return fmt.Errorf("failed to create Kilo mesh: %v", err)
 	}

+ 1 - 0
docs/kg.md

@@ -33,6 +33,7 @@ Available Commands:
 
 Flags:
       --backend string                 The backend for the mesh. Possible values: kubernetes (default "kubernetes")
+      --clean-up                       Should kilo clean up network modifications on shutdown? (default true)
       --clean-up-interface             Should Kilo delete its interface when it shuts down?
       --cni                            Should Kilo manage the node's CNI configuration? (default true)
       --cni-path string                Path to CNI config. (default "/etc/cni/net.d/10-kilo.conflist")

+ 13 - 4
pkg/mesh/mesh.go

@@ -50,6 +50,7 @@ const (
 // Mesh is able to create Kilo network meshes.
 type Mesh struct {
 	Backend
+	cleanup             bool
 	cleanUpIface        bool
 	cni                 bool
 	cniPath             string
@@ -88,7 +89,7 @@ type Mesh struct {
 }
 
 // New returns a new Mesh instance.
-func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularity, hostname string, port int, subnet *net.IPNet, local, cni bool, cniPath, iface string, cleanUpIface bool, createIface bool, mtu uint, resyncPeriod time.Duration, prioritisePrivateAddr, iptablesForwardRule bool, serviceCIDRs []*net.IPNet, logger log.Logger, registerer prometheus.Registerer) (*Mesh, error) {
+func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularity, hostname string, port int, subnet *net.IPNet, local, cni bool, cniPath, iface string, cleanup bool, cleanUpIface bool, createIface bool, mtu uint, resyncPeriod time.Duration, prioritisePrivateAddr, iptablesForwardRule bool, serviceCIDRs []*net.IPNet, logger log.Logger, registerer prometheus.Registerer) (*Mesh, error) {
 	if err := os.MkdirAll(kiloPath, 0700); err != nil {
 		return nil, fmt.Errorf("failed to create directory to store configuration: %v", err)
 	}
@@ -117,9 +118,14 @@ func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularit
 	}
 	var kiloIface int
 	if createIface {
-		kiloIface, _, err = wireguard.New(iface, mtu)
+		link, err := netlink.LinkByName(iface)
 		if err != nil {
-			return nil, fmt.Errorf("failed to create WireGuard interface: %v", err)
+			kiloIface, _, err = wireguard.New(iface, mtu)
+			if err != nil {
+				return nil, fmt.Errorf("failed to create WireGuard interface: %v", err)
+			}
+		} else {
+			kiloIface = link.Attrs().Index
 		}
 	} else {
 		link, err := netlink.LinkByName(iface)
@@ -162,6 +168,7 @@ func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularit
 	}
 	mesh := Mesh{
 		Backend:             backend,
+		cleanup:             cleanup,
 		cleanUpIface:        cleanUpIface,
 		cni:                 cni,
 		cniPath:             cniPath,
@@ -257,7 +264,9 @@ func (m *Mesh) Run(ctx context.Context) error {
 			}
 		}
 	}()
-	defer m.cleanUp()
+	if m.cleanup {
+		defer m.cleanUp()
+	}
 	resync := time.NewTimer(m.resyncPeriod)
 	checkIn := time.NewTimer(checkInPeriod)
 	nw := m.Nodes().Watch()