简体   繁体   English

kubectl 运行覆盖节点选择器:错误:无效的 JSON 补丁

[英]kubectl run override nodeselctor: error: Invalid JSON Patch

I'm trying to override the node selector for a kubectl run .我正在尝试覆盖kubectl run的节点选择器。

kubectl run -it powershell --image=mcr.microsoft.com/powershell:lts-nanoserver-1809-20211215 --restart=Never --overrides='{ "apiVersion": "v1", "spec": { "template": { "spec": { "nodeSelector": { "kubernetes.io/os": "windows" } } } } }' -- pwsh

But I get "Invalid Json Path".但我得到“无效的 Json 路径”。

This is my yaml if I do a deployment:如果我进行部署,这是我的 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 ...
spec:
  ...
  template:
    ...
    spec:
      ...
      nodeSelector:
        kubernetes.io/os: windows

and if I do get pods -o json I get:如果我get pods -o json我得到:

{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        ...
    },
    "spec": {
        ...
        "nodeSelector": {
            "kubernetes.io/os": "windows"
        }

kubectl run is a command to start a Pod . kubectl run是启动Pod的命令。 You can read more about it here你可以在这里阅读更多关于它的信息

kubectl run -it powershell --image=mcr.microsoft.com/powershell:lts-nanoserver-1809-20211215 --restart=Never --overrides='{ "apiVersion": "v1", "spec": { "template": { "spec": { "nodeSelector": { "kubernetes.io/os": "windows" } } } } }' -- pwsh

Using a command above you are trying run a Pod with specification "template": { "spec": { which is used only for Deployment and that is why you get an error Invalid Json Path .使用上面的命令,您正在尝试运行具有规范"template": { "spec": {Pod ,它仅用于Deployment ,这就是您收到错误Invalid Json Path的原因。

nodeSelector as you can see in documentation could be specify under spec in Pod config file as below:您可以在文档中看到的nodeSelector可以在Pod配置文件中的spec下指定,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

When you add --dry-run=client -o yaml to your command to see how the object would be processed, you will see below output which doesn't have nodeSelector :当您将--dry-run=client -o yaml到命令中以查看如何处理 object 时,您将在下面看到 output 没有nodeSelector

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: powershell
  name: powershell
spec:
  containers:
  - image: mcr.microsoft.com/powershell:lts-nanoserver-1809-20211215
    name: powershell
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

To solve your issue, you can delete template and spec from you command which should look as below:要解决您的问题,您可以从命令中删除templatespec ,如下所示:

kubectl run -it powershell --image=mcr.microsoft.com/powershell:lts-nanoserver-1809-20211215 --restart=Never --overrides='{ "apiVersion": "v1", "spec": { "nodeSelector": { "kubernetes.io/os": "windows" } } }' -- pwsh

Adding --dry-run=client -o yaml to see what will be changed, you will see that nodeSelector exist:添加--dry-run=client -o yaml看看会发生什么变化,你会看到nodeSelector存在:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: powershell
  name: powershell
spec:
  containers:
  - image: mcr.microsoft.com/powershell:lts-nanoserver-1809-20211215
    name: powershell
    resources: {}
  dnsPolicy: ClusterFirst
  nodeSelector:
    kubernetes.io/os: windows
  restartPolicy: Never
status: {}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM