metropolis/node/kubernetes: synchronize metropolis node labels to kubernetes

This extends the labelmaker to manage Kubernetes node labels mirrored
from Metropolis node labels.

Note that currently there is no way to edit a ClusterConfiguration at
cluster runtime, but this will come in a future CL.

Change-Id: If7dbc3796085a8b85c1b5b2a181bcb1cee3d1db4
Reviewed-on: https://review.monogon.dev/c/monogon/+/3469
Reviewed-by: Jan Schär <jan@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/core/roleserve/BUILD.bazel b/metropolis/node/core/roleserve/BUILD.bazel
index 7f3f0d3..f5e140a 100644
--- a/metropolis/node/core/roleserve/BUILD.bazel
+++ b/metropolis/node/core/roleserve/BUILD.bazel
@@ -36,6 +36,7 @@
         "//metropolis/node/kubernetes",
         "//metropolis/node/kubernetes/containerd",
         "//metropolis/node/kubernetes/pki",
+        "//metropolis/proto/api",
         "//metropolis/proto/common",
         "//metropolis/version",
         "//osbase/event",
diff --git a/metropolis/node/core/roleserve/worker_kubernetes.go b/metropolis/node/core/roleserve/worker_kubernetes.go
index 898b60e..cfab7cb 100644
--- a/metropolis/node/core/roleserve/worker_kubernetes.go
+++ b/metropolis/node/core/roleserve/worker_kubernetes.go
@@ -6,18 +6,20 @@
 	"net"
 
 	"source.monogon.dev/metropolis/node/core/clusternet"
-	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/kubernetes"
 	"source.monogon.dev/metropolis/node/kubernetes/containerd"
 	kpki "source.monogon.dev/metropolis/node/kubernetes/pki"
-	cpb "source.monogon.dev/metropolis/proto/common"
 	"source.monogon.dev/osbase/event"
 	"source.monogon.dev/osbase/event/memory"
 	"source.monogon.dev/osbase/net/dns"
 	"source.monogon.dev/osbase/supervisor"
+
+	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
+	apb "source.monogon.dev/metropolis/proto/api"
+	cpb "source.monogon.dev/metropolis/proto/common"
 )
 
 // workerKubernetes is the Kubernetes Worker, responsible for launching
@@ -42,10 +44,11 @@
 // reduced) datum for the main Kubernetes launcher responsible for starting the
 // service, if at all.
 type kubernetesStartup struct {
-	roles   *cpb.NodeRoles
-	lcp     *localControlPlane
-	curator ipb.CuratorClient
-	node    *identity.NodeCredentials
+	roles      *cpb.NodeRoles
+	lcp        *localControlPlane
+	curator    ipb.CuratorClient
+	management apb.ManagementClient
+	node       *identity.NodeCredentials
 }
 
 // changed informs the Kubernetes launcher whether two different
@@ -95,10 +98,11 @@
 				}
 				if lr != nil && cc != nil {
 					startupV.Set(&kubernetesStartup{
-						roles:   lr,
-						lcp:     lcp,
-						node:    cc.Credentials,
-						curator: ipb.NewCuratorClient(cc.conn),
+						roles:      lr,
+						lcp:        lcp,
+						node:       cc.Credentials,
+						curator:    ipb.NewCuratorClient(cc.conn),
+						management: apb.NewManagementClient(cc.conn),
 					})
 				}
 			}
@@ -163,6 +167,7 @@
 			Consensus:      d.lcp.consensus,
 			Network:        s.network,
 			Curator:        d.curator,
+			Management:     d.management,
 		})
 		// Start Kubernetes.
 		if err := supervisor.Run(ctx, "run", controller.Run); err != nil {