这个简单的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。
最佳答案
首先要捕获几个概念:
执行最终目标(如果我理解正确的话):容器化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/