Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/common/kubernetes/kubernetes.go
4096 views
1
package kubernetes
2
3
import (
4
"fmt"
5
"reflect"
6
7
"github.com/go-kit/log"
8
"github.com/go-kit/log/level"
9
commoncfg "github.com/grafana/agent/component/common/config"
10
"github.com/grafana/agent/pkg/build"
11
promconfig "github.com/prometheus/common/config"
12
"k8s.io/client-go/rest"
13
"k8s.io/client-go/tools/clientcmd"
14
)
15
16
// ClientArguments controls how to connect to a Kubernetes cluster.
17
type ClientArguments struct {
18
APIServer commoncfg.URL `river:"api_server,attr,optional"`
19
KubeConfig string `river:"kubeconfig_file,attr,optional"`
20
HTTPClientConfig commoncfg.HTTPClientConfig `river:",squash"`
21
}
22
23
// DefaultClientArguments holds default values for Arguments.
24
var DefaultClientArguments = ClientArguments{
25
HTTPClientConfig: commoncfg.DefaultHTTPClientConfig,
26
}
27
28
// UnmarshalRiver unmarshals ClientArguments and performs validations.
29
func (args *ClientArguments) UnmarshalRiver(f func(interface{}) error) error {
30
*args = DefaultClientArguments
31
32
type arguments ClientArguments
33
if err := f((*arguments)(args)); err != nil {
34
return err
35
}
36
37
if args.APIServer.URL != nil && args.KubeConfig != "" {
38
return fmt.Errorf("only one of api_server and kubeconfig_file can be set")
39
}
40
if args.KubeConfig != "" && !reflect.DeepEqual(args.HTTPClientConfig, commoncfg.DefaultHTTPClientConfig) {
41
return fmt.Errorf("custom HTTP client configuration is not allowed when kubeconfig_file is set")
42
}
43
if args.APIServer.URL == nil && !reflect.DeepEqual(args.HTTPClientConfig, commoncfg.DefaultHTTPClientConfig) {
44
return fmt.Errorf("api_server must be set when custom HTTP client configuration is provided")
45
}
46
47
// We must explicitly Validate because HTTPClientConfig is squashed and it won't run otherwise
48
return args.HTTPClientConfig.Validate()
49
}
50
51
// BuildRESTConfig converts ClientArguments to a Kubernetes REST config.
52
func (args *ClientArguments) BuildRESTConfig(l log.Logger) (*rest.Config, error) {
53
var (
54
cfg *rest.Config
55
err error
56
)
57
58
switch {
59
case args.KubeConfig != "":
60
cfg, err = clientcmd.BuildConfigFromFlags("", args.KubeConfig)
61
if err != nil {
62
return nil, err
63
}
64
65
case args.APIServer.URL == nil:
66
// Use in-cluster config.
67
cfg, err = rest.InClusterConfig()
68
if err != nil {
69
return nil, err
70
}
71
level.Info(l).Log("msg", "Using pod service account via in-cluster config")
72
73
default:
74
rt, err := promconfig.NewRoundTripperFromConfig(*args.HTTPClientConfig.Convert(), "component.common.kubernetes")
75
if err != nil {
76
return nil, err
77
}
78
cfg = &rest.Config{
79
Host: args.APIServer.String(),
80
Transport: rt,
81
}
82
}
83
84
cfg.UserAgent = fmt.Sprintf("GrafanaAgent/%s", build.Version)
85
cfg.ContentType = "application/vnd.kubernetes.protobuf"
86
87
return cfg, nil
88
}
89
90