From de58631b7e2ece4bf8d602a639aeb6826308c2d6 Mon Sep 17 00:00:00 2001 From: Nikita Aboltin Date: Mon, 28 Sep 2026 14:48:48 +0300 Subject: [PATCH] fix: disable metrics for per-WorkspaceType multicluster managers Every WorkspaceType gets its own multicluster manager inside this process, but the manager options leave Metrics unset, so controller-runtime falls back to its default ":8080" for each of them. The first manager claims that port and every subsequent one fails to start: Failed to run multicluster manager ctrlkey=root:account error=failed to start metrics server: failed to create listener: listen tcp :8080: bind: address already in use The affected WorkspaceType is then never initialized (its InitTargets are ignored) until the pod happens to restart with that target already known. Only the main manager serves metrics (--metrics-address, 127.0.0.1:8085 by default), and metrics of the per-WorkspaceType managers are not exposed anywhere anyway, so disable the metrics server for them. Fixes #26 Signed-off-by: Nikita Aboltin --- internal/controller/targetcontroller/controller.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/controller/targetcontroller/controller.go b/internal/controller/targetcontroller/controller.go index e3598f3..f9a69bd 100644 --- a/internal/controller/targetcontroller/controller.go +++ b/internal/controller/targetcontroller/controller.go @@ -42,6 +42,7 @@ import ( ctrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/manager" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/reconcile" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" ) @@ -266,6 +267,12 @@ func (r *Reconciler) createMulticlusterManager(wst *kcptenancyv1alpha1.Workspace mgr, err := mcmanager.New(wstConfig, provider, manager.Options{ Scheme: scheme, + + // Every WorkspaceType gets its own multicluster manager in this process, but + // controller-runtime's metrics server defaults to ":8080", so the second manager + // fails to come up with "listen tcp :8080: bind: address already in use" and its + // WorkspaceType is never initialized. Only the main manager needs to serve metrics. + Metrics: metricsserver.Options{BindAddress: "0"}, }) if err != nil { return nil, fmt.Errorf("failed to create manager: %w", err)