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

时间:2017-06-02 11:26:10

标签: yaml kubernetes kubectl

我是关于YAML格式和kubernetes的新手。

以下是 dep_prom.yml 文件。

SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition; 

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

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

第47行是 nodeSelector:westporch-kubeminion-1

我认为YAML文件格式正常。

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

8 个答案:

答案 0 :(得分:2)

就我而言,错误的错误原因是Yaml中的第一行为空。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在大多数情况下,当您遇到这样的错误(用通俗易懂的术语讲)时,原因可能是:-

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

2)。或类似错误说“在此上下文中不允许映射值”。这意味着您在Yaml中使用的键/值在语法上可能是正确的,但在语义上可能不是正确的。

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

nodeSelector:
  kubernetes.io/hostname: 10.0.24.52

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

答案 3 :(得分:1)

您表示您认为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需要一个映射作为参数而不是现在的标量westporch-kubeminion-1

      nodeSelector:
        kubernetes.io/hostname: 10.0.24.52

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

当然,您所做的任何更改都应确认kubernetes的期望,但是上面的流显然对YAML本身无效。

答案 4 :(得分:1)

就我而言,问题归结为 YML 文件的缩进(格式)。我被指向一条与错误无关的行。我不得不将文件与我拥有的另一个项目进行比较。 https://www.kubeval.com 工具有助于在我发现并解决问题后进行验证。

答案 5 :(得分:0)

如前所述,nodeSelector不能具有这样的值。它是指定键值对的映射。您可以详细了解具体用法here。例如,nodeSelector的正确用法可能是:

    nodeSelector:
       disktype: ssd

答案 6 :(得分:0)

有时在 yaml 文件中,如果您使用像 : 这样的特殊字符,则需要将整行放在单引号中 '

从 gitlab 文档中查看此示例 https://docs.gitlab.com/ee/ci/yaml/README.html#script

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

job:
  script:
    - curl --request POST --header 'Content-Type: application/json' "https://gitlab/api/v4/projects"

要被视为有效的 YAML,您必须将整个命令用单引号括起来。如果命令已使用单引号,则应尽可能将其更改为双引号 ("):

job:
  script:
    - 'curl --request POST --header "Content-Type: application/json" "https://gitlab/api/v4/projects"'

答案 7 :(得分:0)

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

幸运的是,它可以使用 yaml lint 等工具轻松识别,而且您可能不需要社区的帮助。

安装

npm install -g yaml-lint

以下是验证方法

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