From 5f3fffc8045cf9c21b577c946284127d0138144f Mon Sep 17 00:00:00 2001
From: kaiyou <dev@kaiyou.fr>
Date: Sun, 23 Apr 2023 20:22:03 +0200
Subject: [PATCH] First incomplete try at removing CM dependency on cmd/

---
 services/cm.go | 74 ++++++++++++++++++++++++++------------------------
 1 file changed, 38 insertions(+), 36 deletions(-)

diff --git a/services/cm.go b/services/cm.go
index 618d232..ed89323 100644
--- a/services/cm.go
+++ b/services/cm.go
@@ -3,54 +3,56 @@ package services
 import (
 	"context"
 	"fmt"
+	"net"
 
-	"go.acides.org/hepto/utils"
-	"k8s.io/client-go/rest"
-	"k8s.io/kubernetes/cmd/kube-controller-manager/app"
-	"k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
+	"k8s.io/apiserver/pkg/util/feature"
+	"k8s.io/cloud-provider/controllers/service"
+	"k8s.io/component-base/metrics/prometheus/controllers"
+	"k8s.io/kubernetes/pkg/controller/nodeipam"
+	"k8s.io/kubernetes/pkg/controller/nodeipam/ipam"
 )
 
 var kubeControllerManager = &Unit{
 	Name:         "kube-controller-manager",
 	Dependencies: []*Unit{kubeApiserver, pkiCA, pkiMaster, kubeLogger},
-	Run: func(u *Unit, c *Cluster, ctx context.Context) error {
-		cmConfig := KubeConfig{
-			URL:        fmt.Sprintf("https://[%s]:6443", c.networking.NodeAddress.IP.String()),
-			CACert:     c.pki.TLS.CertPath(),
-			ClientCert: c.masterCerts.ControllersAPI.CertPath(),
-			ClientKey:  c.masterCerts.ControllersAPI.KeyPath(),
-		}
-		cmConfigPath := "/controller-manager.yaml"
-		err := utils.WriteConfig(cmConfig, cmConfigPath)
-		if err != nil {
-			return err
-		}
-		args := []string{
-			"--kubeconfig", cmConfigPath,
-			"--tls-cert-file", c.masterCerts.ControllersTLS.CertPath(),
-			"--tls-private-key-file", c.masterCerts.ControllersTLS.KeyPath(),
-			"--service-account-private-key-file", c.masterCerts.APITokens.KeyPath(),
-			"--root-ca-file", c.pki.TLS.CertPath(),
-			// This is better than no declared cloud provider, since it does disable
-			// unnecessary cloud controllers
-			"--cloud-provider", "external",
-			"--use-service-account-credentials",
-		}
-		s, err := options.NewKubeControllerManagerOptions()
+	Start: func(u *Unit, c *Cluster, ctx context.Context) error {
+		clients, err := newClients(c, c.networking.NodeAddress.IP, c.masterCerts.SchedulerAPI)
 		if err != nil {
 			return err
 		}
-		nfs := s.Flags(app.KnownControllers(), app.ControllersDisabledByDefault.List())
-		flags := flagsFromNamedFlagSet("cm", &nfs)
-		err = flags.Parse(args)
+		metrics := controllers.NewControllerManagerMetrics("controller-manager")
+
+		// Services
+		serviceController, err := service.New(
+			nil, // Cloud
+			clients.Client,
+			clients.Informer.Core().V1().Services(),
+			clients.Informer.Core().V1().Nodes(),
+			c.settings.Name,
+			feature.DefaultFeatureGate,
+		)
 		if err != nil {
-			return err
+			return fmt.Errorf("could not initialize service controller: %w", err)
 		}
-		rest.SetDefaultWarningHandler(rest.NoWarnings{})
-		config, err := s.Config(app.KnownControllers(), app.ControllersDisabledByDefault.List())
+		go serviceController.Run(ctx, 1, metrics)
+
+		// Node ipam
+		nodeIpamController, err := nodeipam.NewNodeIpamController(
+			clients.Informer.Core().V1().Nodes(),
+			clients.Informer.Networking().V1alpha1().ClusterCIDRs(),
+			nil, // Cloud
+			clients.Client,
+			[]*net.IPNet{c.networking.PodNet},
+			c.networking.ServiceNet,
+			nil,       // Secondary CIDR
+			[]int{64}, // Per node prefix for pods, this is the default
+			ipam.RangeAllocatorType,
+		)
 		if err != nil {
-			return err
+			return fmt.Errorf("could not initialize node ipam: %w", err)
 		}
-		return app.Run(config.Complete(), ctx.Done())
+		go nodeIpamController.RunWithMetrics(ctx.Done(), metrics)
+
+		return nil
 	},
 }
-- 
GitLab