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

Wes*_*rch 24 yaml kubernetes kubectl

我是 YAML 格式和 kubernetes 的新手。

下面是一个dep_prom.yml文件。

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    name: prometheus-deployment
  name: prometheus
  #namespace: prometheus
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus:master
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "-config.file=/etc/prometheus/prometheus.yml"
        - "-storage.local.path=/prometheus"
        - "-storage.local.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: "/prometheus"
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      volumes:
      - name: data
        hostPath:
          path: /data/prometheus
      - name: config-volume
        configMap:
          name: prometheus
      nodeSelector: westporch-kubeminion-1
        kubernetes.io/hostname: 10.0.24.52
---
Run Code Online (Sandbox Code Playgroud)

但是......当我执行kubectl create -f dep_prom.yml

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

第 47 行是nodeSelector: westporch-kubeminion-1

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

是什么导致了这个错误?

Ant*_*hon 16

您表示您认为 YAML 格式是正常的,但事实并非如此。这是由第一个文档末尾的行导致的 YAML 错误,从kubernetes.io/hostname相对于它之前的缩进开始。因为这些都是键值对行(即块样式映射的项目对)而不是

      nodeSelector: westporch-kubeminion-1
        kubernetes.io/hostname: 10.0.24.52
Run Code Online (Sandbox Code Playgroud)

你要么需要做:

      nodeSelector: westporch-kubeminion-1
      kubernetes.io/hostname: 10.0.24.52
Run Code Online (Sandbox Code Playgroud)

但它可能nodeSelector需要一个映射作为参数而不是westporch-kubeminion-1它现在拥有的标量。

      nodeSelector:
        kubernetes.io/hostname: 10.0.24.52
Run Code Online (Sandbox Code Playgroud)

此错误可能会掩盖文件中的第二个错误,具体取决于 kubernetes 的宽松程度。的---是结束指示标记,并且由于指令是可选它可以在一个YAML文档的开始发生。示例底部的那个表示新文档的开始。一旦您解决了第一个错误,您可能会收到有关基于该错误的单个文档的警告。(文档结束标记由三个点组成:...在一行的开头,后跟空格。

当然,您所做的任何更改都应确认 kubernetes 所期望的内容,但上述流显然作为 YAML 本身无效。


Rad*_*iel 8

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

\n

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

\n

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

\n
job:\n  script:\n    - curl --request POST --header \'Content-Type: application/json\' "https://gitlab/api/v4/projects"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
job:\n  script:\n    - \'curl --request POST --header "Content-Type: application/json" "https://gitlab/api/v4/projects"\'\n
Run Code Online (Sandbox Code Playgroud)\n


Suh*_*nna 7

大多数时候,当您遇到这样的错误(用一般且有意义的术语来说)时,要么是因为:-

1)。yaml 文件中存在语法错误(在您的情况下不是)。使用YAML linter确保您的语法正确。(感谢 @rtmy 的回答,我现在在此处包含YAML Linter。)

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

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

nodeSelector:
  kubernetes.io/hostname: 10.0.24.52
Run Code Online (Sandbox Code Playgroud)

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


Rtm*_*tmY 5

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

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


Mig*_*yes 5

就我而言,问题归结为 YAML 文件的缩进(格式)。我被指向与错误无关的一行。我必须将该文件与我的另一个项目进行比较。https://www.kubeval.com上的工具对于验证我是否找到并解决了问题很有用。


小智 1

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

    nodeSelector:
       disktype: ssd
Run Code Online (Sandbox Code Playgroud)