如何在Kubernetes集群上获取所有正在运行的POD

时间:2019-06-12 15:46:46

标签: node.js docker kubernetes docker-compose

这个简单的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

1 个答案:

答案 0 :(得分:2)

首先要抓住头绪的概念:

执行最终目标(如果我理解正确的话):容器化 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 服务帐户,但该帐户没有角色绑定,则您将无法查看群集。在这种情况下,您需要创建(首先)一个角色(以读取Pod)和一个角色绑定(用于该角色)到serviceaccount。


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

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