如何从 K8s API 获取 Kubernetes 集群名称

Posted

技术标签:

【中文标题】如何从 K8s API 获取 Kubernetes 集群名称【英文标题】:How to get Kubernetes cluster name from K8s API 【发布时间】:2016-11-09 13:42:04 【问题描述】:

如标题所述,是否可以从 API 中找出 K8s 集群名称?我环顾 API 并找不到它。

【问题讨论】:

【参考方案1】:

我不相信有 k8s 集群名称。这个命令可以提供一些很好的信息

kubectl 集群信息

【讨论】:

很抱歉,我对kubectl cluster-info 投了反对票,但没有返回姓名。在这里,取而代之的是赏金。请参阅***.com/a/43667827/246241 获取 kubernetes 票证。【参考方案2】:

kubernetes API 对 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

【讨论】:

这是我一直在寻找的答案;我需要查看可用实例属性的完整列表。 kubectl run curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/ 我怎样才能避免 kubectl 在最后打印“pod curl deleted”? run 之后添加--quiet。整个命令将是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【参考方案3】:

不幸的是,集群不知道自己的名称,也不知道其他任何可以唯一标识它的名称 (K8s issue #44954)。我想知道helm issue #2055。

【讨论】:

【参考方案4】:

这个问题没有很好地描述。但是,如果这个问题与Google Container Engine 有关,那么正如 coreypobrien 提到的,集群的名称存储在节点的自定义元数据中。在节点内部,运行以下命令,输出将是集群名称:

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

如果您指定您的用例,我也许可以扩展我的答案以涵盖它。

【讨论】:

这很棒。谢谢! 有什么方法可以在 Amazon EKS 集群中做到这一点? 如何使用k8s.io/client-go 拨打电话?尝试使用RESTClient() 失败 嗨,我在哪里可以找到这方面的文档?我可以找到元数据文档,但没有关于 GKE 和“集群名称”的具体内容。我也可以获取项目名称吗?【参考方案5】:

$ kubectl config get-clusters --> 获取现有集群的列表

【讨论】:

【参考方案6】:

kubectl config current-context 可以解决问题(它会输出更多信息,例如项目名称、地区等,但它应该会为您提供所需的答案)。

【讨论】:

上下文名称可以手动重命名,因此不可靠。 @AkihiroHARAI 是的,您可以手动重命名它。但是:a) 你为什么要这样做? b) 运行 gcloud container clusters get-credentials 设置上下文。 我想知道为什么这个答案有这么多赞成票。 config current-context 不做任何 k8s API 调用,它只是读取本地存储的 kubectl 配置(严格来说,这甚至不是 kubernetes 的一部分,只是它的 api 的客户端)。 @edio 因为问题有标签“google-kubernetes-engine”,这解决了在 GKE 上查找您连接到哪个集群的问题 @usamec,问题是关于 kubernetes API。执行 kubectl,它甚至可能不会安装在具有正在运行的应用程序的 POD 中,这与 kubernetes API 相差甚远。通过这种逻辑,我还可以建议主题启动器打开浏览器,导航到谷歌控制台并在 GKE UI 中检查集群名称。【参考方案7】:

对于使用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 

【讨论】:

【参考方案8】:

与获取当前配置相同,但下面的命令给出了清晰的输出:

kubectl config view

【讨论】:

这对我很有用!我跑了kubectl config view -o json。然后,我能够通过使用当前上下文并将其映射到上下文以获取当前集群名称来确定我的“当前集群”。谢谢!【参考方案9】:

这个命令会检查所有可能的集群,你知道 .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

【讨论】:

【参考方案10】:

这正好返回一件事,一个集群名称

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

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

【讨论】:

这是不正确的!它只返回第一个集群名称。这可能与当前上下文的集群不同。【参考方案11】:

如果您在 .kube/config 文件中的名称对您来说已经足够了,那么这个单行代码就可以了:

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

注意 1:--minify 是此处的关键,因此它将仅输出您当前上下文的名称。此处发布了其他类似的答案,但如果没有“缩小”,您将在配置中列出可能使您感到困惑的其他上下文。

注意 2: 您的 .kube/config 中的名称可能不会反映您的云提供商中的名称,如果该文件是由云提供商自动生成的,则名称应该匹配,如果您手动配置它您可以为本地配置键入任何名称。

注意 3:不要依赖kubectl config current-context,它只返回上下文的名称,而不是集群的名称。

【讨论】:

【参考方案12】:

使用 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

【讨论】:

【参考方案13】:

至少对于 kubespray 集群来说,以下对我有用

kubectl config current-context | cut -d '@' -f2

【讨论】:

这是上下文名称,在您的客户端 .kube/config 中定义:完全任意。应该是主节点的情况,使用 /etc/kubernetes/admin.conf,由 Kubespray 部署——我希望你没有在你自己的客户端上使用它。一般来说,我会同意已经接受的答案:***.com/a/43667827/5607207【参考方案14】:

使用 kubectl 命令:

$ kubectl config get-clusters
NAME
kubernetes

【讨论】:

以上是关于如何从 K8s API 获取 Kubernetes 集群名称的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有 kubernetes 入口 yamls 转换为使用 API 版本networking.k8s.io/v1

如何在 terraform 中获取 k8s 作业的输出

在 Kubernetes Ingress 从 v1beta1 切换到 v1 时出现错误“io.k8s.api.networking.v1.IngressBackend”中的“未知字段“serviceN

Kubernetes API 资源使用

如何kill掉k8s pod的进程

在kubernetes 集群内访问k8s API服务