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

时间:2020-02-28 07:54:45

标签: kubernetes client-go

https://linuxacademy.com/guide/11630-internal-port-forwarding-on-linux-using-the-firewall/提到

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允许通过How to get Kubernetes cluster name from K8s APIin cluster身份验证来初始化clientset

上面提到的两个命令是可以实现的。我想知道client-go库中是否有一种方法可以实现相同的目的,而不必根据服务从何处运行kubectlcurl

2 个答案:

答案 0 :(得分:1)

您要查找的数据(集群名称)在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如何实现这一目标。

基本上,您有generateServiceAccount密钥,并将其传递到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机器/ GKE群集中运行,就可以未经身份验证。这提供了自动身份验证。

您可以在Google的Storing and retrieving instance metadata文档下阅读有关此内容的更多信息。

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

让我知道是否有帮助。

答案 1 :(得分:0)

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

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

metadata.InstanceAttributeValue("cluster-name")

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