As stated in the title, is it possible to find out a K8s cluster name from the API? I looked around the API and could not find it.
Unfortunately a cluster doesn't know its own name, or anything else that would uniquely identify it (K8s issue #44954). I wanted to know for helm issue #2055.
Update: A common workaround is to create a ConfigMap containing the cluster name and read that when required (#2055 comment 1244537799).
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-info
namespace: kube-system
data:
cluster-name: foo
kubectl config current-context
does the trick (it outputs little bit more, like project name, region, etc., but it should give you the answer you need).
gcloud container clusters get-credentials
sets the context back. –
Marenmarena config current-context
doesn't do any k8s API calls, it just reads locally stored kubectl
config (which is not even, strictly speaking, a part of kubernetes, just a client for its apis). –
Tyrocidine Unfortunately a cluster doesn't know its own name, or anything else that would uniquely identify it (K8s issue #44954). I wanted to know for helm issue #2055.
Update: A common workaround is to create a ConfigMap containing the cluster name and read that when required (#2055 comment 1244537799).
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-info
namespace: kube-system
data:
cluster-name: foo
There is no way to get the name via K8s API. But here is a one-liner in case the name you have in your .kube/config file is enough for you (if you download it from your cloud provider the names should match):
kubectl config view --minify -o jsonpath='{.clusters[].name}'
Note 1: The --minify
is key here so it will output the name of your current context only. There are other similar answers posted here but without the "minify" you will be listing other contexts in your config that might confuse you.
Note 2: The name in your .kube/config might not reflect the name in your cloud provider, if the file was autogenerated by the cloud provider the names should match, if you configured it manually you could have typed any name just for local config.
Note 3: Do not rely on kubectl config current-context
this returns just the name of the context, not the name of the cluster.
I dont believe there is a k8s cluster name. This command could provide some nice informations
kubectl cluster-info
kubectl cluster-info
not returning a name. Here, take the bounty instead. See https://mcmap.net/q/194866/-how-to-get-kubernetes-cluster-name-from-k8s-api for the kubernetes ticket. –
Calliecalligraphy The question is not really well described. However, if this question is related to Google Container Engine
then as coreypobrien mentioned the name of cluster is stored in custom metadata of nodes. From inside a node, run the following command and the output will be name of cluster:
curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"
If you specify your use case, I might be able to extend my answer to cover it.
k8s.io/client-go
? Tried to use the RESTClient()
unsuccessfully –
Splashdown curl http://metadata/computeMetadata/v1/instance/attributes/ -H "Metadata-Flavor: Google"
–
Clostridium The kubernetes API doesn't know much about the GKE cluster name, but you can easily get the cluster name from the Google metatdata server like this
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/
–
Eigenfunction --quiet
after run
. The entire command would be 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 –
Tansey It is the same as getting the current config, but the below command gives clear output:
kubectl config view
kubectl config view -o json
. I was then able to determine my "current-cluster" by using the current context and mapping that to the contexts to get the current cluster name. Thanks! –
Udelle This command will Check all possible clusters, as you know .KUBECONFIG may have multiple contexts
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
And you will get output like
Cluster name Server
kubernetes https://localhost:6443
For clusters that were installed using kubeadm
, the configuration stored in the kubeadm-config
configmap has the cluster name used when installing the cluster.
$ 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
For clusters that are using CoreDNS for their DNS, the "cluster name" from kubeadm is also used as the domain suffix.
$ 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 {
at-least for kubespray clusters, the following works for me
kubectl config current-context | cut -d '@' -f2
Well this returns precisely one thing, a cluster name
K8s:
kubectl config view -o jsonpath='{.clusters[].name}{"\n"}'
Openshift:
oc config view -o jsonpath='{.clusters[].name}{"\n"}'
The solution I found was to read the current context from kubeConfig object. For example, using NPM @kubernetes/client-node:
const k8s = require('@kubernetes/client-node');
const kubeConfig = new k8s.KubeConfig();
kubeConfig.loadFromFile(process.env.KUBECONFIG_PATH);
clusterName = kubeConfig.getCurrentContext();
$ kubectl config get-clusters --> get you the list of existing clusters
Using python k8s client. But this won't work with 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
Using kubectl command:
$ kubectl config get-clusters
NAME
kubernetes
kubectl config get-clusters
kubectl config get-contexts
There is a great tool called kubectx
https://github.com/ahmetb/kubectx.
kubectx
- lists all previously added clusters and highlights the currently used one. This is only one word to type instead of kubectl config current-context
.
kubectx <cluster>
- switches to a chosen cluster.
Moreover this tool comes also with kubens
which does exactly the same for namespaces:
kubens
- lists all namespaces and shows the current one,
kubens <namespace>
- switches to a chosen namespace.
For AWS EKS, we can get it via user-data, Run below from pod with ec2 instance metadata access available -
curl -s http://169.254.169.254/latest/user-data | grep /etc/eks/bootstrap.sh | awk '{print $2}'
EKS node's user-data runs a script named /etc/eks/bootstrap.sh
with 1st argument as EKS cluster name, which we can use.
© 2022 - 2025 — McMap. All rights reserved.