在Kubernetes中将NodeJS作为CronJob运行

jogvjijk  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(1)|浏览(147)

我有一个小的NodeJS脚本,我想在一个kubernetes集群的容器中作为CronJob运行它。我很难弄清楚如何做到这一点,因为大多数例子都是简单的“运行这个Bash命令”类型的交易。
package.json:

{
  ...
  "scripts": {
    "start": "node bin/path/to/index.js",
    "compile": "tsc"
  }
}

npm run compile && npm run start在命令行上工作。
停靠文件:

FROM node:18
WORKDIR /working/dir/
...
RUN npm run compile

CMD [ "npm", "run", "start" ]

当我构建并在命令行上运行这个容器时,脚本成功运行了。这让我相信上面的大多数事情都是正确的,这一定是我的CronJob的问题...
my-cron.yaml:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-foo
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job-foo
            image: gcr.io/...
            imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure

当我kubectl apply -f my-cron.yaml时,我确实得到了一些运行的pod,每分钟一个,但是它们都错误了:

% kubectl logs cron-foo-27805019-j8gbp

> mdmp@0.0.1 start
> node bin/path/to/index.js

node:internal/modules/cjs/loader:998
  throw err;
  ^

Error: Cannot find module '/working/dir/bin/path/to/index.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:995:15)
    at Module._load (node:internal/modules/cjs/loader:841:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

Node.js v18.11.0

事实上,它正在尝试运行正确的命令,这意味着正确的Docker容器被成功拉取,但我不知道为什么找不到脚本...
任何帮助都将不胜感激。我见过的大多数CronJob示例在模板规范中都有一个command:列表。

v7pvogib

v7pvogib1#

当你docker run ...时,你显示的关于找不到路径的错误应该出现-但是它没有!
因此,我假设它与imagePullPolicy有关。某些内容被修复,在本地检查,然后重新推送到给定的注册表供Kubernetes工作负载使用。如果它是用相同的标记重新推送的,那么不要忘记告诉Kubernetes查询注册表,通过将imagePullPolicy更改为Always来下载新的摘要。

相关问题