Получить идентификатор кластера с помощью Kubernetes client-go

Я использую 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 ответа

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

$ 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) 
Другие вопросы по тегам