github.com/netdata/go.d.plugin@v0.58.1/modules/k8s_state/client.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package k8s_state
     4  
     5  import (
     6  	"errors"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"k8s.io/client-go/kubernetes"
    11  	"k8s.io/client-go/rest"
    12  	"k8s.io/client-go/tools/clientcmd"
    13  
    14  	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    15  
    16  	"github.com/mattn/go-isatty"
    17  )
    18  
    19  const (
    20  	envKubeServiceHost = "KUBERNETES_SERVICE_HOST"
    21  	envKubeServicePort = "KUBERNETES_SERVICE_PORT"
    22  )
    23  
    24  func newKubeClient() (kubernetes.Interface, error) {
    25  	if os.Getenv(envKubeServiceHost) != "" && os.Getenv(envKubeServicePort) != "" {
    26  		return newKubeClientInCluster()
    27  	}
    28  	if isatty.IsTerminal(os.Stdout.Fd()) {
    29  		return newKubeClientOutOfCluster()
    30  	}
    31  	return nil, errors.New("can not create Kubernetes client: not inside a cluster")
    32  }
    33  
    34  func newKubeClientInCluster() (*kubernetes.Clientset, error) {
    35  	config, err := rest.InClusterConfig()
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	config.UserAgent = "Netdata/kube-state"
    40  	return kubernetes.NewForConfig(config)
    41  }
    42  
    43  func newKubeClientOutOfCluster() (*kubernetes.Clientset, error) {
    44  	home := homeDir()
    45  	if home == "" {
    46  		return nil, errors.New("couldn't find home directory")
    47  	}
    48  
    49  	configPath := filepath.Join(home, ".kube", "config")
    50  	config, err := clientcmd.BuildConfigFromFlags("", configPath)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  
    55  	config.UserAgent = "Netdata/kube-state"
    56  	return kubernetes.NewForConfig(config)
    57  }
    58  
    59  func homeDir() string {
    60  	if h := os.Getenv("HOME"); h != "" {
    61  		return h
    62  	}
    63  	return os.Getenv("USERPROFILE") // windows
    64  }