Skip to content

[feature]: Add --load-balancer flag to ksail cluster init|create #1714

@devantler

Description

@devantler

User Story

As a KSail user,
I want a --load-balancer flag for ksail cluster init and ksail cluster create commands,
So that I can control LoadBalancer service support based on my distribution × provider combination (e.g., Cloud Provider KIND for Vanilla × Docker, hcloud-cloud-controller-manager for Talos × Hetzner).

Acceptance Criteria

Enum and Configuration

  • Add LoadBalancer enum to pkg/apis/cluster/v1alpha1/enums.go with values:
    • Default - Rely on distribution × provider defaults (e.g., Talos × Hetzner gets hcloud-cloud-controller-manager automatically)
    • Enabled - Enable the most native LoadBalancer controller for the combination
    • Disabled - Disable any default LoadBalancer controller
  • Add LoadBalancer LoadBalancer field to ClusterSpec in pkg/apis/cluster/v1alpha1/types.go
  • Add distribution method ProvidesLoadBalancerByDefault(provider Provider) bool to determine if a combination includes native LoadBalancer support

CLI Integration

  • Add DefaultLoadBalancerFieldSelector() to pkg/io/config-manager/ksail/field_selector.go
  • Add field selector to InitFieldSelectors() in pkg/cli/cmd/cluster/init.go
  • Add field selector to CreateFieldSelectors() in pkg/cli/cmd/cluster/create.go
  • Flag should support loading order: flags → env (KSAIL_LOAD_BALANCER) → config → default

Scaffolding Integration

  • K3d: Add --disable=servicelb to extraArgs when LoadBalancer == Disabled in scaffolder.go (K3s includes ServiceLB by default)
  • Kind: No default LoadBalancer; document that Enabled installs Cloud Provider KIND
  • Talos × Docker: No default LoadBalancer; Enabled installs MetalLB (L2 mode)
  • Talos × Hetzner: Document that Default or Enabled installs hcloud-cloud-controller-manager

Component Installation

  • Add NeedsLoadBalancer to ComponentRequirements in pkg/cli/setup/post_cni.go
  • Add InstallLoadBalancerSilent() function following the pattern of InstallMetricsServerSilent()
  • Create pkg/svc/installer/cloud-provider-kind/ installer for Vanilla × Docker
  • Create pkg/svc/installer/metallb/ installer for Talos × Docker
  • Create pkg/svc/installer/hcloud-ccm/ installer for Talos × Hetzner (hcloud-cloud-controller-manager)
  • Wire up factory in DefaultInstallerFactories() in pkg/cli/setup/components.go

Documentation

  • Update CLI documentation in docs/configuration/cli-flags/cluster/
  • Document distribution × provider LoadBalancer support matrix

Testing

  • Unit tests for LoadBalancer enum (Set, String, Type, Default, ValidValues)
  • Unit tests for ProvidesLoadBalancerByDefault() method
  • Unit tests for field selector binding
  • Integration tests for scaffolding output with different LoadBalancer settings

Distribution × Provider Support Matrix

Distribution Provider Default Behavior Enabled Behavior
Vanilla Docker No LoadBalancer Cloud Provider KIND
K3s Docker ServiceLB (Klipper) ServiceLB (Klipper)
Talos Docker No LoadBalancer MetalLB (L2 mode)
Talos Hetzner hcloud-cloud-controller-manager hcloud-cloud-controller-manager

Note: Klipper-LB (ServiceLB) could technically work on Talos × Docker since it's just a DaemonSet, but MetalLB is the more common choice for non-K3s distributions due to better documentation and wider support.

Implementation Notes

Relevant Code Patterns

  • Follow the MetricsServer enum pattern with Default/Enabled/Disabled values
  • Use the existing installer factory pattern from pkg/cli/setup/components.go
  • Reference the ProvidesMetricsServerByDefault() method for the distribution method pattern

Key Files to Modify

  1. pkg/apis/cluster/v1alpha1/enums.go - Add LoadBalancer enum
  2. pkg/apis/cluster/v1alpha1/types.go - Add LoadBalancer to ClusterSpec
  3. pkg/io/config-manager/ksail/field_selector.go - Add field selector
  4. pkg/cli/cmd/cluster/init.go - Add to InitFieldSelectors()
  5. pkg/cli/cmd/cluster/create.go - Add to CreateFieldSelectors()
  6. pkg/io/scaffolder/scaffolder.go - Handle in CreateK3dConfig(), buildKindConfig()
  7. pkg/cli/setup/components.go - Add installer factory
  8. pkg/cli/setup/post_cni.go - Add to ComponentRequirements and installation logic
  9. pkg/svc/installer/ - New installer packages

External Dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions