From d0810af17c18251ff6863d2bac5b1ff48ec9cf1c Mon Sep 17 00:00:00 2001 From: Enrico Candino Date: Fri, 7 Mar 2025 15:11:00 +0100 Subject: [PATCH] Fix kubeconfig load from multiple configuration files (#301) * fix kubeconfig load with standards kubectl approach * update cli docs --- cli/cmds/cluster_create.go | 2 +- cli/cmds/cluster_delete.go | 3 +-- cli/cmds/kubeconfig.go | 9 ++++----- cli/cmds/root.go | 20 ++++++++++++++++---- docs/cli/cli-docs.md | 6 +++--- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/cli/cmds/cluster_create.go b/cli/cmds/cluster_create.go index b6c92396..8f430169 100644 --- a/cli/cmds/cluster_create.go +++ b/cli/cmds/cluster_create.go @@ -67,7 +67,7 @@ func createAction(config *CreateConfig) cli.ActionFunc { return errors.New("invalid cluster name") } - restConfig, err := clientcmd.BuildConfigFromFlags("", Kubeconfig) + restConfig, err := loadRESTConfig() if err != nil { return err } diff --git a/cli/cmds/cluster_delete.go b/cli/cmds/cluster_delete.go index aa15e7b1..d755ed56 100644 --- a/cli/cmds/cluster_delete.go +++ b/cli/cmds/cluster_delete.go @@ -9,7 +9,6 @@ import ( "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/clientcmd" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -36,7 +35,7 @@ func delete(clx *cli.Context) error { return errors.New("invalid cluster name") } - restConfig, err := clientcmd.BuildConfigFromFlags("", Kubeconfig) + restConfig, err := loadRESTConfig() if err != nil { return err } diff --git a/cli/cmds/kubeconfig.go b/cli/cmds/kubeconfig.go index 47e42727..89355b5a 100644 --- a/cli/cmds/kubeconfig.go +++ b/cli/cmds/kubeconfig.go @@ -92,11 +92,7 @@ func NewKubeconfigCommand() *cli.Command { } func generate(clx *cli.Context) error { - var cluster v1alpha1.Cluster - - ctx := context.Background() - - restConfig, err := clientcmd.BuildConfigFromFlags("", Kubeconfig) + restConfig, err := loadRESTConfig() if err != nil { return err } @@ -113,6 +109,9 @@ func generate(clx *cli.Context) error { Namespace: Namespace(), } + var cluster v1alpha1.Cluster + + ctx := context.Background() if err := ctrlClient.Get(ctx, clusterKey, &cluster); err != nil { return err } diff --git a/cli/cmds/root.go b/cli/cmds/root.go index f1010b39..05b24a74 100644 --- a/cli/cmds/root.go +++ b/cli/cmds/root.go @@ -2,7 +2,6 @@ package cmds import ( "fmt" - "os" "github.com/rancher/k3k/pkg/apis/k3k.io/v1alpha1" "github.com/rancher/k3k/pkg/buildinfo" @@ -10,6 +9,8 @@ import ( "github.com/urfave/cli/v2" "k8s.io/apimachinery/pkg/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" ) const ( @@ -26,11 +27,9 @@ var ( CommonFlags = []cli.Flag{ &cli.StringFlag{ Name: "kubeconfig", - EnvVars: []string{"KUBECONFIG"}, Usage: "kubeconfig path", Destination: &Kubeconfig, - Value: os.Getenv("HOME") + "/.kube/config", - DefaultText: "$HOME/.kube/config", + DefaultText: "$HOME/.kube/config or $KUBECONFIG if set", }, &cli.StringFlag{ Name: "namespace", @@ -86,3 +85,16 @@ func Namespace() string { return namespace } + +func loadRESTConfig() (*rest.Config, error) { + loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() + configOverrides := &clientcmd.ConfigOverrides{} + + if Kubeconfig != "" { + loadingRules.ExplicitPath = Kubeconfig + } + + kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) + + return kubeConfig.ClientConfig() +} diff --git a/docs/cli/cli-docs.md b/docs/cli/cli-docs.md index 240609f3..526cec3b 100644 --- a/docs/cli/cli-docs.md +++ b/docs/cli/cli-docs.md @@ -39,7 +39,7 @@ Create new cluster **--cluster-cidr**="": cluster CIDR -**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config) +**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config or $KUBECONFIG if set) **--kubeconfig-server**="": override the kubeconfig server host @@ -67,7 +67,7 @@ Delete an existing cluster >k3kcli cluster delete [command options] NAME -**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config) +**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config or $KUBECONFIG if set) **--namespace**="": namespace to create the k3k cluster in @@ -87,7 +87,7 @@ Generate kubeconfig for clusters **--expiration-days**="": Expiration date of the certificates used for the kubeconfig (default: 356) -**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config) +**--kubeconfig**="": kubeconfig path (default: $HOME/.kube/config or $KUBECONFIG if set) **--kubeconfig-server**="": override the kubeconfig server host