使用 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
在你的例子中,第二个 spec
是 spec
的 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"
}
}
}
}
我正在 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
在你的例子中,第二个 spec
是 spec
的 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"
}
}
}
}