繁体   English   中英

如何从nodejs中的pod内部使用kubernetes api客户端

[英]How to use kubernetes api client from inside pod in nodejs

描述

我正在尝试构建一个应用程序,在某些时候需要在 Kubernetes 中创建对象。 我尝试了这篇文章的答案中提到的大使容器版本,它可以工作,但我更喜欢使用客户端 API,因为我计划在 kubernetes 上执行几个 CRUD 操作。

问题

由于我使用节点发现这两个库:

第二个似乎您需要使用我没有的用户名和密码,因为它应该使用/var/run/secrets/kubernetes.io/serviceaccount/中的令牌登录,所以尝试了第一个。 它包括一些示例,似乎适合此特定情况的示例不起作用。 这是代码:

/* eslint no-console:0 */
//
// Create an API client using in cluster configuration.
//
const Client = require('kubernetes-client').Client
const Request = require('kubernetes-client/backends/request')

// kubernetes-client supports reading the service account credentials [1]
// from different locations by setting the
// `KUBERNETES_CLIENT_SERVICEACCOUNT_ROOT` environment variable. This is
// useful, for example, when running Telepresence [2].
//
// [1]: https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
// [2]: https://www.telepresence.io/howto/volumes

async function main () {
  try {
    const backend = new Request(Request.config.getInCluster())
    const client = new Client({ backend })
    await client.loadSpec()

    //
    // Fetch all the pods
    const pods = await client.api.v1.pods.get()
    pods.body.items.forEach((item) => {
      console.log(item.metadata)
    })

    //
    // Fetch the Deployment from the kube-system namespace.
    //
    const deployment = await client.apis.apps.v1.namespaces('kube-system').deployments().get()
    deployment.body.items.forEach((item) => {
      console.log(item.metadata)
    })
  } catch (err) {
    console.error('Error: ', err)
  }
}

main()

构建 docker 映像并使用此清单运行它:

apiVersion: v1
kind: Pod
metadata:
  name: kubia-api-test
spec:
  containers:
    - image: itasahobby/kubiaapi
      name: kubia
      livenessProbe:
        httpGet:
          path: /
          port: 8080

但是,当我检查 pod 时它崩溃了,并且错误看起来不太具有声明性:

jusepe@ubuntu:~/Documents/kubernetes/test_app$ kubectl get pods | grep test
kubia-api-test         0/1     CrashLoopBackOff   7          13m
jusepe@ubuntu:~/Documents/kubernetes/test_app$ kubectl logs kubia-api-test 
/node_modules/ws/lib/websocket.js:354
      ...options
      ^^^
SyntaxError: Unexpected token ...
    at createScript (vm.js:53:10)
    at Object.runInThisContext (vm.js:95:10)
    at Module._compile (module.js:543:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/node_modules/ws/index.js:3:19)

正如马特在评论中建议的是节点的版本,我的 dockerfile 看起来像

FROM node:7
ADD app.js /app.js
ADD package.json /package.json

RUN npm install
ENTRYPOINT ["node", "app.js"]

更改为最新的节点并且工作正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM