Получить идентификатор кластера с помощью Kubernetes client-go - PullRequest
0 голосов
/ 14 февраля 2019

Я использую client-go для Kubernetes и пытаюсь получить идентификатор текущего кластера, то есть что-то похожее на вывод 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)

Как я могу использовать эту функцию?Есть ли другой способ получить идентификатор кластера?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019
$ 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 есть функция1023 *:

// 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) 
0 голосов
/ 17 февраля 2019

По указанной вами ссылке вам нужно использовать clusterInfo, err := config.getCluster() вместо configAuthInfo.getCluster()

...