Skip to content

Commit

Permalink
Random pool node suffixes (#9)
Browse files Browse the repository at this point in the history
Also only place controlplanes in a placement group.
  • Loading branch information
choffmeister authored May 8, 2023
1 parent 993d8fe commit 1a9364c
Show file tree
Hide file tree
Showing 10 changed files with 23 additions and 52 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
This CLI tool provides an easy way to manage [Talos](https://talos.dev/) powered [Kubernetes](https://kubernetes.io/) clusters on the [Hetzner Cloud](https://www.hetzner.com/cloud). Bootstrapping a new cluster performs the following steps:

* Create private network `10.0.0.0/16` for inter-node communication
* Create placement group to ensure nodes to not run on the same physical machine
* Create placement group to ensure controlplane nodes to not run on the same physical machine
* Create load balancer to access the controlplane nodes Kubernetes API server (port `6443`) or Talos API server (port `50000`)
* Create firewall rules to block access to nodes from outside of the private network
* Create first controlplane node
Expand All @@ -21,9 +21,9 @@ cd my-cluster

export HCLOUD_TOKEN=...
# bootstrap cluster
hcloud-talos -v bootstrap-cluster --talos-version=1.2.9 --kubernetes-version=1.25.5 my-cluster controlplane-1
hcloud-talos -v bootstrap-cluster --talos-version=1.2.9 --kubernetes-version=1.25.5 my-cluster controlplane-%id%

# add more nodes
hcloud-talos -v add-node --talos-version=1.2.9 controlplane-2 --controlplane
hcloud-talos -v add-node --talos-version=1.2.9 worker-1
hcloud-talos -v add-node --talos-version=1.2.9 controlplane-%id% --controlplane
hcloud-talos -v add-node --talos-version=1.2.9 worker-%id%
```
3 changes: 0 additions & 3 deletions cmd/reconcile_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ var (
reconcilePoolCmdServerType string
reconcilePoolCmdNodeNamePrefix string
reconcilePoolCmdNodeCount int
reconcilePoolCmdForce bool
reconcilePoolCmdTalosVersion string
reconcilePoolCmd = &cobra.Command{
Use: "reconcile-pool [pool-name]",
Expand All @@ -24,7 +23,6 @@ var (
NodeNamePrefix: reconcilePoolCmdNodeNamePrefix,
NodeCount: reconcilePoolCmdNodeCount,
ServerType: reconcilePoolCmdServerType,
Force: reconcilePoolCmdForce,
PoolName: args[0],
TalosVersion: reconcilePoolCmdTalosVersion,
})
Expand All @@ -35,7 +33,6 @@ var (

func init() {
reconcilePoolCmd.Flags().StringVarP(&reconcilePoolCmdConfigFile, "config", "c", defaultConfigFile, "")
reconcilePoolCmd.Flags().BoolVar(&reconcilePoolCmdForce, "force", false, "")
reconcilePoolCmd.Flags().StringVar(&reconcilePoolCmdServerType, "server-type", "cx21", "")
reconcilePoolCmd.Flags().StringVar(&reconcilePoolCmdNodeNamePrefix, "node-name-prefix", "worker", "")
reconcilePoolCmd.Flags().IntVar(&reconcilePoolCmdNodeCount, "node-count", 1, "")
Expand Down
2 changes: 1 addition & 1 deletion e2etests/01_bootstrap_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ func TestBootstrapCluster(t *testing.T) {
ConfigFile: configFile,
ClusterName: clusterName,
ServerType: "cx21",
NodeName: "controlplane-1",
NodeName: "controlplane-%id%",
Location: "nbg1",
NetworkZone: "eu-central",
Token: hcloudToken,
Expand Down
2 changes: 1 addition & 1 deletion e2etests/02_add_node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ func TestAddNode(t *testing.T) {
_, err := internal.AddNode(&logger, clusterDir, internal.AddNodeOpts{
ConfigFile: configFile,
ServerType: "cx21",
NodeName: "worker-1",
NodeName: "worker",
TalosVersion: talosVersion,
})
assert.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion e2etests/04_delete_node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
func TestDeleteNode(t *testing.T) {
err := internal.DeleteNode(&logger, clusterDir, internal.DeleteNodeOpts{
ConfigFile: configFile,
NodeName: "worker-1",
NodeName: "worker",
Force: true,
})
assert.NoError(t, err)
Expand Down
10 changes: 7 additions & 3 deletions internal/add_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,13 @@ func AddNode(logger *utils.Logger, dir string, opts AddNodeOpts) (*hcloud.Server
return nil, err
}

placementGroup, err := clients.HcloudEnsurePlacementGroup(cl, nodePlacementGroupTemplate(cl), false)
if err != nil {
return nil, err
var placementGroup *hcloud.PlacementGroup
if opts.Controlplane {
controlplanePlacementGroup, err := clients.HcloudEnsurePlacementGroup(cl, controlplanePlacementGroupTemplate(cl), false)
if err != nil {
return nil, err
}
placementGroup = controlplanePlacementGroup
}

var nodeTemplate clients.HcloudServerCreateFromImageOpts
Expand Down
4 changes: 2 additions & 2 deletions internal/bootstrap_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func BootstrapCluster(logger *utils.Logger, dir string, opts BootstrapClusterOpt
return err
}

placementGroup, err := clients.HcloudEnsurePlacementGroup(cl, nodePlacementGroupTemplate(cl), true)
controlplanePlacementGroup, err := clients.HcloudEnsurePlacementGroup(cl, controlplanePlacementGroupTemplate(cl), true)
if err != nil {
return err
}
Expand All @@ -91,7 +91,7 @@ func BootstrapCluster(logger *utils.Logger, dir string, opts BootstrapClusterOpt
if err != nil {
return err
}
controlplaneServer, err := clients.HcloudCreateServerFromImage(cl, network, placementGroup, controlplaneNodeTemplate)
controlplaneServer, err := clients.HcloudCreateServerFromImage(cl, network, controlplanePlacementGroup, controlplaneNodeTemplate)
if err != nil {
return err
}
Expand Down
34 changes: 1 addition & 33 deletions internal/reconcile_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package internal

import (
"fmt"
"strings"

"github.com/airfocusio/hcloud-talos/internal/cluster"
"github.com/airfocusio/hcloud-talos/internal/utils"
Expand All @@ -15,7 +14,6 @@ type ReconcilePoolOpts struct {
NodeNamePrefix string
NodeCount int
ServerType string
Force bool
TalosVersion string
}

Expand Down Expand Up @@ -51,10 +49,7 @@ func ReconcilePool(logger *utils.Logger, dir string, opts ReconcilePoolOpts) err

nodeCountDiff := len(poolServers) - opts.NodeCount
if nodeCountDiff < 0 {
nodeName, err := findNextNodeName(cl, opts.NodeNamePrefix, poolServers)
if err != nil {
return err
}
nodeName := opts.NodeNamePrefix + "-%id%"
_, err = AddNode(logger, cl.Dir, AddNodeOpts{
ConfigFile: opts.ConfigFile,
ServerType: opts.ServerType,
Expand All @@ -65,16 +60,6 @@ func ReconcilePool(logger *utils.Logger, dir string, opts ReconcilePoolOpts) err
if err != nil {
return err
}
} else if nodeCountDiff > 0 {
server := poolServers[len(poolServers)-1]
err := DeleteNode(logger, cl.Dir, DeleteNodeOpts{
ConfigFile: opts.ConfigFile,
NodeName: strings.TrimPrefix(server.Name, cl.Config.ClusterName+"-"),
Force: opts.Force,
})
if err != nil {
return err
}
} else {
logger.Debug.Printf("Pool %s/%s already has %d of %d nodes\n", cl.Config.ClusterName, opts.PoolName, len(poolServers), opts.NodeCount)
break
Expand All @@ -83,20 +68,3 @@ func ReconcilePool(logger *utils.Logger, dir string, opts ReconcilePoolOpts) err

return nil
}

func findNextNodeName(cl *cluster.Cluster, nodeNamePrefix string, poolServers []*hcloud.Server) (string, error) {
for i := 1; i <= 1000; i++ {
exists := false
proposedNodeName := fmt.Sprintf("%s-%d", nodeNamePrefix, i)
for _, server := range poolServers {
if server.Name == nodeName(cl, proposedNodeName) {
exists = true
break
}
}
if !exists {
return proposedNodeName, nil
}
}
return "", fmt.Errorf("unable to find next node name")
}
8 changes: 5 additions & 3 deletions internal/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import (
"io/ioutil"
"net"
"path"
"strings"

"github.com/airfocusio/hcloud-talos/internal/clients"
"github.com/airfocusio/hcloud-talos/internal/cluster"
"github.com/airfocusio/hcloud-talos/internal/utils"
"github.com/hetznercloud/hcloud-go/hcloud"
)

Expand Down Expand Up @@ -34,9 +36,9 @@ func nodeNetworkTemplate(cl *cluster.Cluster) hcloud.NetworkCreateOpts {
}
}

func nodePlacementGroupTemplate(cl *cluster.Cluster) hcloud.PlacementGroupCreateOpts {
func controlplanePlacementGroupTemplate(cl *cluster.Cluster) hcloud.PlacementGroupCreateOpts {
return hcloud.PlacementGroupCreateOpts{
Name: cl.Config.ClusterName + "-nodes",
Name: cl.Config.ClusterName + "-controlplanes",
Type: hcloud.PlacementGroupTypeSpread,
Labels: map[string]string{clusterLabel: cl.Config.ClusterName},
}
Expand Down Expand Up @@ -124,7 +126,7 @@ func nodeFirewallTemplate(cl *cluster.Cluster, network *hcloud.Network) hcloud.F
}

func nodeName(cl *cluster.Cluster, name string) string {
return cl.Config.ClusterName + "-" + name
return cl.Config.ClusterName + "-" + strings.Replace(name, "%id%", utils.RandString(6), 1)
}

func controlplaneNodeTemplate(cl *cluster.Cluster, serverType string, name string, talosVersion string) (clients.HcloudServerCreateFromImageOpts, error) {
Expand Down
2 changes: 1 addition & 1 deletion internal/utils/rand.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
)

var randStringInitialized = false
var randStringRunes = []rune("0123456789abcdef")
var randStringRunes = []rune("0123456789abcdefghijklmnopqrstuvwxyz")

func RandString(n int) string {
if !randStringInitialized {
Expand Down

0 comments on commit 1a9364c

Please sign in to comment.