github.com/netdata/go.d.plugin@v0.58.1/pkg/k8sclient/k8sclient.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package k8sclient
     4  
     5  import (
     6  	"errors"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"k8s.io/client-go/kubernetes"
    11  	"k8s.io/client-go/kubernetes/fake"
    12  	"k8s.io/client-go/rest"
    13  	"k8s.io/client-go/tools/clientcmd"
    14  
    15  	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    16  )
    17  
    18  const (
    19  	EnvFakeClient    = "KUBERNETES_FAKE_CLIENTSET"
    20  	defaultUserAgent = "Netdata/k8s-client"
    21  )
    22  
    23  func New(userAgent string) (kubernetes.Interface, error) {
    24  	if userAgent == "" {
    25  		userAgent = defaultUserAgent
    26  	}
    27  
    28  	switch {
    29  	case os.Getenv(EnvFakeClient) != "":
    30  		return fake.NewSimpleClientset(), nil
    31  	case os.Getenv("KUBERNETES_SERVICE_HOST") != "" && os.Getenv("KUBERNETES_SERVICE_PORT") != "":
    32  		return newInCluster(userAgent)
    33  	default:
    34  		return newOutOfCluster(userAgent)
    35  	}
    36  }
    37  
    38  func newInCluster(userAgent string) (*kubernetes.Clientset, error) {
    39  	config, err := rest.InClusterConfig()
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	config.UserAgent = userAgent
    45  
    46  	return kubernetes.NewForConfig(config)
    47  }
    48  
    49  func newOutOfCluster(userAgent string) (*kubernetes.Clientset, error) {
    50  	home := homeDir()
    51  	if home == "" {
    52  		return nil, errors.New("couldn't find home directory")
    53  	}
    54  
    55  	path := filepath.Join(home, ".kube", "config")
    56  	config, err := clientcmd.BuildConfigFromFlags("", path)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	config.UserAgent = userAgent
    62  
    63  	return kubernetes.NewForConfig(config)
    64  }
    65  
    66  func homeDir() string {
    67  	if h := os.Getenv("HOME"); h != "" {
    68  		return h
    69  	}
    70  	return os.Getenv("USERPROFILE") // windows
    71  }