github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/common/kubernetes/configs.go (about) 1 // Copyright 2014 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package kubernetes 16 17 import ( 18 "fmt" 19 "io/ioutil" 20 "net/url" 21 "strconv" 22 23 "k8s.io/apimachinery/pkg/runtime/schema" 24 kube_rest "k8s.io/client-go/rest" 25 kubeClientCmd "k8s.io/client-go/tools/clientcmd" 26 kubeClientCmdApi "k8s.io/client-go/tools/clientcmd/api" 27 ) 28 29 const ( 30 APIVersion = "v1" 31 32 defaultKubeletPort = 10255 33 defaultKubeletHttps = false 34 defaultUseServiceAccount = false 35 defaultServiceAccountFile = "/var/run/secrets/kubernetes.io/serviceaccount/token" 36 defaultInClusterConfig = true 37 ) 38 39 func getConfigOverrides(uri *url.URL) (*kubeClientCmd.ConfigOverrides, error) { 40 kubeConfigOverride := kubeClientCmd.ConfigOverrides{ 41 ClusterInfo: kubeClientCmdApi.Cluster{}, 42 } 43 if len(uri.Scheme) != 0 && len(uri.Host) != 0 { 44 kubeConfigOverride.ClusterInfo.Server = fmt.Sprintf("%s://%s", uri.Scheme, uri.Host) 45 } 46 47 opts := uri.Query() 48 49 if len(opts["insecure"]) > 0 { 50 insecure, err := strconv.ParseBool(opts["insecure"][0]) 51 if err != nil { 52 return nil, err 53 } 54 kubeConfigOverride.ClusterInfo.InsecureSkipTLSVerify = insecure 55 } 56 57 return &kubeConfigOverride, nil 58 } 59 60 func GetKubeClientConfig(uri *url.URL) (*kube_rest.Config, error) { 61 var ( 62 kubeConfig *kube_rest.Config 63 err error 64 ) 65 66 opts := uri.Query() 67 configOverrides, err := getConfigOverrides(uri) 68 if err != nil { 69 return nil, err 70 } 71 72 inClusterConfig := defaultInClusterConfig 73 if len(opts["inClusterConfig"]) > 0 { 74 inClusterConfig, err = strconv.ParseBool(opts["inClusterConfig"][0]) 75 if err != nil { 76 return nil, err 77 } 78 } 79 80 if inClusterConfig { 81 kubeConfig, err = kube_rest.InClusterConfig() 82 if err != nil { 83 return nil, err 84 } 85 86 if configOverrides.ClusterInfo.Server != "" { 87 kubeConfig.Host = configOverrides.ClusterInfo.Server 88 } 89 kubeConfig.GroupVersion = &schema.GroupVersion{Version: APIVersion} 90 kubeConfig.Insecure = configOverrides.ClusterInfo.InsecureSkipTLSVerify 91 if configOverrides.ClusterInfo.InsecureSkipTLSVerify { 92 kubeConfig.TLSClientConfig.CAFile = "" 93 } 94 } else { 95 authFile := "" 96 if len(opts["auth"]) > 0 { 97 authFile = opts["auth"][0] 98 } 99 100 if authFile != "" { 101 // Load structured kubeconfig data from the given path. 102 loader := &kubeClientCmd.ClientConfigLoadingRules{ExplicitPath: authFile} 103 loadedConfig, err := loader.Load() 104 if err != nil { 105 return nil, err 106 } 107 108 // Flatten the loaded data to a particular restclient.Config based on the current context. 109 if kubeConfig, err = kubeClientCmd.NewNonInteractiveClientConfig( 110 *loadedConfig, 111 loadedConfig.CurrentContext, 112 &kubeClientCmd.ConfigOverrides{}, 113 loader).ClientConfig(); err != nil { 114 return nil, err 115 } 116 } else { 117 kubeConfig = &kube_rest.Config{ 118 Host: configOverrides.ClusterInfo.Server, 119 TLSClientConfig: kube_rest.TLSClientConfig{ 120 Insecure: configOverrides.ClusterInfo.InsecureSkipTLSVerify, 121 }, 122 } 123 kubeConfig.GroupVersion = &schema.GroupVersion{Version: APIVersion} 124 } 125 } 126 if len(kubeConfig.Host) == 0 { 127 return nil, fmt.Errorf("invalid kubernetes master url specified") 128 } 129 130 useServiceAccount := defaultUseServiceAccount 131 if len(opts["useServiceAccount"]) >= 1 { 132 useServiceAccount, err = strconv.ParseBool(opts["useServiceAccount"][0]) 133 if err != nil { 134 return nil, err 135 } 136 } 137 138 if useServiceAccount { 139 // If a readable service account token exists, then use it 140 if contents, err := ioutil.ReadFile(defaultServiceAccountFile); err == nil { 141 kubeConfig.BearerToken = string(contents) 142 } 143 } 144 145 kubeConfig.ContentType = "application/vnd.kubernetes.protobuf" 146 147 return kubeConfig, nil 148 }