【问题标题】:How to get Kubernetes cluster name from K8s API如何从 K8s API 获取 Kubernetes 集群名称
【发布时间】:2016-11-09 13:42:04
【问题描述】:

如标题所述,是否可以从 API 中找出 K8s 集群名称?我环顾 API 并找不到它。

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    我不相信有 k8s 集群名称。这个命令可以提供一些很好的信息

    kubectl 集群信息

    【讨论】:

    • 很抱歉,我对kubectl cluster-info 投了反对票,但没有返回姓名。在这里,取而代之的是赏金。请参阅stackoverflow.com/a/43667827/246241 获取 kubernetes 票证。
    【解决方案2】:

    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/
    • 我怎样才能避免 kubectl 在最后打印“pod curl deleted”?
    • 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
    【解决方案3】:

    不幸的是,集群不知道自己的名称,也不知道其他任何可以唯一标识它的名称 (K8s issue #44954)。我想知道helm issue #2055

    【讨论】:

      【解决方案4】:

      这个问题没有很好地描述。但是,如果这个问题与Google Container Engine 有关,那么正如 coreypobrien 提到的,集群的名称存储在节点的自定义元数据中。在节点内部,运行以下命令,输出将是集群名称:

      curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"
      

      如果您指定您的用例,我也许可以扩展我的答案以涵盖它。

      【讨论】:

      • 这很棒。谢谢!
      • 有什么方法可以在 Amazon EKS 集群中做到这一点?
      • 如何使用k8s.io/client-go 拨打电话?尝试使用RESTClient() 失败
      • 嗨,我在哪里可以找到这方面的文档?我可以找到元数据文档,但没有关于 GKE 和“集群名称”的具体内容。我也可以获取项目名称吗?
      【解决方案5】:

      $ kubectl config get-clusters --> 获取现有集群的列表

      【讨论】:

        【解决方案6】:

        kubectl config current-context 可以解决问题(它会输出更多信息,例如项目名称、地区等,但它应该会为您提供所需的答案)。

        【讨论】:

        • 上下文名称可以手动重命名,因此不可靠。
        • @AkihiroHARAI 是的,您可以手动重命名它。但是:a) 你为什么要这样做? b) 运行 gcloud container clusters get-credentials 设置上下文。
        • 我想知道为什么这个答案有这么多赞成票。 config current-context 不做任何 k8s API 调用,它只是读取本地存储的 kubectl 配置(严格来说,这甚至不是 kubernetes 的一部分,只是它的 api 的客户端)。
        • @edio 因为问题有标签“google-kubernetes-engine”,这解决了在 GKE 上查找您连接到哪个集群的问题
        • @usamec,问题是关于 kubernetes API。执行 kubectl,它甚至可能不会安装在具有正在运行的应用程序的 POD 中,这与 kubernetes API 相差甚远。通过这种逻辑,我还可以建议主题启动器打开浏览器,导航到谷歌控制台并在 GKE UI 中检查集群名称。
        【解决方案7】:

        对于使用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 {
        

        【讨论】:

          【解决方案8】:

          与获取当前配置相同,但下面的命令给出了清晰的输出:

          kubectl config view

          【讨论】:

          • 这对我很有用!我跑了kubectl config view -o json。然后,我能够通过使用当前上下文并将其映射到上下文以获取当前集群名称来确定我的“当前集群”。谢谢!
          【解决方案9】:

          这个命令会检查所有可能的集群,你知道 .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
          

          【讨论】:

            【解决方案10】:

            这正好返回一件事,一个集群名称

            K8s: kubectl config view -o jsonpath='{.clusters[].name}{"\n"}'

            Openshift: oc config view -o jsonpath='{.clusters[].name}{"\n"}'

            【讨论】:

            • 这是不正确的!它只返回第一个集群名称。这可能与当前上下文的集群不同。
            【解决方案11】:

            如果您在 .kube/config 文件中的名称对您来说已经足够了,那么这个单行代码就可以了:

            kubectl config view --minify -o jsonpath='{.clusters[].name}'
            

            注意 1:--minify 是此处的关键,因此它将仅输出您当前上下文的名称。此处发布了其他类似的答案,但如果没有“缩小”,您将在配置中列出可能使您感到困惑的其他上下文。

            注意 2: 您的 .kube/config 中的名称可能不会反映您的云提供商中的名称,如果该文件是由云提供商自动生成的,则名称应该匹配,如果您手动配置它您可以为本地配置键入任何名称。

            注意 3:不要依赖kubectl config current-context,它只返回上下文的名称,而不是集群的名称。

            【讨论】:

              【解决方案12】:

              使用 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
              

              【讨论】:

                【解决方案13】:

                至少对于 kubespray 集群来说,以下对我有用

                kubectl config current-context | cut -d '@' -f2
                

                【讨论】:

                • 这是上下文名称,在您的客户端 .kube/config 中定义:完全任意。应该是主节点的情况,使用 /etc/kubernetes/admin.conf,由 Kubespray 部署——我希望你没有在你自己的客户端上使用它。一般来说,我会同意已经接受的答案:stackoverflow.com/a/43667827/5607207
                【解决方案14】:

                使用 kubectl 命令:

                $ kubectl config get-clusters
                NAME
                kubernetes
                

                【讨论】:

                  猜你喜欢
                  • 2019-04-04
                  • 2019-11-30
                  • 2018-08-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-03-28
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多