From 7bbaecc185efc930b5422de822f1d281a90dca37 Mon Sep 17 00:00:00 2001 From: Jan Schuppik Date: Tue, 3 Sep 2024 11:10:31 +0200 Subject: [PATCH 1/5] `Flags`: Add common Kubernetes config CLI flags --- cmd/icinga-kubernetes/main.go | 33 +++++++++++++++++++++------------ go.mod | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/cmd/icinga-kubernetes/main.go b/cmd/icinga-kubernetes/main.go index 242a3add..845f4000 100644 --- a/cmd/icinga-kubernetes/main.go +++ b/cmd/icinga-kubernetes/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "flag" _ "github.com/go-sql-driver/mysql" "github.com/google/uuid" "github.com/icinga/icinga-go-library/config" @@ -21,6 +20,7 @@ import ( "github.com/pkg/errors" promapi "github.com/prometheus/client_golang/api" promv1 "github.com/prometheus/client_golang/api/prometheus/v1" + "github.com/spf13/pflag" "golang.org/x/sync/errgroup" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/informers" @@ -35,24 +35,33 @@ import ( func main() { runtime.ReallyCrash = true - kconfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig( - kclientcmd.NewDefaultClientConfigLoadingRules(), &kclientcmd.ConfigOverrides{}).ClientConfig() - if err != nil { - klog.Fatal(err) - } - var configLocation string + var showVersion bool klog.InitFlags(nil) - flag.BoolFunc("version", "print version and exit", func(_ string) error { + pflag.BoolVar(&showVersion, "version", false, "print version and exit") + pflag.StringVar(&configLocation, "config", "./config.yml", "path to the config file") + + loadingRules := kclientcmd.NewDefaultClientConfigLoadingRules() + loadingRules.DefaultClientConfig = &kclientcmd.DefaultClientConfig + pflag.StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to a kube config. Only required if out-of-cluster") + + overrides := kclientcmd.ConfigOverrides{} + kflags := kclientcmd.RecommendedConfigOverrideFlags("") + kclientcmd.BindOverrideFlags(&overrides, pflag.CommandLine, kflags) + + pflag.Parse() + + if showVersion { internal.Version.Print() os.Exit(0) + } - return nil - }) - flag.StringVar(&configLocation, "config", "./config.yml", "path to the config file") - flag.Parse() + kconfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &overrides).ClientConfig() + if err != nil { + klog.Fatal(errors.Wrap(err, "can't configure Kubernetes client")) + } clientset, err := kubernetes.NewForConfig(kconfig) if err != nil { diff --git a/go.mod b/go.mod index 65c44e6b..5de99f53 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.1 github.com/prometheus/common v0.53.0 + github.com/spf13/pflag v1.0.5 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 golang.org/x/sync v0.7.0 @@ -52,7 +53,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect github.com/ssgreg/journald v1.0.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.10.0 // indirect From 0150f2012352515fa1362b2ebbd201d8ae9b62c1 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Wed, 11 Sep 2024 09:59:45 +0200 Subject: [PATCH 2/5] `Docs`: Link `kubeconfig` to Kubernetes docs --- doc/02-Installation.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/02-Installation.md b/doc/02-Installation.md index 39a98739..2ee4fbc7 100644 --- a/doc/02-Installation.md +++ b/doc/02-Installation.md @@ -79,7 +79,9 @@ All available settings can be found under [Configuration](03-Configuration.md). ## Running Icinga for Kubernetes -With locally accessible kubeconfig and `config.yml` files, `icinga-kubernetes` can be executed by running: +With locally accessible +[kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) +and `config.yml` files, `icinga-kubernetes` can be executed by running: ```bash icinga-kubernetes -config /path/to/config.yml @@ -87,7 +89,9 @@ icinga-kubernetes -config /path/to/config.yml ## Using a Container -With locally accessible kubeconfig and `config.yml` files, +With locally accessible +[kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) +and `config.yml` files, run the `icinga/icinga-kubernetes` image using a container runtime of you choice, e.g. Docker: ```bash From 22a72f27b0d07ba86bb9b1ca8bb990c71758fd3b Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Wed, 11 Sep 2024 10:00:18 +0200 Subject: [PATCH 3/5] `Flags`: Readd `klog` flags --- cmd/icinga-kubernetes/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/icinga-kubernetes/main.go b/cmd/icinga-kubernetes/main.go index 845f4000..68b85d12 100644 --- a/cmd/icinga-kubernetes/main.go +++ b/cmd/icinga-kubernetes/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "flag" _ "github.com/go-sql-driver/mysql" "github.com/google/uuid" "github.com/icinga/icinga-go-library/config" @@ -39,6 +40,7 @@ func main() { var showVersion bool klog.InitFlags(nil) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.BoolVar(&showVersion, "version", false, "print version and exit") pflag.StringVar(&configLocation, "config", "./config.yml", "path to the config file") From bee084319bc302d6ab7f96a50c96ba506e10fa16 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Wed, 11 Sep 2024 10:01:04 +0200 Subject: [PATCH 4/5] `Flags`: Don't add `namespace` flag as we don't make use of it yet --- cmd/icinga-kubernetes/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/icinga-kubernetes/main.go b/cmd/icinga-kubernetes/main.go index 68b85d12..813a7666 100644 --- a/cmd/icinga-kubernetes/main.go +++ b/cmd/icinga-kubernetes/main.go @@ -51,6 +51,7 @@ func main() { overrides := kclientcmd.ConfigOverrides{} kflags := kclientcmd.RecommendedConfigOverrideFlags("") + kflags.ContextOverrideFlags.Namespace = kclientcmd.FlagInfo{} kclientcmd.BindOverrideFlags(&overrides, pflag.CommandLine, kflags) pflag.Parse() From 54cdcf09aac037a9e960f90944c7d3f19b5bd093 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Wed, 11 Sep 2024 10:01:35 +0200 Subject: [PATCH 5/5] Refine error message if no out-of-cluster Kubernetes config provided --- cmd/icinga-kubernetes/main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/icinga-kubernetes/main.go b/cmd/icinga-kubernetes/main.go index 813a7666..3f8954bd 100644 --- a/cmd/icinga-kubernetes/main.go +++ b/cmd/icinga-kubernetes/main.go @@ -63,6 +63,12 @@ func main() { kconfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &overrides).ClientConfig() if err != nil { + if kclientcmd.IsEmptyConfig(err) { + klog.Fatal( + "no configuration provided: set KUBECONFIG environment variable or --kubeconfig CLI flag to" + + " a kubeconfig file with cluster access configured") + } + klog.Fatal(errors.Wrap(err, "can't configure Kubernetes client")) }