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

How to get Kubernetes cluster name from K8s API

如题所述,是否可以从API中查出K8s集群名称?我环顾了API,没找到。

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

kubectl cluster-info

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

不幸的是,一个集群不知道它自己的名字,或者任何可以唯一标识它的东西(K8s issue #44954). I wanted to know for helm issue #2055

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

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

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

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

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

对于使用 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 的 "cluster name" 也被用作域后缀。

$ 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 {

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

kubectl config view

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

好吧这个returns正好是一件事,一个集群名

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

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

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

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

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

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

注3:不要依赖kubectl config current-context这个returns只是上下文的名称,而不是集群的名称。

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

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

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

使用 kubectl 命令:

$ kubectl config get-clusters
NAME
kubernetes
kubectl config get-clusters

有这个

NAME
kubernetes