m/n/kubernetes: use node clusternet to submit cluster networking routes

This completes the work on using the new cluster networking service from
Kubernetes, thereby allowing non-worker nodes to participate in cluster
networking.

Change-Id: I7f3759186d7c8cc49833be29963f82a1714d293e
Reviewed-on: https://review.monogon.dev/c/monogon/+/1418
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/core/roleserve/roleserve.go b/metropolis/node/core/roleserve/roleserve.go
index a1969bf..86b5b5a 100644
--- a/metropolis/node/core/roleserve/roleserve.go
+++ b/metropolis/node/core/roleserve/roleserve.go
@@ -44,6 +44,7 @@
 	"crypto/ed25519"
 
 	common "source.monogon.dev/metropolis/node"
+	"source.monogon.dev/metropolis/node/core/clusternet"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
@@ -83,6 +84,7 @@
 	KubernetesStatus  memory.Value[*KubernetesStatus]
 	bootstrapData     memory.Value[*bootstrapData]
 	localRoles        memory.Value[*cpb.NodeRoles]
+	podNetwork        memory.Value[*clusternet.Prefixes]
 
 	controlPlane *workerControlPlane
 	statusPush   *workerStatusPush
@@ -90,6 +92,7 @@
 	kubernetes   *workerKubernetes
 	rolefetch    *workerRoleFetch
 	nodeMgmt     *workerNodeMgmt
+	clusternet   *workerClusternet
 }
 
 // New creates a Role Server services from a Config.
@@ -126,6 +129,7 @@
 		clusterMembership: &s.ClusterMembership,
 
 		kubernetesStatus: &s.KubernetesStatus,
+		podNetwork:       &s.podNetwork,
 	}
 
 	s.rolefetch = &workerRoleFetch{
@@ -138,6 +142,12 @@
 		clusterMembership: &s.ClusterMembership,
 		logTree:           s.LogTree,
 	}
+	s.clusternet = &workerClusternet{
+		storageRoot: s.StorageRoot,
+
+		clusterMembership: &s.ClusterMembership,
+		podNetwork:        &s.podNetwork,
+	}
 
 	return s
 }
@@ -198,6 +208,7 @@
 	supervisor.Run(ctx, "heartbeat", s.heartbeat.run)
 	supervisor.Run(ctx, "rolefetch", s.rolefetch.run)
 	supervisor.Run(ctx, "nodemgmt", s.nodeMgmt.run)
+	supervisor.Run(ctx, "clusternet", s.clusternet.run)
 	supervisor.Signal(ctx, supervisor.SignalHealthy)
 
 	<-ctx.Done()