11package kubernetescollector
22
33import (
4- "crypto/x509"
54 "encoding/base64"
65 "fmt"
76 "net"
87 "os"
98 "path/filepath"
109
10+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth"
1111 "gopkg.in/yaml.v2"
1212)
1313
@@ -36,26 +36,27 @@ func loadInClusterConfig() (*kubeAPIConfig, error) {
3636 return nil , fmt .Errorf ("KUBERNETES_SERVICE_HOST/KUBERNETES_SERVICE_PORT environment variables are not set" )
3737 }
3838
39- token , err := os .ReadFile ("/var/run/secrets/kubernetes.io/serviceaccount/token" )
39+ const bearerTokenFile = "/var/run/secrets/kubernetes.io/serviceaccount/token"
40+ // Verify that vlagent is running in a Kubernetes cluster.
41+ if _ , err := os .Stat (bearerTokenFile ); err != nil {
42+ return nil , err
43+ }
44+
45+ opts := & promauth.Options {
46+ BearerTokenFile : bearerTokenFile ,
47+ TLSConfig : & promauth.TLSConfig {
48+ CAFile : "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" ,
49+ },
50+ }
51+ ac , err := opts .NewConfig ()
4052 if err != nil {
41- return nil , fmt .Errorf ("cannot read in-cluster token : %w" , err )
53+ return nil , fmt .Errorf ("cannot initialize in-cluster auth config : %w" , err )
4254 }
4355
56+ server := "https://" + net .JoinHostPort (host , port )
4457 return & kubeAPIConfig {
45- Server : "https://" + net .JoinHostPort (host , port ),
46- BearerToken : string (token ),
47- GetCACert : func () (* x509.CertPool , error ) {
48- certs , err := os .ReadFile ("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" )
49- if err != nil {
50- return nil , fmt .Errorf ("cannot read root CA: %w" , err )
51- }
52-
53- roots := x509 .NewCertPool ()
54- if ! roots .AppendCertsFromPEM (certs ) {
55- return nil , fmt .Errorf ("cannot parse PEM encoded certificates" )
56- }
57- return roots , nil
58- },
58+ server : server ,
59+ ac : ac ,
5960 }, nil
6061}
6162
@@ -136,7 +137,7 @@ func loadLocalConfig() (*kubeAPIConfig, error) {
136137
137138 rawConfig , err := os .ReadFile (configPath )
138139 if err != nil {
139- return nil , fmt . Errorf ( "cannot read %q: %w" , configPath , err )
140+ return nil , err
140141 }
141142
142143 var cfg kubeConfig
@@ -154,64 +155,54 @@ func loadLocalConfig() (*kubeAPIConfig, error) {
154155 return nil , fmt .Errorf ("cannot find cluster %q in %q" , cctx .Context .Cluster , configPath )
155156 }
156157
157- var ca []byte
158+ tlsCfg := promauth.TLSConfig {}
159+
158160 if cl .Cluster .CertificateAuthority != "" {
159- ca , err = os .ReadFile (cl .Cluster .CertificateAuthority )
160- if err != nil {
161- return nil , fmt .Errorf ("cannot read cluster certificate authority: %w" , err )
162- }
161+ tlsCfg .CAFile = cl .Cluster .CertificateAuthority
163162 } else if cl .Cluster .CertificateAuthorityData != "" {
164- ca , err = base64 .StdEncoding .AppendDecode ( nil , [] byte ( cl .Cluster .CertificateAuthorityData ) )
163+ ca , err : = base64 .StdEncoding .DecodeString ( cl .Cluster .CertificateAuthorityData )
165164 if err != nil {
166- return nil , fmt .Errorf ("cannot decode base64 encoded CA certificate data: %w" , err )
165+ return nil , fmt .Errorf ("cannot decode base64 encoded CA certificate data from file %q : %w" , configPath , err )
167166 }
167+ tlsCfg .CA = string (ca )
168168 }
169169
170170 u , ok := cfg .findUser (cctx .Context .User )
171171 if ! ok {
172- return nil , fmt .Errorf ("cannot find user %q in %q" , cctx .Context .User , configPath )
172+ return nil , fmt .Errorf ("cannot find current user %q in %q" , cctx .Context .User , configPath )
173173 }
174174
175- var clientCert []byte
176175 if u .User .ClientCertificate != "" {
177- clientCert , err = os .ReadFile (u .User .ClientCertificate )
178- if err != nil {
179- return nil , fmt .Errorf ("cannot read client certificate from %q: %w" , u .User .ClientCertificate , err )
180- }
176+ tlsCfg .CertFile = u .User .ClientCertificate
181177 } else if u .User .ClientCertificateData != "" {
182- clientCert , err = base64 .StdEncoding .AppendDecode ( nil , [] byte ( u .User .ClientCertificateData ) )
178+ clientCert , err : = base64 .StdEncoding .DecodeString ( u .User .ClientCertificateData )
183179 if err != nil {
184- return nil , fmt .Errorf ("cannot decode base64 encoded client certificate data: %w" , err )
180+ return nil , fmt .Errorf ("cannot decode base64 encoded client certificate data from file %q : %w" , configPath , err )
185181 }
182+ tlsCfg .Cert = string (clientCert )
186183 }
187184
188- var clientCertKey []byte
189185 if u .User .ClientKey != "" {
190- clientCertKey , err = os .ReadFile (u .User .ClientKey )
191- if err != nil {
192- return nil , fmt .Errorf ("cannot read client key from %q: %w" , u .User .ClientKey , err )
193- }
186+ tlsCfg .KeyFile = u .User .ClientKey
194187 } else if u .User .ClientKeyData != "" {
195- clientCertKey , err = base64 .StdEncoding .AppendDecode ( nil , [] byte ( u .User .ClientKeyData ) )
188+ clientCertKey , err : = base64 .StdEncoding .DecodeString ( u .User .ClientKeyData )
196189 if err != nil {
197- return nil , fmt .Errorf ("cannot decode base64 encoded client certificate key data: %w" , err )
190+ return nil , fmt .Errorf ("cannot decode base64 encoded client certificate key data from file %q : %w" , configPath , err )
198191 }
192+ tlsCfg .Key = string (clientCertKey )
193+ }
194+
195+ opts := & promauth.Options {
196+ BearerToken : u .User .Token ,
197+ TLSConfig : & tlsCfg ,
198+ }
199+ ac , err := opts .NewConfig ()
200+ if err != nil {
201+ return nil , fmt .Errorf ("cannot initialize local auth config from file %q: %w" , configPath , err )
199202 }
200203
201204 return & kubeAPIConfig {
202- Server : cl .Cluster .Server ,
203- BearerToken : u .User .Token ,
204- ClientCert : clientCert ,
205- ClientCertKey : clientCertKey ,
206- GetCACert : func () (* x509.CertPool , error ) {
207- if len (ca ) == 0 {
208- return nil , nil
209- }
210- roots := x509 .NewCertPool ()
211- if ! roots .AppendCertsFromPEM (ca ) {
212- return nil , fmt .Errorf ("cannot parse root CA for %q cluster from %q for user %q; no certs fetched" , cl , configPath , cctx .Context .User )
213- }
214- return roots , nil
215- },
205+ server : cl .Cluster .Server ,
206+ ac : ac ,
216207 }, nil
217208}
0 commit comments