这个简单的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
答案 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 fromKubeconfig()
的功能很好:/$USER/.kube/config
,但是如果您想在容器中的容器,那么您需要此Config.getInCluster()
来加载令牌。
如果您很管闲,请查看此答案的评论! :P
注意:这里讨论中的nodejs库是this