使用@kubernetes/client-node的loadFromOptions连接K8s集群无Pod数据问题
使用@kubernetes/client-node连接远程K8s集群返回空V1PodList的问题
问题描述
我尝试通过Node.js使用@kubernetes/client-node连接远程K8s集群,代码如下:
const k8s = require('@kubernetes/client-node') const kc = new k8s.KubeConfig() const cluster = {name: 'default', server: 'https://my-server.com'} const user = {name: 'xxx', password: 'yyy'} const context = {name: 'default', user: user.name, cluster: cluster.name} kc.loadFromOptions({ clusters: [cluster], users: [user], contexts: [context], currentContext: context.name }) const k8sApi = kc.makeApiClient(k8s.CoreV1Api) k8sApi.listPodForAllNamespaces().then(r => { console.log(r.body) })
执行后未出现报错,但返回的结果为:
V1PodList { apiVersion: undefined, items: undefined, kind: undefined, metadata: undefined }
使用相同参数通过kubectl可正常获取Pod数据,请问我遗漏了什么配置?
问题原因及解决方法
你遗漏了集群CA证书配置,同时用户认证的格式也需要调整,这两个点是导致API返回空结构的核心原因。
具体修正步骤
添加集群CA证书
在cluster对象中加入certificateAuthorityData字段,值为K8s集群CA证书的Base64编码字符串(可从本地kubeconfig文件的clusters[].cluster.certificate-authority-data字段直接复制)。调整用户认证格式
密码认证的用户对象需要明确认证类型,正确结构如下:const user = { name: 'xxx', password: 'yyy', authProvider: { name: 'kubernetes' } }
修正后的完整代码
const k8s = require('@kubernetes/client-node') const kc = new k8s.KubeConfig() // 替换为你的集群CA证书Base64编码 const caCert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR......' const cluster = { name: 'default', server: 'https://my-server.com', certificateAuthorityData: caCert } const user = { name: 'xxx', password: 'yyy', authProvider: { name: 'kubernetes' } } const context = { name: 'default', user: user.name, cluster: cluster.name } kc.loadFromOptions({ clusters: [cluster], users: [user], contexts: [context], currentContext: context.name }) const k8sApi = kc.makeApiClient(k8s.CoreV1Api) k8sApi.listPodForAllNamespaces().then(r => { console.log(r.body) })
额外说明
如果你的集群使用token认证,用户对象可改为:
const user = { name: 'xxx', token: '你的认证token' }
内容的提问来源于stack exchange,提问作者newman
相关产品推荐
相关产品推荐

