func kubeconfigClientConfig(s *options.KubeletServer) (*restclient.Config, error) { if s.RequireKubeConfig { // Ignores the values of s.APIServerList return clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.KubeConfig.Value()}, &clientcmd.ConfigOverrides{}, ).ClientConfig() } return clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.KubeConfig.Value()}, &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: s.APIServerList[0]}}, ).ClientConfig() }
// NewGenericWebhook creates a new GenericWebhook from the provided kubeconfig file. func NewGenericWebhook(kubeConfigFile string, groupVersions []unversioned.GroupVersion, initialBackoff time.Duration) (*GenericWebhook, error) { for _, groupVersion := range groupVersions { if !registered.IsEnabledVersion(groupVersion) { return nil, fmt.Errorf("webhook plugin requires enabling extension resource: %s", groupVersion) } } loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() loadingRules.ExplicitPath = kubeConfigFile loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{}) clientConfig, err := loader.ClientConfig() if err != nil { return nil, err } codec := api.Codecs.LegacyCodec(groupVersions...) clientConfig.ContentConfig.NegotiatedSerializer = runtimeserializer.NegotiatedSerializerWrapper( runtime.SerializerInfo{Serializer: codec}, runtime.StreamSerializerInfo{}, ) restClient, err := restclient.UnversionedRESTClientFor(clientConfig) if err != nil { return nil, err } // TODO(ericchiang): Can we ensure remote service is reachable? return &GenericWebhook{restClient, initialBackoff}, nil }
// New creates a new WebhookAuthorizer from the provided kubeconfig file. // // The config's cluster field is used to refer to the remote service, user refers to the returned authorizer. // // # clusters refers to the remote service. // clusters: // - name: name-of-remote-authz-service // cluster: // certificate-authority: /path/to/ca.pem # CA for verifying the remote service. // server: https://authz.example.com/authorize # URL of remote service to query. Must use 'https'. // // # users refers to the API server's webhook configuration. // users: // - name: name-of-api-server // user: // client-certificate: /path/to/cert.pem # cert for the webhook plugin to use // client-key: /path/to/key.pem # key matching the cert // // For additional HTTP configuration, refer to the kubeconfig documentation // http://kubernetes.io/v1.1/docs/user-guide/kubeconfig-file.html. func New(kubeConfigFile string) (*WebhookAuthorizer, error) { for _, groupVersion := range requireEnabled { if !registered.IsEnabledVersion(groupVersion) { return nil, fmt.Errorf("webhook authz plugin requires enabling extension resource: %s", groupVersion) } } loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() loadingRules.ExplicitPath = kubeConfigFile loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{}) clientConfig, err := loader.ClientConfig() if err != nil { return nil, err } serializer := json.NewSerializer(json.DefaultMetaFactory, api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), false) clientConfig.ContentConfig.Codec = versioning.NewCodecForScheme(api.Scheme, serializer, serializer, encodeVersions, decodeVersions) restClient, err := restclient.UnversionedRESTClientFor(clientConfig) if err != nil { return nil, err } // TODO(ericchiang): Can we ensure remote service is reachable? return &WebhookAuthorizer{restClient}, nil }
func (s *DelegatingAuthenticationOptions) newTokenAccessReview() (authenticationclient.TokenReviewInterface, error) { var clientConfig *restclient.Config var err error if len(s.RemoteKubeConfigFile) > 0 { loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.RemoteKubeConfigFile} loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{}) clientConfig, err = loader.ClientConfig() } else { // without the remote kubeconfig file, try to use the in-cluster config. Most addon API servers will // use this path clientConfig, err = restclient.InClusterConfig() } if err != nil { return nil, err } // set high qps/burst limits since this will effectively limit API server responsiveness clientConfig.QPS = 200 clientConfig.Burst = 400 client, err := authenticationclient.NewForConfig(clientConfig) if err != nil { return nil, err } return client.TokenReviews(), nil }
// Creates new Kubernetes Apiserver client. When apiserverHost param is empty string the function // assumes that it is running inside a Kubernetes cluster and attempts to discover the Apiserver. // Otherwise, it connects to the Apiserver specified. // // apiserverHost param is in the format of protocol://address:port/pathPrefix, e.g., // http://localhost:8001. // // Returns created client and its configuration. func CreateApiserverClient(apiserverHost string) (*client.Client, clientcmd.ClientConfig, error) { overrides := &clientcmd.ConfigOverrides{} if apiserverHost != "" { overrides.ClusterInfo = clientcmdapi.Cluster{Server: apiserverHost} } clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{}, overrides) cfg, err := clientConfig.ClientConfig() if err != nil { return nil, nil, err } log.Printf("Creating API server client for %s", cfg.Host) client, err := client.New(cfg) if err != nil { return nil, nil, err } return client, clientConfig, nil }
func newKubeClient() (*kclient.Client, error) { var ( config *restclient.Config err error masterURL string ) *argKubecfgFile = os.Getenv("KUBE_CFG_FILE") logrus.Print("kubeconfig: ", argKubecfgFile) if *argKubeMasterURL != "" { masterURL, err = expandKubeMasterURL() if err != nil { return nil, err } } if masterURL != "" && *argKubecfgFile == "" { config = &restclient.Config{ Host: masterURL, } } else { overrides := &kclientcmd.ConfigOverrides{} overrides.ClusterInfo.Server = masterURL rules := &kclientcmd.ClientConfigLoadingRules{ExplicitPath: *argKubecfgFile} if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig(); err != nil { return nil, err } } logrus.Print("Using ", config.Host, " for kubernetes master") return kclient.New(config) }
func (m *NetworkManager) init(args []string) { configFile := m.parseConfig() defer func() { if configFile != nil { configFile.Close() } }() loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() if m.config.KubeConfig != "" { loadingRules.ExplicitPath = m.config.KubeConfig } configOverrides := &clientcmd.ConfigOverrides{} if m.config.KubeUrl != "" { configOverrides.ClusterInfo.Server = m.config.KubeUrl } kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) config, err := kubeConfig.ClientConfig() if err != nil { glog.Fatal(err) } m.Client, err = client.New(config) if err != nil { glog.Fatalf("Invalid API configuratin: %v", err) } m.Controller = network.NewNetworkFactory().Create(m.Client, args) m.Controller.Init(&m.config, configFile) }
func newKubeClient(conf *Kube2ConsulConfig) (clientset.Interface, error) { var ( config *restclient.Config err error ) if conf.KubeMasterURL != "" && conf.KubeConfigFile == "" { // Only --kubemaster was provided. config = &restclient.Config{ Host: conf.KubeMasterURL, ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}, } } else { // We either have: // 1) --kubemaster and --kubeconfig // 2) just --kubeconfig // 3) neither flag // In any case, the logic is the same. If (3), this will automatically // fall back on the service account token. overrides := &kclientcmd.ConfigOverrides{} overrides.ClusterInfo.Server = conf.KubeMasterURL // might be "", but that is OK rules := &kclientcmd.ClientConfigLoadingRules{ExplicitPath: conf.KubeConfigFile} // might be "", but that is OK if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig(); err != nil { return nil, err } } glog.Infof("Using %s for kubernetes master", config.Host) glog.Infof("Using kubernetes API %v", config.GroupVersion) return clientset.NewForConfig(config) }
/** Initialize a kubernetes API client */ func newKubeClient(apiserverURLString string) (*kubeClient.Client, error) { var u *url.URL var err error if u, err = url.Parse(os.ExpandEnv(apiserverURLString)); err != nil { return nil, fmt.Errorf("Could not parse Kubernetes apiserver URL: %v. Error: %v", apiserverURLString, err) } if u.Scheme == "" || u.Host == "" || u.Host == ":" || u.Path != "" { return nil, fmt.Errorf("Invalid URL provided for Kubernetes API server: %v.", u) } loadingRules := kubeClientCmd.NewDefaultClientConfigLoadingRules() configOverrides := &kubeClientCmd.ConfigOverrides{} kubeConfig := kubeClientCmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) config, err := kubeConfig.ClientConfig() if err != nil { return nil, err } config.Host = apiserverURLString config.Version = "v1" log.WithFields(log.Fields{"host": config.Host, "apiVersion": config.Version}).Debug("Creating kubernetes API client") return kubeClient.New(config) }
// GetCurrentContext gets the current context from local config func GetCurrentContext() (string, error) { clientConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}, ).RawConfig() return clientConfig.CurrentContext, err }
// NewDefaultKubeConnectionArgs returns a new set of default connection // arguments for Kubernetes func NewDefaultKubeConnectionArgs() *KubeConnectionArgs { config := &KubeConnectionArgs{} config.KubernetesAddr = flagtypes.Addr{Value: "localhost:8443", DefaultScheme: "https", DefaultPort: 8443, AllowPrefix: true}.Default() config.ClientConfig = clientcmd.NewNonInteractiveDeferredLoadingClientConfig(&config.ClientConfigLoadingRules, &clientcmd.ConfigOverrides{}) return config }
// GetConfig returns a kubernetes client config for a given context. func GetConfig(context string) clientcmd.ClientConfig { rules := clientcmd.NewDefaultClientConfigLoadingRules() overrides := &clientcmd.ConfigOverrides{} if context != "" { overrides.CurrentContext = context } return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides) }
// Run runs the specified SchedulerServer. This should never exit. func (s *SchedulerServer) Run(_ []string) error { if s.Kubeconfig == "" && s.Master == "" { glog.Warningf("Neither --kubeconfig nor --master was specified. Using default API client. This might not work.") } // This creates a client, first loading any specified kubeconfig // file, and then overriding the Master flag, if non-empty. kubeconfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.Kubeconfig}, &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: s.Master}}).ClientConfig() if err != nil { return err } // Override kubeconfig qps/burst settings from flags kubeconfig.QPS = s.KubeAPIQPS kubeconfig.Burst = s.KubeAPIBurst kubeClient, err := client.New(kubeconfig) if err != nil { glog.Fatalf("Invalid API configuration: %v", err) } go func() { mux := http.NewServeMux() healthz.InstallHandler(mux) if s.EnableProfiling { mux.HandleFunc("/debug/pprof/", pprof.Index) mux.HandleFunc("/debug/pprof/profile", pprof.Profile) mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) } mux.Handle("/metrics", prometheus.Handler()) server := &http.Server{ Addr: net.JoinHostPort(s.Address.String(), strconv.Itoa(s.Port)), Handler: mux, } glog.Fatal(server.ListenAndServe()) }() configFactory := factory.NewConfigFactory(kubeClient, util.NewTokenBucketRateLimiter(s.BindPodsQPS, s.BindPodsBurst)) config, err := s.createConfig(configFactory) if err != nil { glog.Fatalf("Failed to create scheduler configuration: %v", err) } eventBroadcaster := record.NewBroadcaster() config.Recorder = eventBroadcaster.NewRecorder(api.EventSource{Component: "scheduler"}) eventBroadcaster.StartLogging(glog.Infof) eventBroadcaster.StartRecordingToSink(kubeClient.Events("")) sched := scheduler.New(config) sched.Run() select {} }
func (a *adminConfig) getClientConfig(context, kubeconfigPath string) clientcmd.ClientConfig { loadingRules := *a.pathOptions.LoadingRules loadingRules.Precedence = a.pathOptions.GetLoadingPrecedence() loadingRules.ExplicitPath = kubeconfigPath overrides := &clientcmd.ConfigOverrides{ CurrentContext: context, } return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(&loadingRules, overrides) }
func getKubernetesClient() (*unversioned.Client, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() configOverrides := &clientcmd.ConfigOverrides{} kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) config, err := kubeConfig.ClientConfig() if err != nil { return nil, fmt.Errorf("Error creating kubeConfig: %s", err) } return unversioned.New(config) }
func makeErrorKubeconfig() (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) { // Set a non-empty CommandLinePath to trigger loading loadingRules := clientcmd.ClientConfigLoadingRules{} loadingRules.ExplicitPath = "missing-file" clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &loadingRules, &clientcmd.ConfigOverrides{}, ) return loadingRules, clientConfig }
func makeEmptyKubeconfig() (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) { // Set a non-empty CommandLinePath to trigger loading loadingRules := clientcmd.ClientConfigLoadingRules{} loadingRules.ExplicitPath = "specified" clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( // Set empty loading rules to avoid missing file errors &clientcmd.ClientConfigLoadingRules{}, &clientcmd.ConfigOverrides{}, ) return loadingRules, clientConfig }
func (a *adminConfig) HostFactory(host, kubeconfigPath string) cmdutil.Factory { loadingRules := *a.pathOptions.LoadingRules loadingRules.Precedence = a.pathOptions.GetLoadingPrecedence() loadingRules.ExplicitPath = kubeconfigPath overrides := &clientcmd.ConfigOverrides{ CurrentContext: host, } hostClientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(&loadingRules, overrides) return cmdutil.NewFactory(hostClientConfig) }
// LocalClient gets a Kubernetes client from the local environment. // // It does a lot of configuration file loading. Use it for cases where you // have a kubectl client configured. // // For cases where you know exactly where the configuration information is, // you should use Client. // // If you are constructing an interactive client, you may also want to look // at the Kubernetes interactive client configuration. func LocalClient() (*unversioned.Client, error) { // Please, if you find these poor Java developers help them find their // way out of the deep dark forests of Go, and back to the happy // halls of IntelliJ. rules := clientcmd.NewDefaultClientConfigLoadingRules() cfg := &clientcmd.ConfigOverrides{} kcfg := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, cfg) ccfg, err := kcfg.ClientConfig() if err != nil { return nil, err } return unversioned.New(ccfg) }
func GetKubernetesClient() (*unversioned.Client, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() configOverrides := &clientcmd.ConfigOverrides{CurrentContext: constants.MinikubeContext} kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) config, err := kubeConfig.ClientConfig() if err != nil { return nil, errors.Wrap(err, "Error creating kubeConfig: %s") } client, err := unversioned.New(config) if err != nil { return nil, errors.Wrap(err, "Error creating new client from kubeConfig.ClientConfig()") } return client, nil }
func defaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig { loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: ""} flags.StringVar(&loadingRules.ExplicitPath, config.OpenShiftConfigFlagName, "", "Path to the config file to use for CLI requests.") overrides := &clientcmd.ConfigOverrides{} overrideFlags := clientcmd.RecommendedConfigOverrideFlags("") overrideFlags.ContextOverrideFlags.Namespace.ShortName = "n" clientcmd.BindOverrideFlags(overrides, flags, overrideFlags) clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides) return clientConfig }
func getKubernetesServicesWithNamespace(namespace string) (serviceGetter, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() configOverrides := &clientcmd.ConfigOverrides{} kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) config, err := kubeConfig.ClientConfig() if err != nil { return nil, fmt.Errorf("Error creating kubeConfig: %s", err) } client, err := unversioned.New(config) if err != nil { return nil, err } services := client.Services(namespace) return services, nil }
func (o *PathOptions) GetStartingConfig() (*clientcmdapi.Config, error) { // don't mutate the original loadingRules := *o.LoadingRules loadingRules.Precedence = o.GetLoadingPrecedence() clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(&loadingRules, &clientcmd.ConfigOverrides{}) rawConfig, err := clientConfig.RawConfig() if os.IsNotExist(err) { return clientcmdapi.NewConfig(), nil } if err != nil { return nil, err } return &rawConfig, nil }
func makeKubeconfig(server, user string) (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) { // Set a non-empty CommandLinePath to trigger loading loadingRules := clientcmd.ClientConfigLoadingRules{} loadingRules.ExplicitPath = "specified" clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( // Set empty loading rules to avoid missing file errors &clientcmd.ClientConfigLoadingRules{}, // Override the server and user in client config to simulate loading from a file &clientcmd.ConfigOverrides{ ClusterInfo: clientcmdapi.Cluster{Server: server}, AuthInfo: clientcmdapi.AuthInfo{Username: user}, }, ) return loadingRules, clientConfig }
// init initialize the extended testing suite. // You can set these environment variables to configure extended tests: // KUBECONFIG - Path to kubeconfig containing embedded authinfo // TEST_REPORT_DIR - If set, JUnit output will be written to this directory for each test // TEST_REPORT_FILE_NAME - If set, will determine the name of the file that JUnit output is written to func InitTest() { // Add hooks to skip all kubernetes or origin tests ginkgo.BeforeEach(checkSuiteSkips) extendedOutputDir := filepath.Join(os.TempDir(), "openshift-extended-tests") os.MkdirAll(extendedOutputDir, 0777) TestContext.DeleteNamespace = os.Getenv("DELETE_NAMESPACE") != "false" TestContext.VerifyServiceAccount = true TestContext.RepoRoot = os.Getenv("KUBE_REPO_ROOT") TestContext.KubeVolumeDir = os.Getenv("VOLUME_DIR") if len(TestContext.KubeVolumeDir) == 0 { TestContext.KubeVolumeDir = "/var/lib/origin/volumes" } TestContext.KubectlPath = "kubectl" TestContext.KubeConfig = KubeConfigPath() os.Setenv("KUBECONFIG", TestContext.KubeConfig) // load and set the host variable for kubectl clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(&clientcmd.ClientConfigLoadingRules{ExplicitPath: TestContext.KubeConfig}, &clientcmd.ConfigOverrides{}) cfg, err := clientConfig.ClientConfig() if err != nil { FatalErr(err) } TestContext.Host = cfg.Host reportDir = os.Getenv("TEST_REPORT_DIR") reportFileName = os.Getenv("TEST_REPORT_FILE_NAME") if reportFileName == "" { reportFileName = "junit" } quiet = os.Getenv("TEST_OUTPUT_QUIET") == "true" //flag.StringVar(&TestContext.KubeConfig, clientcmd.RecommendedConfigPathFlag, KubeConfigPath(), "Path to kubeconfig containing embedded authinfo.") flag.StringVar(&TestContext.OutputDir, "extended-tests-output-dir", extendedOutputDir, "Output directory for interesting/useful test data, like performance data, benchmarks, and other metrics.") rflag.StringVar(&config.GinkgoConfig.FocusString, "focus", "", "DEPRECATED: use --ginkgo.focus") // Ensure that Kube tests run privileged (like they do upstream) TestContext.CreateTestingNS = createTestingNS // Override the default Kubernetes E2E configuration e2e.SetTestContext(TestContext) }
func getKubeConfig(url, user, pass string, insecure bool) (*unversioned.Config, error) { config, er := unversioned.InClusterConfig() if er != nil { config, er = clientcmd.NewNonInteractiveDeferredLoadingClientConfig( clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}, ).ClientConfig() if er != nil { return nil, er } config.Host = url } config.Insecure = insecure config.Username = user config.Password = pass return config, nil }
func DefaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig { loadingRules := config.NewOpenShiftClientConfigLoadingRules() flags.StringVar(&loadingRules.ExplicitPath, config.OpenShiftConfigFlagName, "", "Path to the config file to use for CLI requests.") cobra.MarkFlagFilename(flags, config.OpenShiftConfigFlagName) overrides := &clientcmd.ConfigOverrides{} overrideFlags := clientcmd.RecommendedConfigOverrideFlags("") overrideFlags.ContextOverrideFlags.Namespace.ShortName = "n" overrideFlags.AuthOverrideFlags.Username.LongName = "" overrideFlags.AuthOverrideFlags.Password.LongName = "" clientcmd.BindOverrideFlags(overrides, flags, overrideFlags) cobra.MarkFlagFilename(flags, overrideFlags.AuthOverrideFlags.ClientCertificate.LongName) cobra.MarkFlagFilename(flags, overrideFlags.AuthOverrideFlags.ClientKey.LongName) cobra.MarkFlagFilename(flags, overrideFlags.ClusterOverrideFlags.CertificateAuthority.LongName) clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides) return clientConfig }
// TODO: clients should be copied and instantiated from a common client config, tweaked, then // given to individual controllers and other infrastructure components. Overrides are optional // and may alter the default configuration. func GetOpenShiftClient(kubeConfigFile string, overrides *ClientConnectionOverrides) (*client.Client, *restclient.Config, error) { loadingRules := &clientcmd.ClientConfigLoadingRules{} loadingRules.ExplicitPath = kubeConfigFile loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{}) kubeConfig, err := loader.ClientConfig() if err != nil { return nil, nil, err } applyClientConnectionOverrides(overrides, kubeConfig) kubeConfig.WrapTransport = DefaultClientTransport openshiftClient, err := client.New(kubeConfig) if err != nil { return nil, nil, err } return openshiftClient, kubeConfig, nil }
// TODO: clients should be copied and instantiated from a common client config, tweaked, then // given to individual controllers and other infrastructure components. func GetKubeClient(kubeConfigFile string, overrides *ClientConnectionOverrides) (*kclient.Client, *kclientset.Clientset, *restclient.Config, error) { loadingRules := &clientcmd.ClientConfigLoadingRules{} loadingRules.ExplicitPath = kubeConfigFile loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{}) kubeConfig, err := loader.ClientConfig() if err != nil { return nil, nil, nil, err } applyClientConnectionOverrides(overrides, kubeConfig) kubeConfig.WrapTransport = DefaultClientTransport kubeClient, err := kclient.New(kubeConfig) if err != nil { return nil, nil, nil, err } kubeClientset := adapter.FromUnversionedClient(kubeClient) return kubeClient, kubeClientset, kubeConfig, nil }
func createKubeClient() (*kclient.Client, error) { masterURL, err := getKubeMasterURL() if err != nil { return nil, err } overrides := &kclientcmd.ConfigOverrides{} overrides.ClusterInfo.Server = masterURL rules := kclientcmd.NewDefaultClientConfigLoadingRules() kubeConfig, err := kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig() kubeConfig.Host = masterURL if err != nil { glog.Error("Error creating Kube Config", err) return nil, err } glog.Infof("Using %s for kubernetes master", kubeConfig.Host) glog.Infof("Using kubernetes API %s", kubeConfig.Version) return kclient.New(kubeConfig) }