如何使用 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
库中是否有一种方法可以实现相同的目的,而不必根据服务来自 运行 的位置执行 kubectl
或 curl
。
您要查找的数据(集群名称)在 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 集群的名称,这可能不是很有帮助。
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
库中是否有一种方法可以实现相同的目的,而不必根据服务来自 运行 的位置执行 kubectl
或 curl
。
您要查找的数据(集群名称)在 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 集群的名称,这可能不是很有帮助。