Getting Status code 422 when creating Kubernetes Job using nodejs

8/19/2021

I am creating a Kubernetes Job within NodeJS class After importing the library @kubernetes/client-node, I created an object to use the module BatchV1Api inside the function which I am exporting to other class in which I have defined the body of the Kubernetes job like this:

//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;

Then I created a router class to request the post method like:

import post from './listJobs.js';

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

when executing the application and requesting the route localhost:3000/api/v1/newJob as a post request in postman, it is showing status code 422 (with some very long output, as in the screenshot) in the vs code terminal and some Kubernetes information in postman body, but it is not creating any job or pod.

KubeJobTerminalError

Does anyone have any idea, why there is 422 code at the end?

-- shivam
javascript
kubernetes
kubernetes-jobs
node.js

1 Answer

8/20/2021

Status code 422 Unprocessable Entity means that server understand the content type, and the syntax of the request is correct, but it was unable to process the contained instructions.

In your case though, the Job manifest looks off.

I'm not an expert in JavaScript kubernetes client, but newJob body looks weird. The resulting yaml should look like this

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

In your case the second spec is a child of spec. It should be a child of template, so:

{
  "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"
      }
    }
  }
}
-- p10l
Source: StackOverflow