如何使用 client-go 从 K8s API 获取 Kubernetes 集群名称

How to get Kubernetes cluster name from K8s API using client-go

提到

curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: 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 client-go 库以编程方式执行相同的操作?也许使用 RESTClient()?我试过了,但一直得到 the server could not find the requested resource.

更新

我想做的是从本地计算机或 k8s 集群中 运行 的应用程序获取 cluster-name。 k8s client-go 允许通过 in cluster or out of cluster 身份验证初始化 clientset

使用顶部提到的两个命令是可以实现的。我想知道 client-go 库中是否有一种方法可以实现相同的目的,而不必根据服务来自 运行 的位置执行 kubectlcurl

您要查找的数据(集群名称)在 GCP 级别可用。名称本身是 GKE 中的资源,而不是 Kubernetes。这意味着使用 client-go 无法获得此特定信息。 因此,为了获取此数据,您可以使用旨在与 GCP 交互的 Google Cloud Client Libraries for Go

作为起点,您可以参考这个document

首先你必须下载container包:

➜  go get google.golang.org/api/container/v1        

在启动代码之前,您需要进行身份验证以获取数据: Google 有一个非常 good document 的实现方法。

基本上你有 generate 一个 ServiceAccount 密钥并在 GOOGLE_APPLICATION_CREDENTIALS 环境中传递它:

➜  export GOOGLE_APPLICATION_CREDENTIALS=sakey.json          

关于你想要的信息,可以在this example.

后面获取集群信息(包括名称)

执行此操作后,您可以像这样启动您的应用程序:

➜  go run main.go -project <google_project_name> -zone us-central1-a

结果将是关于您的集群的信息:

Cluster "tom" (RUNNING) master_version: v1.14.10-gke.17  -> Pool "default-pool" (RUNNING) machineType=n1-standard-2 node_version=v1.14.10-gke.17 autoscaling=false% 

另外值得一提的是,如果你 运行 这个命令:

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

您还与 GCP API 进行交互,只要它在 GCE machine/GKE 集群中 运行,就可以不进行身份验证。这提供了自动身份验证。

您可以在 google 的 Storing and retrieving instance metadata 文档中阅读更多相关信息。

最后,使用云客户端库执行此操作的一大优势是,它可以在部署中从外部启动(只要经过身份验证)或在 pods 内部启动。

如果有帮助请告诉我。

如果你运行在GKE里面,你可以通过实例属性获取集群名称:https://pkg.go.dev/cloud.google.com/go/compute/metadata#InstanceAttributeValue

更具体地说,下面应该为您提供集群名称:

metadata.InstanceAttributeValue("cluster-name")

Thomas 分享的 example 列出了您项目中的所有集群,如果您只想查询托管您的 pod 的 GKE 集群的名称,这可能不是很有帮助。