这个简单的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(用于相同/当前 namespace )。现在当然失败了:
Error:  { Error: ENOENT: no such file or directory, open '/root/.kube/config'

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

最佳答案

首先要捕获几个概念:

  • Service account
  • Role
  • Role binding

  • 执行最终目标(如果我理解正确的话):容器化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
    现在(Gotchas !!),如果您无法使用这些凭据访问群集,则取决于您使用的服务帐户以及该服务帐户的权限。例如,如果您使用的abc serviceaccount没有角色绑定(bind),那么您将无法查看集群。在这种情况下,您需要创建(首先)一个角色(以读取Pod)和一个角色绑定(bind)(针对该角色)到serviceaccount。

    UPDATE :通过将Config.fromKubeconfig()更改为Config.getInCluster() Ref可以解决问题
    澄清:如果您是在作为kubernetes集群一部分的节点上运行应用程序,并且具有访问集群的 token 存储在此处,则fromKubeconfig()功能很好:/$USER/.kube/config,但是如果您想在pod的容器中运行nodeJS应用,则需要此功能Config.getInCluster()加载 token 。
    如果您很管闲,请查看此答案的评论! :P

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

    关于node.js - 如何在Kubernetes集群上获取所有正在运行的POD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56566031/

    10-16 12:31
    查看更多