Получить идентификатор кластера с помощью 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)