Как получить имя кластера Kubernetes из K8s API

Как указано в заголовке, можно ли узнать имя кластера K8s из API? Я просмотрел API и не нашел.


person Alex    schedule 07.07.2016    source источник


Ответы (13)


К сожалению, кластер не знает своего имени или чего-либо еще, что могло бы однозначно идентифицировать его (проблема K8s # 44954). Я хотел узнать о проблеме с рулем № 2055.

person tback    schedule 27.04.2017

kubectl config current-context делает свое дело (выводит немного больше, например название проекта, регион и т. Д., Но он должен дать вам нужный ответ).

person usamec    schedule 22.10.2018
comment
Имя контекста можно переименовать вручную, поэтому оно ненадежно. - person Akihiro HARAI; 12.06.2019
comment
@AkihiroHARAI да, вы можете переименовать его вручную. Но: а) зачем вам это делать? б) запуск gcloud container clusters get-credentials возвращает контекст обратно. - person usamec; 16.06.2019
comment
Интересно, почему у этого ответа так много голосов. config current-context не выполняет никаких вызовов API k8s, он просто читает локально сохраненную kubectl конфигурацию (которая даже, строго говоря, не является частью kubernetes, а просто клиентом для его apis). - person edio; 12.10.2019
comment
@edio, потому что вопрос имеет тег google-kubernetes-engine, и это решает проблему поиска того, к какому кластеру вы подключены на GKE - person usamec; 17.10.2019
comment
@usamec, вопрос касался kubernetes API. Выполнение kubectl, которое, скорее всего, даже не будет установлено в POD с запущенным приложением, очень далеко от kubernetes API. По этой логике я мог бы также предложить автору темы открыть браузер, перейти в консоль Google и проверить имя кластера в пользовательском интерфейсе GKE. - person edio; 18.10.2019

Я не верю, что существует название кластера k8s. Эта команда может предоставить полезную информацию

информация о кластере kubectl

person Bhaal22    schedule 07.07.2016
comment
Мне очень жаль, что я проголосовал против того, чтобы kubectl cluster-info не возвращал имя. Вот, возьми вместо этого награду. См. stackoverflow.com/a/43667827/246241 для билета kubernetes. - person tback; 03.05.2017

Вопрос не очень хорошо описан. Однако, если этот вопрос относится к Google Container Engine, то, как упомянул Корипобрайен, имя кластера хранится в настраиваемых метаданных узлов. Изнутри узла выполните следующую команду, и на выходе будет имя кластера:

curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"

Если вы укажете свой вариант использования, я, возможно, смогу расширить свой ответ, чтобы охватить его.

person Kamran    schedule 28.04.2017
comment
Отлично. Спасибо ! - person ereOn; 07.07.2017
comment
Есть ли способ сделать это в кластере Amazon EKS? - person Oğuz Yıldız; 11.10.2018
comment
Как сделать этот вызов с помощью k8s.io/client-go? Пытался использовать RESTClient() безуспешно - person supercalifragilistichespirali; 27.02.2020
comment
Привет, где мне найти документацию по этому поводу? Я могу найти документацию по метаданным, но, например, ничего конкретного о GKE и имени кластера. Могу я также узнать название проекта? - person Sam; 23.03.2020

API Kubernetes мало что знает об имени кластера GKE, но вы можете легко получить имя кластера с сервера метатданных Google следующим образом

kubectl run curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name
person coreypobrien    schedule 27.04.2017
comment
Это ответ, который я искал весь день; Мне нужно было увидеть полный список доступных атрибутов экземпляра. kubectl run curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/ - person durp; 02.10.2018
comment
как я могу избежать удаления kubectl print pod curl в конце? - person Alex Flint; 18.12.2018
comment
Добавьте --quiet после run. Вся команда будет kubectl run --quiet curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name > cluster_name. @AlexFlint - person Akihiro HARAI; 12.06.2019

Если вам достаточно имени в вашем .kube / config файле, этот однострочный файл сделает свое дело:

kubectl config view --minify -o jsonpath='{.clusters[].name}'

Примечание 1: --minify является здесь ключевым, поэтому он выводит только имя вашего текущего контекста. Здесь есть и другие похожие ответы, но без minify вы будете перечислять другие контексты в своей конфигурации, которые могут вас запутать.

Примечание 2: имя в вашем .kube / config может не отражать имя в вашем облачном провайдере, если файл был автоматически сгенерирован облачным провайдером, имя должно совпадать, если вы настроили его вручную, вы могли бы набрал любое имя только для локального конфига.

Примечание 3: не полагайтесь на kubectl config current-context, он возвращает только имя контекста, а не имя кластера.

person sapeish    schedule 23.06.2020

Это то же самое, что и получение текущей конфигурации, но следующая команда дает четкий вывод:

kubectl config view

person Binoy Thomas    schedule 16.07.2019
comment
Мне это пригодилось! Я побежал kubectl config view -o json. Затем я смог определить свой текущий кластер, используя текущий контекст и сопоставив его с контекстами, чтобы получить текущее имя кластера. Спасибо! - person Rob McCabe; 21.07.2019

Эта команда проверит все возможные кластеры, как вы знаете. KUBECONFIG может иметь несколько контекстов.

kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

И вы получите результат вроде

Cluster name    Server
kubernetes      https://localhost:6443
person UDIT JOSHI    schedule 18.11.2019

Для кластеров, которые были установлены с использованием kubeadm, конфигурация, хранящаяся в kubeadm-config configmap, имеет имя кластера, используемое при установке кластера.

$ kubectl -n kube-system get configmap kubeadm-config -o yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: kubeadm-config
  namespace: kube-system
data:
  ClusterConfiguration: |
    clusterName: NAME_OF_CLUSTER

Для кластеров, использующих CoreDNS в качестве DNS, «имя кластера» из kubeadm также используется в качестве суффикса домена.

$ kubectl -n kube-system get configmap coredns -o yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        kubernetes NAME_OF_CLUSTER.local in-addr.arpa ip6.arpa {
person Evgeny    schedule 15.04.2019

Ну, это возвращает ровно одну вещь, имя кластера

K8s: kubectl config view -o jsonpath='{.clusters[].name}{"\n"}'

Openshift: oc config view -o jsonpath='{.clusters[].name}{"\n"}'

person bortek    schedule 02.06.2020
comment
Это неверно! он просто возвращает ПЕРВОЕ имя кластера. Он может отличаться от кластера текущего контекста. - person Polymerase; 02.04.2021

$ kubectl config get-clusters -> получить список существующих кластеров

person Kalyan Bhonagiri    schedule 28.12.2017

Использование клиента python k8s. Но с incluster_kubeconfig это не сработает.

from kubernetes import config

cluster_context = config.kube_config.list_kube_config_contexts()
print (cluster_context)
([{'context': {'cluster': 'k01.test.use1.aws.platform.gov', 'user': 'k01-test'}, 'name': 'k01.test.use1.aws.platform.gov'}], {'context': {'cluster': 'k01.test.use1.aws.platform.gov', 'user': 'k01-test'}, 'name': 'k01.test.use1.aws.platform.gov'})

cluster_name = cluster_context[1]['context']['cluster']
print (cluster_name)
k01.test.use1.aws.platform.gov
person Mukund Sharma    schedule 12.06.2021

по крайней мере, для кластеров kubespray у меня работает следующее

kubectl config current-context | cut -d '@' -f2
person Varun Garg    schedule 28.07.2021
comment
Это имя контекста, как определено в вашем клиентском .kube / config: совершенно произвольно. Должен быть случай с главного узла с использованием /etc/kubernetes/admin.conf, развернутого Kubespray, который, я надеюсь, вы не используете на своем собственном клиенте. В целом я согласен с уже принятым ответом: stackoverflow.com/a/43667827/5607207 - person SYN; 29.07.2021