blob: 3807d0f5fee11a31a8e3054ae8610c10a39b818d [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
Lorenz Brun04904962019-11-11 15:21:14 +01002// SPDX-License-Identifier: Apache-2.0
Lorenz Brun04904962019-11-11 15:21:14 +01003
Lorenz Brun732a8842024-08-26 23:25:37 +02004// This is the entry point for our multicall Kubernetes binary. It can act as
5// any of the Kubernetes components we use depending on its first argument.
6// This saves us a bunch of duplicated code and thus system partition size as
7// a large amount of library code is shared between all of the Kubernetes
8// components.
9//
10// As this is not intended by the K8s developers the Cobra setup is unusual
11// in that even the command structs are only created on-demand and not
12// registered with AddCommand. This is done as Kubernetes performs one-off
13// global setup inside their NewXYZCommand functions, for example for signal
14// handling and their global registries.
Lorenz Brun04904962019-11-11 15:21:14 +010015package main
16
17import (
Tim Windelschmidtddbb9682025-10-06 21:58:26 +020018 "context"
Lorenz Brun732a8842024-08-26 23:25:37 +020019 "fmt"
Lorenz Brun04904962019-11-11 15:21:14 +010020 "os"
Lorenz Brun04904962019-11-11 15:21:14 +010021
22 "github.com/spf13/cobra"
Lorenz Brun732a8842024-08-26 23:25:37 +020023 "k8s.io/component-base/cli"
Lorenz Brun5d7d2a42020-04-06 14:11:02 +020024 _ "k8s.io/component-base/metrics/prometheus/restclient" // for client metric registration
25 _ "k8s.io/component-base/metrics/prometheus/version" // for version metric registration
Lorenz Brun04904962019-11-11 15:21:14 +010026 kubeapiserver "k8s.io/kubernetes/cmd/kube-apiserver/app"
27 kubecontrollermanager "k8s.io/kubernetes/cmd/kube-controller-manager/app"
28 kubescheduler "k8s.io/kubernetes/cmd/kube-scheduler/app"
Lorenz Brun878f5f92020-05-12 16:15:39 +020029 kubelet "k8s.io/kubernetes/cmd/kubelet/app"
Lorenz Brun04904962019-11-11 15:21:14 +010030)
31
Lorenz Brun732a8842024-08-26 23:25:37 +020032// Map of subcommand to Cobra command generator for all subcommands
33var subcommands = map[string]func() *cobra.Command{
34 "kube-apiserver": kubeapiserver.NewAPIServerCommand,
35 "kube-controller-manager": kubecontrollermanager.NewControllerManagerCommand,
36 "kube-scheduler": func() *cobra.Command { return kubescheduler.NewSchedulerCommand() },
Tim Windelschmidtddbb9682025-10-06 21:58:26 +020037 "kubelet": func() *cobra.Command { return kubelet.NewKubeletCommand(context.Background()) },
Lorenz Brun732a8842024-08-26 23:25:37 +020038}
39
Lorenz Brun04904962019-11-11 15:21:14 +010040func main() {
Lorenz Brun732a8842024-08-26 23:25:37 +020041 if len(os.Args) < 2 || subcommands[os.Args[1]] == nil {
42 fmt.Fprintf(os.Stderr, "Unknown subcommand\n")
43 } else {
44 cmdGen := subcommands[os.Args[1]]
45 cmd := cmdGen()
46 // Strip first argument as it has already been consumed
47 cmd.SetArgs(os.Args[2:])
48 os.Exit(cli.Run(cmd))
Lorenz Brun04904962019-11-11 15:21:14 +010049 }
50}