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

106

如标题所述,是否可以从API中找出K8s集群的名称?我查看了API但没有找到。

在API中无法找到K8s集群名称。
17个回答

78

kubectl config current-context可以解决问题(它会输出一些其他内容,例如项目名称、区域等,但应该可以给出您需要的答案)。


24
上下文名称可以手动更改,因此不可靠。 - Akihiro HARAI
1
@AkihiroHARAI 是的,您可以手动重命名它。但是:a)为什么要这样做?b)运行 gcloud container clusters get-credentials 将上下文设置回来。 - usamec
17
我想知道为什么这个答案获得了这么多赞。config current-context并没有进行任何k8s API调用,它只是读取本地存储的kubectl配置文件(严格来说,它甚至不是Kubernetes的一部分,只是其API的客户端)。 - edio
@edio 因为问题标签为“google-kubernetes-engine”,这解决了在GKE上找到您连接的集群的问题。 - usamec
2
@usamec,这个问题是关于kubernetes API的。执行kubectl命令,很可能甚至不会在运行应用程序的POD中安装,这与kubernetes API相去甚远。 按照这种逻辑,我也可以建议主题发起者打开浏览器,导航到Google控制台,并在GKE UI中检查集群名称。 - edio

55

很遗憾,集群不知道自己的名字,或者任何其他唯一标识它的东西 (K8s issue #44954)。我想了解有关helm问题#2055的情况。

更新: 一个常见的解决方法是创建一个包含集群名称的ConfigMap,并在需要时读取它 (#2055 comment 1244537799)。

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-info
  namespace: kube-system
data:
  cluster-name: foo

4
这个答案应该放在最前面。这里大多数的答案都是从kube-config文件中获取信息,这是误导人的。 - ns15

37

通过 K8s API 没有获取名称的方法。如果您在 .kube/config 文件中拥有足够的名称(如果您从云提供商那里下载,则名称应该匹配),这是一个一行代码的解决方案:

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

注意1: 关键在于使用--minify参数,这样它只会输出当前上下文的名称。这里有其他类似的答案,但如果没有使用“minify”参数,您将列出配置中的其他上下文,这可能会让你困惑。

注意2: 在您的.kube/config文件中的名称可能与您的云服务提供商中的名称不一致,如果该文件是由云服务提供商自动生成的,则名称应该匹配;如果您手动配置了它,那么您可以随意为本地配置键入任何名称。

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


实用和快速。谢谢! - Marcelo Guedes

27

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

kubectl cluster-info


2
很抱歉我因为 kubectl cluster-info 没有返回名称而给你点了踩。这里,取而代之,请收下赏金。请参见 https://dev59.com/WloT5IYBdhLWcg3wtRYR#43667827 获取 Kubernetes 票证。 - tback

15
问题描述不是很清楚。但是,如果这个问题与Google Container Engine有关,则像coreypobrien提到的那样,集群的名称存储在节点的自定义元数据中。从节点内部运行以下命令,输出将是集群的名称:
curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"

如果你能指明你的使用情况,我或许可以扩展我的回答来涵盖它。


3
太棒了,谢谢! - ereOn
2
有没有在Amazon EKS集群内完成这个的方法? - Oğuz Yıldız
你如何使用 k8s.io/client-go 进行此调用?尝试使用 RESTClient() 失败了。 - supercalifragilistichespirali
1
你好,我在哪里可以找到这个的文档?我能找到元数据文档,但是没有关于GKE和“cluster-name”的具体内容。我也能获取项目名称吗? - Sam
@Sam 看起来你可以通过将其缩短为 curl http://metadata/computeMetadata/v1/instance/attributes/ -H "Metadata-Flavor: Google" 来列出其他可用的命令。 - T-coder

14

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/ - durp
我该如何避免 kubectl 在结束时打印“pod curl deleted”? - Alex Flint
3
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 - Akihiro HARAI

11

和获取当前配置一样,但以下命令可以清晰地输出:

kubectl config view


2
这对我很有用!我运行了 kubectl config view -o json。然后,我能够通过使用当前上下文并将其映射到上下文来获取当前集群名称,从而确定我的“current-cluster”。谢谢! - Rob McCabe

5

该命令将检查所有可能的集群,正如您所知,.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

3
对于Kubespray集群,以下内容适用于我:
kubectl config current-context | cut -d '@' -f2

这是上下文名称,在客户端.kube/config中定义:完全是任意的。应该从主节点使用/etc/kubernetes/admin.conf,由Kubespray部署--我希望您不要在自己的客户端上使用它。总的来说,我同意已经接受的答案:https://dev59.com/WloT5IYBdhLWcg3wtRYR#43667827 - SYN
我同意被接受的答案,我分享的只是一个临时解决方案。我测试过的配置是在我的客户端上由kubespray ansible生成的。它可能是根配置,但我使用此命令的上下文是为了设置集群/管理员工作,因此无论哪种方式都应该没问题。 - Varun Garg

3
对于使用kubeadm安装的集群,存储在kubeadm-config配置映射中的配置包含安装集群时使用的集群名称。 $ 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中的"cluster name"也会被用作域名后缀。

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

"cluster name"即为集群名称。

以上为最初的回答。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接