Yaml 在此上下文中不允许映射值
我是YAML格式和kubernetes的新手 以下是dep_prom.yml文件 然而。。。当我执行kubectl create-f dep_prom.yml 错误:将YAML转换为JSON:YAML:47行时出错:在此上下文中不允许映射值 第47行是节点选择器:Westborch-kubeminion-1 我认为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
导致此错误的原因是什么?如上所述,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.