2

How to get Kubernetes cluster name from K8s API提到

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

更新

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

使用顶部提到的两个命令是可以实现的。我想知道图书馆是否有办法client-go实现相同的目标,而不是必须这样做kubectlcurl取决于服务的运行位置。

4

2 回答 2

1

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

作为起点,您可以查阅此 文档

首先,您必须下载container软件包:

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

在您启动代码之前,您将通过身份验证来获取数据:谷歌有一个非常好的文档如何实现这一点。

基本上你已经生成了一个密钥并在环境ServiceAccount中传递它:GOOGLE_APPLICATION_CREDENTIALS

➜  export GOOGLE_APPLICATION_CREDENTIALS=sakey.json          

关于您想要的信息,您可以按照此示例获取集群信息(包括名称) 。

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

➜  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 机器/GKE 集群中运行,就可以未经身份验证。这提供了自动身份验证。

您可以在 google 的存储和检索实例元数据文档下阅读更多相关信息。

最后,使用 Cloud Client Libraries 执行此操作的一大优势是,它可以在外部启动(只要它经过身份验证)或在部署中的 pod 内部启动。

让我知道它是否有帮助。

于 2020-02-28T15:19:52.587 回答
0

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

更具体地说,以下内容应为您提供集群名称:

metadata.InstanceAttributeValue("cluster-name")

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

于 2020-12-13T02:18:58.453 回答