[英]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.