Implement CSI node plugin

This implements a CSI node plugin with registration support
backed by bind mounts from our XFS data partition.
It supports online volume expansion (and technically shrinking,
but K8s does not support shrinking) and CSI statistics backed by fsquota

Test Plan: TBD

X-Origin-Diff: phab/D471
GitOrigin-RevId: 6bc37dac3726b39bd5d71cfddb2d53aeee0c8b4d
diff --git a/core/internal/kubernetes/service.go b/core/internal/kubernetes/service.go
index ae93f4e..f3dc4f7 100644
--- a/core/internal/kubernetes/service.go
+++ b/core/internal/kubernetes/service.go
@@ -30,6 +30,7 @@
 	schema "git.monogon.dev/source/nexantic.git/core/generated/api"
 	"git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/core/internal/consensus"
+	"git.monogon.dev/source/nexantic.git/core/internal/storage"
 	"git.monogon.dev/source/nexantic.git/core/pkg/logbuffer"
 )
 
@@ -41,6 +42,7 @@
 
 type Service struct {
 	consensusService      *consensus.Service
+	storageService        *storage.Manager
 	logger                *zap.Logger
 	apiserverLogs         *logbuffer.LogBuffer
 	controllerManagerLogs *logbuffer.LogBuffer
@@ -48,9 +50,10 @@
 	kubeletLogs           *logbuffer.LogBuffer
 }
 
-func New(logger *zap.Logger, consensusService *consensus.Service) *Service {
+func New(logger *zap.Logger, consensusService *consensus.Service, storageService *storage.Manager) *Service {
 	s := &Service{
 		consensusService:      consensusService,
+		storageService:        storageService,
 		logger:                logger,
 		apiserverLogs:         logbuffer.New(5000, 16384),
 		controllerManagerLogs: logbuffer.New(5000, 16384),
@@ -153,13 +156,15 @@
 		if err := supervisor.Run(ctx, "scheduler", runScheduler(*schedulerConfig, s.schedulerLogs)); err != nil {
 			return err
 		}
-
 		if err := supervisor.Run(ctx, "kubelet", runKubelet(&KubeletSpec{}, s.kubeletLogs)); err != nil {
 			return err
 		}
 		if err := supervisor.Run(ctx, "reconciler", runReconciler(masterKubeconfig)); err != nil {
 			return err
 		}
+		if err := supervisor.Run(ctx, "csi-plugin", runCSIPlugin(s.storageService)); err != nil {
+			return err
+		}
 		supervisor.Signal(ctx, supervisor.SignalHealthy)
 		supervisor.Signal(ctx, supervisor.SignalDone)
 		return nil