From 3e80e37fafc4ed4b34d0656704c7bc2a8b7bfc32 Mon Sep 17 00:00:00 2001 From: iwilltry42 Date: Wed, 4 Sep 2019 18:08:43 +0200 Subject: [PATCH] allow connections to non-dockerized k3s clusters --- cli/commands.go | 79 ++++++++++++++++++++++++++++++++++++++++++------ cli/container.go | 12 +++++++- main.go | 22 ++++++++++++-- 3 files changed, 100 insertions(+), 13 deletions(-) diff --git a/cli/commands.go b/cli/commands.go index 1b6fb2cc..11ff4d49 100644 --- a/cli/commands.go +++ b/cli/commands.go @@ -460,7 +460,7 @@ func AddNode(c *cli.Context) error { // TODO: support this if nodeRole == "server" { - return fmt.Errorf("ERROR: sorry, we don't support adding server nodes at the moment!") + return fmt.Errorf("ERROR: sorry, we don't support adding server nodes at the moment") } /* (0.2) @@ -473,6 +473,22 @@ func AddNode(c *cli.Context) error { image = fmt.Sprintf("%s/%s", defaultRegistry, image) } + /* (0.3) BREAKOUT + * --k3s + * Connect to a non-dockerized k3s server + */ + + if c.IsSet("k3s") { + log.Printf("INFO: Adding new nodes to k3s [%s]\n", c.String("k3s")) + if _, err := createClusterNetwork(clusterName); err != nil { + return err + } + if err := addNodeToK3s(c, nodeRole, image); err != nil { + return err + } + return nil + } + /* * (1) Check cluster */ @@ -530,7 +546,7 @@ func AddNode(c *cli.Context) error { } } if serverListenPort == "" { - return fmt.Errorf("ERROR: couldn't get https-listen-port form server contaienr") + return fmt.Errorf("ERROR: couldn't get https-listen-port form server container") } /* @@ -600,15 +616,58 @@ func AddNode(c *cli.Context) error { log.Printf("INFO: Adding %d %s-nodes to cluster %s...\n", nodeCount, nodeRole, clusterName) - if nodeRole == "agent" { - for suffix := highestExistingWorkerSuffix + 1; suffix < nodeCount+1+highestExistingWorkerSuffix; suffix++ { - workerContainerID, err := createWorker(clusterSpec, suffix) - if err != nil { - return fmt.Errorf("ERROR: Couldn't create %s-node!\n%+v", nodeRole, err) - } - log.Printf("INFO: Created %s-node with ID %s\n", nodeRole, workerContainerID) - } + if err := createNodes(clusterSpec, nodeRole, highestExistingWorkerSuffix+1, nodeCount); err != nil { + return err } return nil } + +func addNodeToK3s(c *cli.Context, nodeRole, image string) error { + env := []string{} + + k3sURLEnvVar := fmt.Sprintf("K3S_URL=%s", c.String("k3s")) + k3sConnSecretEnvVar := fmt.Sprintf("K3S_SECRET=%s", c.String("k3s-secret")) + if c.IsSet("k3s-token") { + k3sConnSecretEnvVar = fmt.Sprintf("K3S_TOKEN=%s", c.String("k3s-token")) + } + + env = append(env, k3sURLEnvVar, k3sConnSecretEnvVar) + + clusterSpec := &ClusterSpec{ + AgentArgs: nil, + APIPort: apiPort{}, + AutoRestart: false, + ClusterName: c.String("name"), + Env: env, + Image: image, + NodeToPortSpecMap: nil, + PortAutoOffset: 0, + ServerArgs: nil, + Verbose: false, + Volumes: nil, + } + + if err := createNodes(clusterSpec, nodeRole, 0, c.Int("count")); err != nil { + return err + } + + return nil +} + +func createNodes(clusterSpec *ClusterSpec, role string, suffixNumberStart int, count int) error { + for suffix := suffixNumberStart; suffix < suffixNumberStart+count; suffix++ { + containerID := "" + var err error + if role == "agent" { + containerID, err = createWorker(clusterSpec, suffix) + } else if role == "server" { + containerID, err = createServer(clusterSpec) + } + if err != nil { + return fmt.Errorf("ERROR: Couldn't create %s-node!\n%+v", role, err) + } + log.Printf("INFO: Created %s-node with ID %s\n", role, containerID) + } + return nil +} diff --git a/cli/container.go b/cli/container.go index 3905f7bd..f25b5a1c 100644 --- a/cli/container.go +++ b/cli/container.go @@ -144,8 +144,18 @@ func createWorker(spec *ClusterSpec, postfix int) (string, error) { containerLabels["cluster"] = spec.ClusterName containerName := GetContainerName("worker", spec.ClusterName, postfix) + env := spec.Env - env := append(spec.Env, fmt.Sprintf("K3S_URL=https://k3d-%s-server:%s", spec.ClusterName, spec.APIPort.Port)) + needServerURL := true + for _, envVar := range env { + if strings.Split(envVar, "=")[0] == "K3S_URL" { + needServerURL = false + break + } + } + if needServerURL { + env = append(spec.Env, fmt.Sprintf("K3S_URL=https://k3d-%s-server:%s", spec.ClusterName, spec.APIPort.Port)) + } // ports to be assigned to the server belong to roles // all, server or diff --git a/main.go b/main.go index 048e1efd..4c1ed1b3 100644 --- a/main.go +++ b/main.go @@ -131,9 +131,12 @@ func main() { }, Action: run.CreateCluster, }, + /* + * Add a new node to an existing k3d/k3s cluster (choosing k3d by default) + */ { Name: "add-node", - Usage: "Add nodes to an existing k3d cluster", + Usage: "Add nodes to an existing k3d/k3s cluster (k3d by default)", Flags: []cli.Flag{ cli.StringFlag{ Name: "role, r", @@ -142,7 +145,7 @@ func main() { }, cli.StringFlag{ Name: "name, n", - Usage: "Name of the clsuter that you want to add a node to", + Usage: "Name of the k3d cluster that you want to add a node to [only for node name if --k3s is set]", Value: defaultK3sClusterName, }, cli.IntFlag{ @@ -155,6 +158,21 @@ func main() { Usage: "Specify a k3s image (Format: /:)", Value: fmt.Sprintf("%s:%s", defaultK3sImage, version.GetK3sVersion()), }, + /* + * Connect to a non-dockerized k3s cluster + */ + cli.StringFlag{ + Name: "k3s", + Usage: "Add a k3d node to a non-k3d k3s cluster (specify k3s server URL like this `https://:`) [requires k3s-secret or k3s-token]", + }, + cli.StringFlag{ + Name: "k3s-secret, s", + Usage: "Specify k3s cluster secret (or use --k3s-token to use a node token)", + }, + cli.StringFlag{ + Name: "k3s-token, t", + Usage: "Specify k3s node token (or use --k3s-secret to use a cluster secret)[overrides k3s-secret]", + }, }, Action: run.AddNode, },