blob: 5c76acf90f2c7a04eeb6cf269316f75854ff145f [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 (
Lorenz Brun732a8842024-08-26 23:25:37 +020018 "fmt"
Lorenz Brun04904962019-11-11 15:21:14 +010019 "os"
Lorenz Brun04904962019-11-11 15:21:14 +010020
21 "github.com/spf13/cobra"
Lorenz Brun732a8842024-08-26 23:25:37 +020022 "k8s.io/component-base/cli"
Lorenz Brun5d7d2a42020-04-06 14:11:02 +020023 _ "k8s.io/component-base/metrics/prometheus/restclient" // for client metric registration
24 _ "k8s.io/component-base/metrics/prometheus/version" // for version metric registration
Lorenz Brun04904962019-11-11 15:21:14 +010025 kubeapiserver "k8s.io/kubernetes/cmd/kube-apiserver/app"
26 kubecontrollermanager "k8s.io/kubernetes/cmd/kube-controller-manager/app"
27 kubescheduler "k8s.io/kubernetes/cmd/kube-scheduler/app"
Lorenz Brun878f5f92020-05-12 16:15:39 +020028 kubelet "k8s.io/kubernetes/cmd/kubelet/app"
Lorenz Brun04904962019-11-11 15:21:14 +010029)
30
Lorenz Brun732a8842024-08-26 23:25:37 +020031// Map of subcommand to Cobra command generator for all subcommands
32var subcommands = map[string]func() *cobra.Command{
33 "kube-apiserver": kubeapiserver.NewAPIServerCommand,
34 "kube-controller-manager": kubecontrollermanager.NewControllerManagerCommand,
35 "kube-scheduler": func() *cobra.Command { return kubescheduler.NewSchedulerCommand() },
36 "kubelet": kubelet.NewKubeletCommand,
37}
38
Lorenz Brun04904962019-11-11 15:21:14 +010039func main() {
Lorenz Brun732a8842024-08-26 23:25:37 +020040 if len(os.Args) < 2 || subcommands[os.Args[1]] == nil {
41 fmt.Fprintf(os.Stderr, "Unknown subcommand\n")
42 } else {
43 cmdGen := subcommands[os.Args[1]]
44 cmd := cmdGen()
45 // Strip first argument as it has already been consumed
46 cmd.SetArgs(os.Args[2:])
47 os.Exit(cli.Run(cmd))
Lorenz Brun04904962019-11-11 15:21:14 +010048 }
49}