allow connections to non-dockerized k3s clusters

This commit is contained in:
iwilltry42 2019-09-04 18:08:43 +02:00
parent c8f8fdb139
commit 3e80e37faf
3 changed files with 100 additions and 13 deletions

View File

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

View File

@ -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 <server-container-name>

22
main.go
View File

@ -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: <repo>/<image>:<tag>)",
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://<host>:<port>`) [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,
},