Path: blob/main/component/common/kubernetes/kubernetes.go
4096 views
package kubernetes12import (3"fmt"4"reflect"56"github.com/go-kit/log"7"github.com/go-kit/log/level"8commoncfg "github.com/grafana/agent/component/common/config"9"github.com/grafana/agent/pkg/build"10promconfig "github.com/prometheus/common/config"11"k8s.io/client-go/rest"12"k8s.io/client-go/tools/clientcmd"13)1415// ClientArguments controls how to connect to a Kubernetes cluster.16type ClientArguments struct {17APIServer commoncfg.URL `river:"api_server,attr,optional"`18KubeConfig string `river:"kubeconfig_file,attr,optional"`19HTTPClientConfig commoncfg.HTTPClientConfig `river:",squash"`20}2122// DefaultClientArguments holds default values for Arguments.23var DefaultClientArguments = ClientArguments{24HTTPClientConfig: commoncfg.DefaultHTTPClientConfig,25}2627// UnmarshalRiver unmarshals ClientArguments and performs validations.28func (args *ClientArguments) UnmarshalRiver(f func(interface{}) error) error {29*args = DefaultClientArguments3031type arguments ClientArguments32if err := f((*arguments)(args)); err != nil {33return err34}3536if args.APIServer.URL != nil && args.KubeConfig != "" {37return fmt.Errorf("only one of api_server and kubeconfig_file can be set")38}39if args.KubeConfig != "" && !reflect.DeepEqual(args.HTTPClientConfig, commoncfg.DefaultHTTPClientConfig) {40return fmt.Errorf("custom HTTP client configuration is not allowed when kubeconfig_file is set")41}42if args.APIServer.URL == nil && !reflect.DeepEqual(args.HTTPClientConfig, commoncfg.DefaultHTTPClientConfig) {43return fmt.Errorf("api_server must be set when custom HTTP client configuration is provided")44}4546// We must explicitly Validate because HTTPClientConfig is squashed and it won't run otherwise47return args.HTTPClientConfig.Validate()48}4950// BuildRESTConfig converts ClientArguments to a Kubernetes REST config.51func (args *ClientArguments) BuildRESTConfig(l log.Logger) (*rest.Config, error) {52var (53cfg *rest.Config54err error55)5657switch {58case args.KubeConfig != "":59cfg, err = clientcmd.BuildConfigFromFlags("", args.KubeConfig)60if err != nil {61return nil, err62}6364case args.APIServer.URL == nil:65// Use in-cluster config.66cfg, err = rest.InClusterConfig()67if err != nil {68return nil, err69}70level.Info(l).Log("msg", "Using pod service account via in-cluster config")7172default:73rt, err := promconfig.NewRoundTripperFromConfig(*args.HTTPClientConfig.Convert(), "component.common.kubernetes")74if err != nil {75return nil, err76}77cfg = &rest.Config{78Host: args.APIServer.String(),79Transport: rt,80}81}8283cfg.UserAgent = fmt.Sprintf("GrafanaAgent/%s", build.Version)84cfg.ContentType = "application/vnd.kubernetes.protobuf"8586return cfg, nil87}888990