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