Skip to content
This repository was archived by the owner on Apr 3, 2023. It is now read-only.

Commit 7f6dae7

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#58405 from deads2k/kubelet-01-start
Automatic merge from submit-queue (batch tested with PRs 58209, 57561, 58405). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. make the kubelet cobra command complete This pull attempts a move from the cmd/kubelet to the cobra command where it can re-used. /assign @mtaufen /assign @liggitt @ncdc fyi xref: kubernetes#34732 ```release-note NONE ```
2 parents afd01c0 + d113f0f commit 7f6dae7

File tree

4 files changed

+63
-100
lines changed

4 files changed

+63
-100
lines changed

cmd/kubelet/BUILD

-6
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,8 @@ go_library(
2020
importpath = "k8s.io/kubernetes/cmd/kubelet",
2121
deps = [
2222
"//cmd/kubelet/app:go_default_library",
23-
"//cmd/kubelet/app/options:go_default_library",
2423
"//pkg/client/metrics/prometheus:go_default_library",
2524
"//pkg/version/prometheus:go_default_library",
26-
"//pkg/version/verflag:go_default_library",
27-
"//vendor/github.com/golang/glog:go_default_library",
28-
"//vendor/github.com/spf13/pflag:go_default_library",
29-
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
30-
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
3125
"//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library",
3226
],
3327
)

cmd/kubelet/app/BUILD

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ go_library(
9999
"//pkg/util/oom:go_default_library",
100100
"//pkg/util/rlimit:go_default_library",
101101
"//pkg/version:go_default_library",
102+
"//pkg/version/verflag:go_default_library",
102103
"//pkg/volume:go_default_library",
103104
"//pkg/volume/aws_ebs:go_default_library",
104105
"//pkg/volume/azure_dd:go_default_library",
@@ -130,7 +131,6 @@ go_library(
130131
"//pkg/volume/vsphere_volume:go_default_library",
131132
"//vendor/github.com/golang/glog:go_default_library",
132133
"//vendor/github.com/spf13/cobra:go_default_library",
133-
"//vendor/github.com/spf13/pflag:go_default_library",
134134
"//vendor/k8s.io/api/core/v1:go_default_library",
135135
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
136136
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

cmd/kubelet/app/server.go

+58-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434

3535
"github.com/golang/glog"
3636
"github.com/spf13/cobra"
37-
"github.com/spf13/pflag"
3837

3938
"k8s.io/api/core/v1"
4039
"k8s.io/apimachinery/pkg/api/resource"
@@ -87,6 +86,7 @@ import (
8786
"k8s.io/kubernetes/pkg/util/oom"
8887
"k8s.io/kubernetes/pkg/util/rlimit"
8988
"k8s.io/kubernetes/pkg/version"
89+
"k8s.io/kubernetes/pkg/version/verflag"
9090
)
9191

9292
const (
@@ -96,9 +96,13 @@ const (
9696

9797
// NewKubeletCommand creates a *cobra.Command object with default parameters
9898
func NewKubeletCommand() *cobra.Command {
99-
// ignore the error, as this is just for generating docs and the like
100-
s, _ := options.NewKubeletServer()
101-
s.AddFlags(pflag.CommandLine)
99+
kubeletFlags := options.NewKubeletFlags()
100+
kubeletConfiguration, err := options.NewKubeletConfiguration()
101+
// programmer error
102+
if err != nil {
103+
glog.Fatal(err)
104+
}
105+
102106
cmd := &cobra.Command{
103107
Use: componentKubelet,
104108
Long: `The kubelet is the primary "node agent" that runs on each
@@ -121,9 +125,59 @@ is checked every 20 seconds (also configurable with a flag).
121125
HTTP server: The kubelet can also listen for HTTP and respond to a simple API
122126
(underspec'd currently) to submit a new manifest.`,
123127
Run: func(cmd *cobra.Command, args []string) {
128+
// short-circuit on verflag
129+
verflag.PrintAndExitIfRequested()
130+
131+
// TODO(mtaufen): won't need this this once dynamic config is GA
132+
// set feature gates so we can check if dynamic config is enabled
133+
if err := utilfeature.DefaultFeatureGate.SetFromMap(kubeletConfiguration.FeatureGates); err != nil {
134+
glog.Fatal(err)
135+
}
136+
// validate the initial KubeletFlags, to make sure the dynamic-config-related flags aren't used unless the feature gate is on
137+
if err := options.ValidateKubeletFlags(kubeletFlags); err != nil {
138+
glog.Fatal(err)
139+
}
140+
// bootstrap the kubelet config controller, app.BootstrapKubeletConfigController will check
141+
// feature gates and only turn on relevant parts of the controller
142+
kubeletConfig, kubeletConfigController, err := BootstrapKubeletConfigController(
143+
kubeletConfiguration, kubeletFlags.KubeletConfigFile, kubeletFlags.DynamicConfigDir)
144+
if err != nil {
145+
glog.Fatal(err)
146+
}
147+
148+
// construct a KubeletServer from kubeletFlags and kubeletConfig
149+
kubeletServer := &options.KubeletServer{
150+
KubeletFlags: *kubeletFlags,
151+
KubeletConfiguration: *kubeletConfig,
152+
}
153+
154+
// use kubeletServer to construct the default KubeletDeps
155+
kubeletDeps, err := UnsecuredDependencies(kubeletServer)
156+
if err != nil {
157+
glog.Fatal(err)
158+
}
159+
160+
// add the kubelet config controller to kubeletDeps
161+
kubeletDeps.KubeletConfigController = kubeletConfigController
162+
163+
// start the experimental docker shim, if enabled
164+
if kubeletServer.KubeletFlags.ExperimentalDockershim {
165+
if err := RunDockershim(&kubeletServer.KubeletFlags, kubeletConfig); err != nil {
166+
glog.Fatal(err)
167+
}
168+
}
169+
170+
// run the kubelet
171+
if err := Run(kubeletServer, kubeletDeps); err != nil {
172+
glog.Fatal(err)
173+
}
124174
},
125175
}
126176

177+
kubeletFlags.AddFlags(cmd.Flags())
178+
options.AddKubeletConfigFlags(cmd.Flags(), kubeletConfiguration)
179+
options.AddGlobalFlags(cmd.Flags())
180+
127181
return cmd
128182
}
129183

cmd/kubelet/kubelet.go

+4-89
Original file line numberDiff line numberDiff line change
@@ -26,107 +26,22 @@ import (
2626
"os"
2727
"time"
2828

29-
"github.com/golang/glog"
30-
"github.com/spf13/pflag"
31-
32-
utilfeature "k8s.io/apiserver/pkg/util/feature"
33-
"k8s.io/apiserver/pkg/util/flag"
3429
"k8s.io/apiserver/pkg/util/logs"
3530
"k8s.io/kubernetes/cmd/kubelet/app"
36-
"k8s.io/kubernetes/cmd/kubelet/app/options"
3731
_ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration
3832
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
39-
"k8s.io/kubernetes/pkg/version/verflag"
4033
)
4134

42-
func parseFlagSet(fs *pflag.FlagSet, args []string) error {
43-
if err := fs.Parse(args); err != nil {
44-
return err
45-
}
46-
fs.VisitAll(func(flag *pflag.Flag) {
47-
glog.V(2).Infof("FLAG: --%s=%q", flag.Name, flag.Value)
48-
})
49-
return nil
50-
}
51-
52-
func die(err error) {
53-
fmt.Fprintf(os.Stderr, "error: %v\n", err)
54-
os.Exit(1)
55-
}
56-
5735
func main() {
5836
rand.Seed(time.Now().UTC().UnixNano())
5937

60-
fs := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
61-
// set the normalize func, similar to k8s.io/apiserver/pkg/util/flag/flags.go:InitFlags
62-
fs.SetNormalizeFunc(flag.WordSepNormalizeFunc)
63-
// explicitly add flags from libs that register global flags
64-
options.AddGlobalFlags(fs)
38+
command := app.NewKubeletCommand()
6539

66-
// register kubelet flags
67-
kubeletFlags := options.NewKubeletFlags()
68-
kubeletFlags.AddFlags(fs)
69-
70-
// register kubelet config flags
71-
defaultConfig, err := options.NewKubeletConfiguration()
72-
if err != nil {
73-
die(err)
74-
}
75-
options.AddKubeletConfigFlags(fs, defaultConfig)
76-
77-
// parse flags
78-
if err := parseFlagSet(fs, os.Args[1:]); err != nil {
79-
die(err)
80-
}
81-
82-
// initialize logging and defer flush
8340
logs.InitLogs()
8441
defer logs.FlushLogs()
8542

86-
// short-circuit on verflag
87-
verflag.PrintAndExitIfRequested()
88-
89-
// TODO(mtaufen): won't need this this once dynamic config is GA
90-
// set feature gates so we can check if dynamic config is enabled
91-
if err := utilfeature.DefaultFeatureGate.SetFromMap(defaultConfig.FeatureGates); err != nil {
92-
die(err)
93-
}
94-
// validate the initial KubeletFlags, to make sure the dynamic-config-related flags aren't used unless the feature gate is on
95-
if err := options.ValidateKubeletFlags(kubeletFlags); err != nil {
96-
die(err)
97-
}
98-
// bootstrap the kubelet config controller, app.BootstrapKubeletConfigController will check
99-
// feature gates and only turn on relevant parts of the controller
100-
kubeletConfig, kubeletConfigController, err := app.BootstrapKubeletConfigController(
101-
defaultConfig, kubeletFlags.KubeletConfigFile, kubeletFlags.DynamicConfigDir)
102-
if err != nil {
103-
die(err)
104-
}
105-
106-
// construct a KubeletServer from kubeletFlags and kubeletConfig
107-
kubeletServer := &options.KubeletServer{
108-
KubeletFlags: *kubeletFlags,
109-
KubeletConfiguration: *kubeletConfig,
110-
}
111-
112-
// use kubeletServer to construct the default KubeletDeps
113-
kubeletDeps, err := app.UnsecuredDependencies(kubeletServer)
114-
if err != nil {
115-
die(err)
116-
}
117-
118-
// add the kubelet config controller to kubeletDeps
119-
kubeletDeps.KubeletConfigController = kubeletConfigController
120-
121-
// start the experimental docker shim, if enabled
122-
if kubeletFlags.ExperimentalDockershim {
123-
if err := app.RunDockershim(kubeletFlags, kubeletConfig); err != nil {
124-
die(err)
125-
}
126-
}
127-
128-
// run the kubelet
129-
if err := app.Run(kubeletServer, kubeletDeps); err != nil {
130-
die(err)
43+
if err := command.Execute(); err != nil {
44+
fmt.Fprintf(os.Stderr, "%v\n", err)
45+
os.Exit(1)
13146
}
13247
}

0 commit comments

Comments
 (0)