【问题标题】:How to get current namespace of an in-cluster go Kubernetes client如何获取集群内 go Kubernetes 客户端的当前命名空间
【发布时间】:2019-04-16 10:11:18
【问题描述】:

如何使用 kubernetes client-go API 获取部署/服务的当前命名空间?它似乎不在客户端对象或配置中。

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

    使用

    ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
    

    当所需的实现出现在inClusterClientConfigNamespace() 方法中时,可以工作但很难看。但是如何从rest.InClusterConfig() 开始获取该对象?它只能通过NewNonInteractiveDeferredLoadingClientConfig 从包外部实例化。

    我看到 kubernetes #63707 看起来相关但已被放弃。

    【讨论】:

    • 如果你使用operator-sdk,在package:"github.com/operator-framework/operator-sdk/pkg/k8sutil"中有一个实用方法k8sutil.GetOperatorNamespace()。实现只是读取上面的文件。
    【解决方案2】:

    您始终可以为每个命名空间设置上下文,然后从 kubeconfig 中读取您当前所在的上下文:

    使用以下代码找出您所在的命名空间:

    namespace, _, err := kubeconfig.Namespace()
        if err != nil {
                panic(err)
        }
    

    这将返回您所在的命名空间。

    更多信息请参考:

    https://github.com/kubernetes/client-go/blob/master/tools/clientcmd/client_config.go

    【讨论】:

    • 抱歉这么晚的响应-我使用的是 kubernetes.Clientset 对象,而不是 kubeconfig,因为我在集群中运行服务。不知道这个答案是否适用,谢谢!
    • 这是一个更准确的 sn-p 代码,它与上面的代码具有相同的功能:stackoverflow.com/a/65661997/2784039
    【解决方案3】:

    在您的部署配置中添加此环境变量。

     - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
    

    这是使用kubernetes downward api

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2018-08-05
      • 2018-07-01
      • 2020-05-23
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2019-09-07
      相关资源
      最近更新 更多