使用 nodejs 创建 Kubernetes 作业时获取状态代码 422

Getting Status code 422 when creating Kubernetes Job using nodejs

我正在 NodeJS 中创建一个 Kubernetes 作业 class 导入库 @kubernetes/client-node 后,我创建了一个对象以在我导出到其他函数的函数中使用模块 BatchV1Api class 我在其中定义了 Kubernetes 作业的主体:

//listJobs.js

import { post } from '../kubeClient.js';

const kubeRoute = async (ctx) => {
    const newJob = {
        metadata: {
            name: 'countdown',
        },
        spec: {
            template: {
                metadata: {
                    name: 'countdown',
                },
            },
            spec: {
                containers: [
                    {
                        name: 'counter',
                        image: 'centos:7',
                        command: 'bin/bash, -c, for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done',
                    }],
                restartPolicy: 'Never',
            },
        },
    };

    const kubeClient = post();
    kubeClient.createNamespacedJob('default', newJob);
    ctx.body = {
        // listConfigMap: (await kubeClient.listConfigMapForAllNamespaces()).body,
        listJobs: (await kubeClient.listJobForAllNamespaces()).body,
        // listService: (await kubeClient.listServiceForAllNamespaces()).body,
    };
};

export default kubeRoute;

然后我创建了一个路由器 class 来请求 post 方法,例如:

import post from './listJobs.js';

const apiRouter = new Router();
apiRouter.post('/api/v1/newJob', post);

当执行应用程序并在 postman 中将路由 localhost:3000/api/v1/newJob 作为 post 请求请求时,它显示状态代码 422(有一些很长的输出,如屏幕截图所示)在 vs 代码终端和 postman 主体中的一些 Kubernetes 信息,但它没有创建任何作业或 pod。

有谁知道为什么最后有 422 代码?

状态代码 422 无法处理的实体 表示服务器理解内容类型,并且请求的语法正确,但无法处理包含的指令。

但在您的情况下,作业清单看起来不对。

我不是 JavaScript kubernetes 客户端方面的专家,但是 newJob body 看起来很奇怪。生成的 yaml 应如下所示

apiVersion: batch/v1
kind: Job
metadata:
  name: countdown
spec:
  template:
    spec:
      containers:
      - name: counter
        image: centos:7
        command: 'bin/bash, -c, for i in {9..1} ; do echo $i ; done' #fixed this one for you
      restartPolicy: Never

在你的例子中,第二个 specspec 的 child。它应该是 template 的 child,所以:

{
  "metadata": {
    "name": "countdown"
  },
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "name": "counter",
            "image": "centos:7",
            "command": "bin/bash, -c, for i in {9..1} ; do echo $i ; done"
          }
        ],
        "restartPolicy": "Never"
      }
    }
  }
}