Skip to content

Commit

Permalink
Make logging CLI option statically typed
Browse files Browse the repository at this point in the history
This will reject logging settings for unknown component names and
introduces a deterministic output in the Cobra command's help texts.
Remove the unused kube-proxy component from logging.

Signed-off-by: Tom Wieczorek <[email protected]>
  • Loading branch information
twz123 committed May 6, 2024
1 parent 041fdb3 commit 6e6aef5
Show file tree
Hide file tree
Showing 6 changed files with 221 additions and 89 deletions.
15 changes: 6 additions & 9 deletions cmd/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import (
"github.com/k0sproject/k0s/internal/pkg/dir"
"github.com/k0sproject/k0s/internal/pkg/file"
k0slog "github.com/k0sproject/k0s/internal/pkg/log"
"github.com/k0sproject/k0s/internal/pkg/stringmap"
"github.com/k0sproject/k0s/internal/pkg/sysinfo"
"github.com/k0sproject/k0s/pkg/apis/k0s/v1beta1"
"github.com/k0sproject/k0s/pkg/applier"
Expand Down Expand Up @@ -99,8 +98,6 @@ func NewControllerCmd() *cobra.Command {
return err
}

c.Logging = stringmap.Merge(c.CmdLogLevels, c.DefaultLogLevels)

if err := (&sysinfo.K0sSysinfoSpec{
ControllerRoleEnabled: true,
WorkerRoleEnabled: c.SingleNode || c.EnableWorker,
Expand Down Expand Up @@ -210,7 +207,7 @@ func (c *command) start(ctx context.Context) error {
Config: nodeConfig.Spec.Storage.Etcd,
JoinClient: joinClient,
K0sVars: c.K0sVars,
LogLevel: c.Logging["etcd"],
LogLevel: c.LogLevels.Etcd,
}
default:
return fmt.Errorf("invalid storage type: %s", nodeConfig.Spec.Storage.Type)
Expand Down Expand Up @@ -247,7 +244,7 @@ func (c *command) start(ctx context.Context) error {
if enableKonnectivity {
nodeComponents.Add(ctx, &controller.Konnectivity{
SingleNode: c.SingleNode,
LogLevel: c.Logging[constant.KonnectivityServerComponentName],
LogLevel: c.LogLevels.Konnectivity,
K0sVars: c.K0sVars,
KubeClientFactory: adminClientFactory,
NodeConfig: nodeConfig,
Expand All @@ -259,7 +256,7 @@ func (c *command) start(ctx context.Context) error {
nodeComponents.Add(ctx, &controller.APIServer{
ClusterConfig: nodeConfig,
K0sVars: c.K0sVars,
LogLevel: c.Logging["kube-apiserver"],
LogLevel: c.LogLevels.KubeAPIServer,
Storage: storageBackend,
EnableKonnectivity: enableKonnectivity,
DisableEndpointReconciler: disableEndpointReconciler,
Expand Down Expand Up @@ -499,7 +496,7 @@ func (c *command) start(ctx context.Context) error {
if enableKonnectivity {
clusterComponents.Add(ctx, &controller.KonnectivityAgent{
SingleNode: c.SingleNode,
LogLevel: c.Logging[constant.KonnectivityServerComponentName],
LogLevel: c.LogLevels.Konnectivity,
K0sVars: c.K0sVars,
KubeClientFactory: adminClientFactory,
NodeConfig: nodeConfig,
Expand All @@ -510,15 +507,15 @@ func (c *command) start(ctx context.Context) error {

if !slices.Contains(c.DisableComponents, constant.KubeSchedulerComponentName) {
clusterComponents.Add(ctx, &controller.Scheduler{
LogLevel: c.Logging[constant.KubeSchedulerComponentName],
LogLevel: c.LogLevels.KubeScheduler,
K0sVars: c.K0sVars,
SingleNode: c.SingleNode,
})
}

if !slices.Contains(c.DisableComponents, constant.KubeControllerManagerComponentName) {
clusterComponents.Add(ctx, &controller.Manager{
LogLevel: c.Logging[constant.KubeControllerManagerComponentName],
LogLevel: c.LogLevels.KubeControllerManager,
K0sVars: c.K0sVars,
SingleNode: c.SingleNode,
ServiceClusterIPRange: nodeConfig.Spec.Network.BuildServiceCIDR(nodeConfig.Spec.API.Address),
Expand Down
62 changes: 34 additions & 28 deletions cmd/controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,65 +17,71 @@ limitations under the License.
package controller_test

import (
"strconv"
"strings"
"testing"

"github.com/k0sproject/k0s/cmd"
"github.com/k0sproject/k0s/pkg/constant"

"github.com/stretchr/testify/assert"
)

func TestControllerCmd_Help(t *testing.T) {
defaultConfigPath := strconv.Quote(constant.K0sConfigPathDefault)
defaultDataDir := strconv.Quote(constant.DataDirDefault)

var out strings.Builder
underTest := cmd.NewRootCmd()
underTest.SetArgs([]string{"controller", "--help"})
underTest.SetOut(&out)
assert.NoError(t, underTest.Execute())

assert.Regexp(t, `^Run controller
assert.Equal(t, `Run controller
Usage:
k0s controller \[join-token\] \[flags\]
k0s controller [join-token] [flags]
Aliases:
controller, server
Examples:
\tCommand to associate master nodes:
\tCLI argument:
\t\$ k0s controller \[join-token\]
Command to associate master nodes:
CLI argument:
$ k0s controller [join-token]
\tor CLI flag:
\t\$ k0s controller --token-file \[path_to_file\]
\tNote: Token can be passed either as a CLI argument or as a flag
or CLI flag:
$ k0s controller --token-file [path_to_file]
Note: Token can be passed either as a CLI argument or as a flag
Flags:
--cidr-range string HACK: cidr range for the windows worker node \(default "10\.96\.0\.0/12"\)
-c, --config string config file, use '-' to read the config from stdin \(default ".+k0s\.yaml"\)
--cri-socket string container runtime socket to use, default to internal containerd\. Format: \[remote\|docker\]:\[path-to-socket\]
--data-dir string Data Directory for k0s\. DO NOT CHANGE for an existing setup, things will break! \(default ".+k0s"\)
-d, --debug Debug logging \(default: false\)
--debugListenOn string Http listenOn for Debug pprof handler \(default ":6060"\)
--disable-components strings disable components \(valid items: applier-manager,autopilot,control-api,coredns,csr-approver,endpoint-reconciler,helm,konnectivity-server,kube-controller-manager,kube-proxy,kube-scheduler,metrics-server,network-provider,node-role,system-rbac,windows-node,worker-config\)
--cidr-range string HACK: cidr range for the windows worker node (default "10.96.0.0/12")
-c, --config string config file, use '-' to read the config from stdin (default `+defaultConfigPath+`)
--cri-socket string container runtime socket to use, default to internal containerd. Format: [remote|docker]:[path-to-socket]
--data-dir string Data Directory for k0s. DO NOT CHANGE for an existing setup, things will break! (default `+defaultDataDir+`)
-d, --debug Debug logging (default: false)
--debugListenOn string Http listenOn for Debug pprof handler (default ":6060")
--disable-components strings disable components (valid items: applier-manager,autopilot,control-api,coredns,csr-approver,endpoint-reconciler,helm,konnectivity-server,kube-controller-manager,kube-proxy,kube-scheduler,metrics-server,network-provider,node-role,system-rbac,windows-node,worker-config)
--enable-cloud-provider Whether or not to enable cloud provider support in kubelet
--enable-dynamic-config enable cluster-wide dynamic config based on custom resource
--enable-k0s-cloud-provider enables the k0s-cloud-provider \(default false\)
--enable-metrics-scraper enable scraping metrics from the controller components \(kube-scheduler, kube-controller-manager\)
--enable-worker enable worker \(default false\)
--enable-k0s-cloud-provider enables the k0s-cloud-provider (default false)
--enable-metrics-scraper enable scraping metrics from the controller components (kube-scheduler, kube-controller-manager)
--enable-worker enable worker (default false)
-h, --help help for controller
--ignore-pre-flight-checks continue even if pre-flight checks fail
--iptables-mode string iptables mode \(valid values: nft, legacy, auto\)\. default: auto
--k0s-cloud-provider-port int the port that k0s-cloud-provider binds on \(default 10258\)
--k0s-cloud-provider-update-frequency duration the frequency of k0s-cloud-provider node updates \(default 2m0s\)
--iptables-mode string iptables mode (valid values: nft, legacy, auto). default: auto
--k0s-cloud-provider-port int the port that k0s-cloud-provider binds on (default 10258)
--k0s-cloud-provider-update-frequency duration the frequency of k0s-cloud-provider node updates (default 2m0s)
--kube-controller-manager-extra-args string extra args for kube-controller-manager
--kubelet-extra-args string extra args for kubelet
--labels strings Node labels, list of key=value pairs
-l, --logging stringToString Logging Levels for the different components \(default \[.+]\)
-l, --logging stringToString Logging Levels for the different components (default [containerd=info,etcd=info,konnectivity-server=1,kube-apiserver=1,kube-controller-manager=1,kube-scheduler=1,kubelet=1])
--no-taints disable default taints for controller node
--profile string worker profile to use on the node \(default "default"\)
--single enable single node \(implies --enable-worker, default false\)
--status-socket string Full file path to the socket file\. \(default: <rundir>/status\.sock\)
--profile string worker profile to use on the node (default "default")
--single enable single node (implies --enable-worker, default false)
--status-socket string Full file path to the socket file. (default: <rundir>/status.sock)
--taints strings Node taints, list of key=value:effect strings
--token-file string Path to the file containing join-token\.
-v, --verbose Verbose logging \(default: false\)
$`, out.String())
--token-file string Path to the file containing join-token.
-v, --verbose Verbose logging (default: false)
`, out.String())
}
52 changes: 29 additions & 23 deletions cmd/install/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,30 @@ limitations under the License.
package install_test

import (
"strconv"
"strings"
"testing"

"github.com/k0sproject/k0s/cmd"
"github.com/k0sproject/k0s/pkg/constant"

"github.com/stretchr/testify/assert"
)

func TestInstallCmd_Controller_Help(t *testing.T) {
func TestInstallController_Help(t *testing.T) {
defaultConfigPath := strconv.Quote(constant.K0sConfigPathDefault)
defaultDataDir := strconv.Quote(constant.DataDirDefault)

var out strings.Builder
underTest := cmd.NewRootCmd()
underTest.SetArgs([]string{"install", "controller", "--help"})
underTest.SetOut(&out)
assert.NoError(t, underTest.Execute())

assert.Regexp(t, `^Install k0s controller on a brand-new system\. Must be run as root \(or with sudo\)
assert.Equal(t, `Install k0s controller on a brand-new system. Must be run as root (or with sudo)
Usage:
k0s install controller \[flags\]
k0s install controller [flags]
Aliases:
controller, server
Expand All @@ -48,36 +54,36 @@ With the controller subcommand you can setup a single node cluster by running:
Flags:
--cidr-range string HACK: cidr range for the windows worker node \(default "10\.96\.0\.0/12"\)
-c, --config string config file, use '-' to read the config from stdin \(default ".+k0s\.yaml"\)
--cri-socket string container runtime socket to use, default to internal containerd\. Format: \[remote\|docker\]:\[path-to-socket\]
--data-dir string Data Directory for k0s\. DO NOT CHANGE for an existing setup, things will break! \(default ".+k0s"\)
-d, --debug Debug logging \(default: false\)
--debugListenOn string Http listenOn for Debug pprof handler \(default ":6060"\)
--disable-components strings disable components \(valid items: applier-manager,autopilot,control-api,coredns,csr-approver,endpoint-reconciler,helm,konnectivity-server,kube-controller-manager,kube-proxy,kube-scheduler,metrics-server,network-provider,node-role,system-rbac,windows-node,worker-config\)
--cidr-range string HACK: cidr range for the windows worker node (default "10.96.0.0/12")
-c, --config string config file, use '-' to read the config from stdin (default `+defaultConfigPath+`)
--cri-socket string container runtime socket to use, default to internal containerd. Format: [remote|docker]:[path-to-socket]
--data-dir string Data Directory for k0s. DO NOT CHANGE for an existing setup, things will break! (default `+defaultDataDir+`)
-d, --debug Debug logging (default: false)
--debugListenOn string Http listenOn for Debug pprof handler (default ":6060")
--disable-components strings disable components (valid items: applier-manager,autopilot,control-api,coredns,csr-approver,endpoint-reconciler,helm,konnectivity-server,kube-controller-manager,kube-proxy,kube-scheduler,metrics-server,network-provider,node-role,system-rbac,windows-node,worker-config)
--enable-cloud-provider Whether or not to enable cloud provider support in kubelet
--enable-dynamic-config enable cluster-wide dynamic config based on custom resource
--enable-k0s-cloud-provider enables the k0s-cloud-provider \(default false\)
--enable-metrics-scraper enable scraping metrics from the controller components \(kube-scheduler, kube-controller-manager\)
--enable-worker enable worker \(default false\)
--enable-k0s-cloud-provider enables the k0s-cloud-provider (default false)
--enable-metrics-scraper enable scraping metrics from the controller components (kube-scheduler, kube-controller-manager)
--enable-worker enable worker (default false)
-h, --help help for controller
--iptables-mode string iptables mode \(valid values: nft, legacy, auto\)\. default: auto
--k0s-cloud-provider-port int the port that k0s-cloud-provider binds on \(default 10258\)
--k0s-cloud-provider-update-frequency duration the frequency of k0s-cloud-provider node updates \(default 2m0s\)
--iptables-mode string iptables mode (valid values: nft, legacy, auto). default: auto
--k0s-cloud-provider-port int the port that k0s-cloud-provider binds on (default 10258)
--k0s-cloud-provider-update-frequency duration the frequency of k0s-cloud-provider node updates (default 2m0s)
--kube-controller-manager-extra-args string extra args for kube-controller-manager
--kubelet-extra-args string extra args for kubelet
--labels strings Node labels, list of key=value pairs
-l, --logging stringToString Logging Levels for the different components \(default \[.+]\)
-l, --logging stringToString Logging Levels for the different components (default [containerd=info,etcd=info,konnectivity-server=1,kube-apiserver=1,kube-controller-manager=1,kube-scheduler=1,kubelet=1])
--no-taints disable default taints for controller node
--profile string worker profile to use on the node \(default "default"\)
--single enable single node \(implies --enable-worker, default false\)
--status-socket string Full file path to the socket file\. \(default: <rundir>/status\.sock\)
--profile string worker profile to use on the node (default "default")
--single enable single node (implies --enable-worker, default false)
--status-socket string Full file path to the socket file. (default: <rundir>/status.sock)
--taints strings Node taints, list of key=value:effect strings
--token-file string Path to the file containing join-token\.
-v, --verbose Verbose logging \(default: false\)
--token-file string Path to the file containing join-token.
-v, --verbose Verbose logging (default: false)
Global Flags:
-e, --env stringArray set environment variable
--force force init script creation
$`, out.String())
`, out.String())
}
6 changes: 2 additions & 4 deletions cmd/worker/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (
"syscall"

k0slog "github.com/k0sproject/k0s/internal/pkg/log"
"github.com/k0sproject/k0s/internal/pkg/stringmap"
"github.com/k0sproject/k0s/internal/pkg/sysinfo"
"github.com/k0sproject/k0s/pkg/build"
"github.com/k0sproject/k0s/pkg/component/manager"
Expand Down Expand Up @@ -74,7 +73,6 @@ func NewWorkerCmd() *cobra.Command {
c.TokenArg = args[0]
}

c.Logging = stringmap.Merge(c.CmdLogLevels, c.DefaultLogLevels)
if c.TokenArg != "" && c.TokenFile != "" {
return fmt.Errorf("you can only pass one token argument either as a CLI argument 'k0s worker [token]' or as a flag 'k0s worker --token-file [path]'")
}
Expand Down Expand Up @@ -141,7 +139,7 @@ func (c *Command) Start(ctx context.Context) error {
}

if c.CriSocket == "" {
componentManager.Add(ctx, containerd.NewComponent(c.Logging["containerd"], c.K0sVars, workerConfig))
componentManager.Add(ctx, containerd.NewComponent(c.LogLevels.Containerd, c.K0sVars, workerConfig))
}

componentManager.Add(ctx, worker.NewOCIBundleReconciler(c.K0sVars))
Expand All @@ -156,7 +154,7 @@ func (c *Command) Start(ctx context.Context) error {
StaticPods: staticPods,
Kubeconfig: kubeletKubeconfigPath,
Configuration: *workerConfig.KubeletConfiguration.DeepCopy(),
LogLevel: c.Logging["kubelet"],
LogLevel: c.LogLevels.Kubelet,
Labels: c.Labels,
Taints: c.Taints,
ExtraArgs: c.KubeletExtraArgs,
Expand Down
Loading

0 comments on commit 6e6aef5

Please sign in to comment.