Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yaml 在此上下文中不允许映射值_Yaml_Kubernetes_Kubectl - Fatal编程技术网

Yaml 在此上下文中不允许映射值

Yaml 在此上下文中不允许映射值,yaml,kubernetes,kubectl,Yaml,Kubernetes,Kubectl,我是YAML格式和kubernetes的新手 以下是dep_prom.yml文件 然而。。。当我执行kubectl create-f dep_prom.yml 错误:将YAML转换为JSON:YAML:47行时出错:在此上下文中不允许映射值 第47行是节点选择器:Westborch-kubeminion-1 我认为YAML文件格式是正常的 导致此错误的原因是什么?如上所述,nodeSelector不能有这样的值。它用于指定键值对的映射。您可以阅读有关具体用法的更多信息。例如,正确使用nodeSe

我是YAML格式和kubernetes的新手

以下是dep_prom.yml文件

然而。。。当我执行kubectl create-f dep_prom.yml

错误:将YAML转换为JSON:YAML:47行时出错:在此上下文中不允许映射值

第47行是节点选择器:Westborch-kubeminion-1

我认为YAML文件格式是正常的


导致此错误的原因是什么?

如上所述,nodeSelector不能有这样的值。它用于指定键值对的映射。您可以阅读有关具体用法的更多信息。例如,正确使用nodeSelector可能是:

    nodeSelector:
       disktype: ssd

默认情况下,“kubernetes.io/hostname”是包含节点名称而不是其IP地址的。这可以通过运行
$kubectl get nodes--show labels
来检查。因此,我建议进行以下更改:

  nodeSelector: 
    kubernetes.io/hostname: westporch-kubeminion-1

大多数情况下,当您遇到这样的错误时(用一般和有意义的术语来说),原因可能是:-

1) 。yaml文件中存在语法错误(在您的情况下不是)

2) 。或者像错误所说的“在这个上下文中不允许映射值”。这意味着您在yaml中使用的键/值可能在语法上正确,但在语义上不正确

例如,在您的案例中,上下文是“deployment”,它属于“apiversion:extensions/v1beta1”,它希望节点选择器如下所示:-

nodeSelector:
  kubernetes.io/hostname: 10.0.24.52

理想情况下,您不应该像上面那样使用IP,而应该使用这样的键值对:-
topologyKey:failure domain.beta.kubernetes.io/zone
,或者在您的情况下,它可以是这样的:-
kubernetes.io/hostname:zone-a-node

您表示您认为YAML格式是正常的,但它不是。这是由第一个文档末尾的行引起的YAML错误,从
kubernetes.io/hostname
开始,相对于前面的行缩进。因为它们都是键值对行(即块样式映射的项对),而不是

      nodeSelector: westporch-kubeminion-1
        kubernetes.io/hostname: 10.0.24.52
您需要执行以下操作之一:

      nodeSelector: westporch-kubeminion-1
      kubernetes.io/hostname: 10.0.24.52
但可能是
nodeSelector
需要一个映射作为参数,而不是现在的标量
westborch-kubeminion-1

      nodeSelector:
        kubernetes.io/hostname: 10.0.24.52

此错误可能会掩盖文件中的第二个错误,具体取决于kubernetes的宽容程度。
--
是指令结束标记,由于指令是可选的,因此它可以出现在YAML文档的开头。示例底部的一个指示新文档的开始。解决第一个错误后,您可能会收到一条关于基于该错误的单个文档的警告。(文档结尾标记由三个点组成:
在行首,后跟空格


当然,您所做的任何更改都应该符合kubernetes的预期,但上述流本身显然是无效的YAML。

在我的例子中,错误的原因是YAML中的第一行是空的


遇到此错误时-我强烈建议将yaml粘贴到yaml Linters(例如一个)中,这在某些情况下有助于更快地识别问题。

有时在yaml文件中,如果使用特殊字符,如
则需要将整行置于单引号中

查看gitlab文档中的这个示例

有时,脚本命令必须用单引号或双引号括起来。例如,包含冒号(:)的命令必须用单引号(')括起来。YAML解析器需要将文本解释为字符串,而不是“键:值”对* 例如,此脚本使用冒号:*

job:
  script:
    - curl --request POST --header 'Content-Type: application/json' "https://gitlab/api/v4/projects"
要被视为有效的YAML,必须将整个命令用单引号括起来。如果该命令已使用单引号,则应尽可能将其更改为双引号(“):


正如大多数人所提到的,yaml文件中有两个问题,yaml文件通常很难识别问题

幸运的是,它可以很容易地通过类似的工具识别,您可能不需要社区的帮助

安装它

npm install -g yaml-lint
下面是您可以验证的方法

E:\>yamllint docker-compose.yaml
√ YAML Lint successful.

在我的例子中,问题归结为缩进(格式)YML文件的。我被指向与错误无关的一行。我必须将该文件与我拥有的另一个项目进行比较。一旦我发现并修复了问题,该工具可用于验证。

删除
Westborch-kubeminion-1
节点选择器
是一个映射,而不是一个值字段。可能重复
npm install -g yaml-lint
E:\>yamllint docker-compose.yaml
√ YAML Lint successful.