【发布时间】:2016-11-09 13:42:04
【问题描述】:
如标题所述,是否可以从 API 中找出 K8s 集群名称?我环顾 API 并找不到它。
【问题讨论】:
标签: kubernetes google-kubernetes-engine
如标题所述,是否可以从 API 中找出 K8s 集群名称?我环顾 API 并找不到它。
【问题讨论】:
标签: kubernetes google-kubernetes-engine
我不相信有 k8s 集群名称。这个命令可以提供一些很好的信息
kubectl 集群信息
【讨论】:
kubectl cluster-info 投了反对票,但没有返回姓名。在这里,取而代之的是赏金。请参阅stackoverflow.com/a/43667827/246241 获取 kubernetes 票证。
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
【讨论】:
kubectl run curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/
run 之后添加--quiet。整个命令将是kubectl run --quiet curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name > cluster_name。 @AlexFlint
不幸的是,集群不知道自己的名称,也不知道其他任何可以唯一标识它的名称 (K8s issue #44954)。我想知道helm issue #2055。
【讨论】:
这个问题没有很好地描述。但是,如果这个问题与Google Container Engine 有关,那么正如 coreypobrien 提到的,集群的名称存储在节点的自定义元数据中。在节点内部,运行以下命令,输出将是集群名称:
curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"
如果您指定您的用例,我也许可以扩展我的答案以涵盖它。
【讨论】:
k8s.io/client-go 拨打电话?尝试使用RESTClient() 失败
$ kubectl config get-clusters --> 获取现有集群的列表
【讨论】:
kubectl config current-context 可以解决问题(它会输出更多信息,例如项目名称、地区等,但它应该会为您提供所需的答案)。
【讨论】:
gcloud container clusters get-credentials 设置上下文。
config current-context 不做任何 k8s API 调用,它只是读取本地存储的 kubectl 配置(严格来说,这甚至不是 kubernetes 的一部分,只是它的 api 的客户端)。
对于使用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 的“集群名称”也用作域后缀。
$ 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
【讨论】:
kubectl config view -o json。然后,我能够通过使用当前上下文并将其映射到上下文以获取当前集群名称来确定我的“当前集群”。谢谢!
这个命令会检查所有可能的集群,你知道 .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
【讨论】:
这正好返回一件事,一个集群名称
K8s:
kubectl config view -o jsonpath='{.clusters[].name}{"\n"}'
Openshift:
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,它只返回上下文的名称,而不是集群的名称。
【讨论】:
使用 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
【讨论】: