-1

我正在为 Kubernetes 使用 client-go 并尝试获取当前集群的 API url,即类似于kubectl cluster-info. 我找到了一个名为getCluster

func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) {
    // check that getAuthInfo, getContext, and getCluster do not return an error.
    // Do this before checking if the current config is usable in the event that an
    // AuthInfo, Context, or Cluster config with user-defined names are not found.
    // This provides a user with the immediate cause for error if one is found
    configAuthInfo, err := config.getAuthInfo()
    if err != nil {
        return nil, err
    }

    _, err = config.getContext()
    if err != nil {
        return nil, err
    }

    configClusterInfo, err := config.getCluster()
    if err != nil {
        return nil, err
    }
    
    ...
}

当我在我的代码中编写以下内容时

config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
clusterInfo, err := config.getCluster()

我得到错误config.getCluster undefined (type *rest.Config has no field or method getCluster)

我怎样才能使用这个功能?还有其他方法可以获取此网址吗?

4

2 回答 2

0

从您提供的链接看来,您需要使用clusterInfo, err := config.getCluster()而不是configAuthInfo.getCluster()

于 2019-02-17T20:41:43.100 回答
0
$ kubectl cluster-info

1. Kubernetes master is running at https://10.156.0.3:6443
2. KubeDNS is running at https://10.156.0.3:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

如果你运行kubectl cluster-info -v8,你可以看到以下内容:

第一行基本上是从您的~/.kube/config文件中获取的,kubectl只是检查它是否有效,通过简单的GET请求,搜索应该肯定存在于集群中的东西:

I0222 11:21:18.015482   18150 round_trippers.go:416] GET https://10.156.0.3:6443/api/v1/namespaces/kube-system/services?labelSelector=kubernetes.io%2Fcluster-service%3Dtrue

kubectl proxy您可以通过启动然后在其他控制台中获取此命令的结果:

curl http://127.0.0.1:8001/api/v1/namespaces/kube-system/services?labelSelector=kubernetes.io%2Fcluster-service%3Dtrue 

正如您在响应中看到的那样,那里没有带有主 URL 的行。

因此,要获取在输出的第一行中指定的值,kubectl cluster-info您只需读取 Kubernetes 配置文件的正确部分,因为那里可以有多个集群配置

要读取和反序列化 Kubernetes 配置文件,loader.go中有一个函数:

// LoadFromFile takes a filename and deserializes the contents into Config object
func LoadFromFile(filename string) (*clientcmdapi.Config, error)

或config.go中的另一个函数:

// getConfigFromFile tries to read a kubeconfig file and if it can't, returns an error.  One exception, missing files result in empty configs, not an error.
func getConfigFromFile(filename string) (*clientcmdapi.Config, error) 
于 2019-02-22T12:10:58.177 回答