create cluster

pull/227/head
iwilltry42 5 years ago
parent 43eb626b0c
commit 7583340d23
  1. 49
      cmd/create/createCluster.go
  2. 2
      cmd/create/createNode.go
  3. 22
      pkg/cluster/cluster.go
  4. 4
      pkg/cluster/node.go
  5. 2
      pkg/runtimes/docker/container.go
  6. 1
      pkg/types/types.go

@ -52,7 +52,8 @@ func NewCmdCreateCluster() *cobra.Command {
cmd.Flags().StringP("api-port", "a", "6443", "Specify the Kubernetes API server port (Format: `--api-port [host:]port`")
cmd.Flags().IntP("masters", "m", 1, "Specify how many masters you want to create")
cmd.Flags().IntP("workers", "w", 0, "Specify how many workers you want to create")
cmd.Flags().String("config", "", "Specify a cluster configuration file") // TODO: to implement
cmd.Flags().String("config", "", "Specify a cluster configuration file") // TODO: to implement
cmd.Flags().String("image", k3d.DefaultK3sImageRepo, "Specify k3s image that you want to use for the nodes") // TODO: get image version
// add subcommands
@ -62,15 +63,55 @@ func NewCmdCreateCluster() *cobra.Command {
// parseCreateClusterCmd parses the command input into variables required to create a cluster
func parseCreateClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, *k3d.Cluster) {
// --runtime
rt, err := cmd.Flags().GetString("runtime")
if err != nil {
log.Fatalln("Runtime not defined")
log.Fatalln("No runtime specified")
}
runtime, err := runtimes.GetRuntime(rt)
if err != nil {
log.Fatalln(err)
}
cluster := k3d.Cluster{Name: args[0]}
return runtime, &cluster
// --image
image, err := cmd.Flags().GetString("image")
if err != nil {
log.Errorln("No image specified")
log.Fatalln(err)
}
// --masters
masterCount, err := cmd.Flags().GetInt("masters")
if err != nil {
log.Fatalln(err)
}
// --workers
workerCount, err := cmd.Flags().GetInt("workers")
if err != nil {
log.Fatalln(err)
}
// generate cluster
cluster := &k3d.Cluster{Name: args[0]} // TODO: validate name
// generate list of nodes
cluster.Nodes = []k3d.Node{}
for i := 0; i < masterCount; i++ {
node := k3d.Node{
Role: "master",
Image: image,
}
cluster.Nodes = append(cluster.Nodes, node)
}
for i := 0; i < workerCount; i++ {
node := k3d.Node{
Role: "worker",
Image: image,
}
cluster.Nodes = append(cluster.Nodes, node)
}
return runtime, cluster
}

@ -50,7 +50,7 @@ func NewCmdCreateNode() *cobra.Command {
cmd.Flags().Int("replicas", 1, "Number of replicas of this node specification.")
cmd.Flags().String("role", "worker", "Specify node role [master, worker]")
cmd.Flags().StringP("cluster", "c", "", "Select the cluster that the node shall connect to.")
cmd.Flags().String("image", k3d.DefaultK3sImageRepo, "Specify k3s image used for the node(s)")
cmd.Flags().String("image", k3d.DefaultK3sImageRepo, "Specify k3s image used for the node(s)") // TODO: get image version tag
// done
return cmd

@ -22,6 +22,8 @@ THE SOFTWARE.
package cluster
import (
"fmt"
k3drt "github.com/rancher/k3d/pkg/runtimes"
k3d "github.com/rancher/k3d/pkg/types"
log "github.com/sirupsen/logrus"
@ -32,12 +34,32 @@ import (
// - a docker network
func CreateCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) error {
// used for node suffices
masterCount := 0
workerCount := 0
for _, node := range cluster.Nodes {
suffix := 0
// node role specific settings
if node.Role == "master" {
// name suffix
suffix = masterCount
masterCount++
} else if node.Role == "worker" {
// name suffix
suffix = workerCount
workerCount++
}
node.Name = fmt.Sprintf("%s-%s-%s-%d", k3d.DefaultObjectNamePrefix, cluster.Name, node.Role, suffix)
// create node
log.Infoln("Creating node", node.Name)
if err := runtime.CreateNode(&node); err != nil {
log.Errorln("...failed")
}
}
log.Debugln("...success")
return nil
}

@ -54,10 +54,10 @@ func CreateNode(node *k3d.Node, runtime k3drt.Runtime) error {
// specify options depending on node role
if node.Role == "worker" { // TODO: check here AND in CLI or only here?
node.Cmd = []string{"agent"}
node.Args = append([]string{"agent"}, node.Args...)
node.Labels["role"] = "worker"
} else if node.Role == "master" {
node.Cmd = []string{"server"}
node.Args = append([]string{"server"}, node.Args...)
node.Labels["role"] = "master"
} else {
return fmt.Errorf("Unknown node role '%s'", node.Role)

@ -44,7 +44,7 @@ func (d Docker) CreateNode(node *k3d.Node) error {
}
containerConfig := container.Config{
Cmd: node.Cmd,
Cmd: node.Args,
Image: node.Image,
Labels: node.Labels,
}

@ -61,7 +61,6 @@ type Node struct {
Image string `yaml:"image" json:"image,omitempty"`
Volumes []string `yaml:"volumes" json:"volumes,omitempty"`
Env []string `yaml:"env" json:"env,omitempty"`
Cmd []string // filled automatically depending on role (master: cmd='server'; worker: cmd='agent')
Args []string `yaml:"extra_args" json:"extraArgs,omitempty"`
Ports []string `yaml:"port_mappings" json:"portMappings,omitempty"` // TODO: make a struct out of this?
Restart bool `yaml:"restart" json:"restart,omitempty"`

Loading…
Cancel
Save