【问题标题】:How to get all running PODs on Kubernetes cluster如何获取 Kubernetes 集群上所有正在运行的 POD
【发布时间】:2019-06-20 02:55:00
【问题描述】:

这个简单的 Node.js 程序在本地运行良好,因为它从我的本地 /root/.kube/config 文件中提取 kubernetes 配置

const Client = require('kubernetes-client').Client;
const Config = require('kubernetes-client/backends/request').config;

const client = new K8sClient({ config: Config.fromKubeconfig(), version: '1.13' });

const pods = await client.api.v1.namespaces('xxxxx').pods.get({ qs: { labelSelector: 'application=test' } });
console.log('Pods: ', JSON.stringify(pods));

现在我想将它作为集群上的 Docker 容器运行并获取所有当前集群正在运行的 POD(对于相同/当前命名空间)。现在当然失败了:

Error:  { Error: ENOENT: no such file or directory, open '/root/.kube/config'

那么当作为 Docker 容器部署到集群时如何使它工作呢? 这个小服务需要扫描所有正在运行的POD...假设它不需要拉配置数据,因为它已经部署了..所以它需要访问当前集群上的POD

【问题讨论】:

    标签: node.js docker kubernetes docker-compose


    【解决方案1】:

    首先要抓住几个概念:

    执行你的最终目标(如果我理解正确的话):容器化 Node js 应用程序

    第 1 步:将应用程序放入容器中

    第 2 步:使用上面第 1 步中创建的容器,根据您的要求创建一个deployment/statefulset/daemonset

    解释:

    在上面的第 2 步中{默认},如果您没有(明确)提及服务帐户(自定义),那么它将是 默认 帐户,其凭据安装在容器内(默认情况下) 这里

    volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: default-token-xxxx
          readOnly: true
    

    可以在(成功)创建 pod 后通过此命令验证

    kubectl get pod -n {yournamespace(by default is default)} POD_NAME -o yaml

    现在(搞定!!)如果您无法使用这些凭据访问集群,则取决于您使用的服务帐户以及需要访问该服务帐户的权限。例如,如果您使用没有角色绑定的 abc 服务帐户,那么您将无法查看集群。在这种情况下,您需要(首先)为服务帐户创建一个角色(读取 pod)和一个角色绑定(针对该角色)。


    更新
    通过将Config.fromKubeconfig() 更改为Config.getInCluster() Ref 解决了问题
    澄清:fromKubeconfig() 如果您在作为 kubernetes 集群一部分的节点上运行应用程序并在此处保存集群访问令牌,则fromKubeconfig() 功能很好:/$USER/.kube/config 但如果您想在 pod 中的容器中运行 nodeJS 应用程序那么你需要这个Config.getInCluster() 来加载令牌。 如果您足够多管闲事,请检查此答案的 cmets! :P

    注意:这里讨论的nodejs库是this

    【讨论】:

    • 你的意思是不需要更改代码吗? (请参阅我的问题中的应用代码)
    • 您能告诉我您使用的是哪个客户端库吗?是这个列表中的任何一个吗? 1. github.com/tenxcloud/node-kubernetes-client 2. github.com/godaddy/kubernetes-client 3. github.com/ajpauwels/easy-k8s
    • 它是 kubernetes-client,正如您在我上面的代码中看到的那样。这是 repo:github.com/godaddy/kubernetes-client.. 所以我想部署我的 Node 应用程序,它将扫描该集群上所有正在运行的 Pod /namespace 然后例如访问静态文件 http:///public/read.me
    • @JohnGlabb 在对github.com/godaddy/kubernetes-client/blob/master/backends/… 进行了一些挖掘之后,我认为您必须将一行代码 Config.fromKubeconfig() 更改为 Config.getInCluster()
    • 如果这解决了您的问题,请考虑接受答案。
    猜你喜欢
    • 2021-12-25
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2023-01-10
    • 2022-08-23
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多