Skip to content

Split multicluster Helm charts: separate common install and link controller into linkerd-multicluster-controller #14385

@kahirokunn

Description

@kahirokunn

What problem are you trying to solve?

The current linkerd-multicluster chart is intended to be reusable across clusters, but the controller section in values must be customized per cluster. This couples cluster-specific controller config with common components, making Argo CD diffs noisy, parameter management cumbersome, and IdP integrations (e.g., Backstage) harder when ownership boundaries are mixed.

How should the problem be solved?

Create a dedicated Helm chart, linkerd-multicluster-controller, by copying the controller templates currently under linkerd-multicluster/templates/controller/*. Keep common/link resources in linkerd-multicluster.

  • Backward compatibility: Template duplication is intentional to maintain compatibility. We will release with both charts/templates coexisting so current users aren’t forced to migrate immediately.

  • Migration plan: After a sufficient transition period, eliminate double maintenance by either:

    1. Removing controller templates from linkerd-multicluster, or
    2. Merging (linkerd-multicluster-controller templates into linkerd-multicluster via a unification mechanism, e.g., library chart or build/post-render merge), to establish a single source of truth.
  • No functional changes to templates; the split only improves operability and ownership boundaries.

Any alternatives you've considered?

  • Single chart with per-cluster values files or Helmfile/Kustomize overlays (doesn’t improve Argo CD diff clarity; still mixes concerns).
  • Immediate refactor to a shared library chart without a compatibility window (too disruptive).
  • Post-render scripting to manipulate manifests (adds tooling complexity and brittleness).

How would users interact with this feature?

Example workflow:

# Deploy common multicluster components (shared across clusters)
helm upgrade --install linkerd-multicluster ./charts/linkerd-multicluster -n linkerd-multicluster

# Deploy per-cluster controller with cluster-specific values
helm upgrade --install linkerd-multicluster-controller ./charts/linkerd-multicluster-controller \
  -n linkerd-multicluster -f values/controller-$CLUSTER.yaml

In Argo CD, manage them as two Applications for clearer diffs and ownership. Backstage/IdP can map ownership to each chart independently.

Minimal usage example (after “Link the clusters”)

  1. Link the clusters (follow Step 2: Link the clusters):
linkerd --context=east multicluster link-gen --cluster-name east \
  | kubectl --context=west apply -f -
  1. Immediately install the per-cluster controller on the receiving cluster:
# minimal values for the controller that mirrors 'east'
cat > values-controller-east.yaml <<'EOF'
controllers:
  - link:
      ref:
        name: east
EOF

helm upgrade --install linkerd-multicluster-controller ./charts/linkerd-multicluster-controller \
  -n linkerd-multicluster --create-namespace \
  --kube-context west \
  -f values-controller-east.yaml
  1. Verify (per the same guide):
linkerd multicluster check

Reference: Installing Multi-cluster Components (Linkerd 2.18)

Would you like to work on this feature?

yes

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions