将 YAML 转换为 JSON 时出错,未找到预期的密钥 kubernetes

Posted

技术标签:

【中文标题】将 YAML 转换为 JSON 时出错,未找到预期的密钥 kubernetes【英文标题】:error converting YAML to JSON, did not find expected key kubernetes 【发布时间】:2019-06-26 00:35:33 【问题描述】:

我正在谷歌云中做一个关于 kubernetes 的实验室。 我已经创建了 YAML 文件,但是当我尝试部署它时,shell 会向我显示此错误:

error converting YAML to JSON: yaml: line 34: did not find expected key

YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
    spec:
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
      - name: php-config
        configMap:
          name: php-config
      containers:
      - image: php-fpm:7.2
        name: php
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: persistent-storage
          mountPath: /var/www/data
        - name: php-config
          mountPath: /usr/local/etc/php-fpm.d/www.conf
          subPath: www.conf
      - image: nginx:latest
        name: nginx
        - containerPort: 80
        volumeMounts:
        - name: persistent-storage
          mountPath: /var/www/data
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
        - name: persistent-storage
          persistentVolumeClaim:
            claimName: nfs-pvc

【问题讨论】:

【参考方案1】:

整个文件看起来不错。 缩进存在一些问题。

YAML 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
    spec:
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
      - name: php-config
        configMap:
          name: php-config
      containers:
      - image: php-fpm:7.2
        name: php
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: persistent-storage
            # looks like indentation issue here                 
            mountPath: /var/www/data 
        - name: php-config
            # looks like indentation issue here                 
            mountPath: /usr/local/etc/php-fpm.d/www.conf
            subPath: www.conf
      - image: nginx:latest
        name: nginx
        - containerPort: 80
        volumeMounts:
        - name: persistent-storage
            mountPath: /var/www/data
        - name: nginx-config
            mountPath: /etc/nginx/nginx.conf
            subPath: nginx.conf
      volumes:
        - name: persistent-storage
          persistentVolumeClaim:
            claimName: nfs-pvc

【讨论】:

我在想,在打孔卡时代,FORTRAN 已经留下了压痕问题。如果只有人们会清醒过来并使用 TABS 而不是空格! :) YAML 中不允许使用制表符 - “为了保持可移植性,缩进中不得使用制表符字符,因为不同的系统对制表符的处理方式不同。”参见spec【参考方案2】:

yamllint 包对于调试和查找此类错误很有用,只需执行yamllint filename,它将列出它发现的可能问题。通过您的发行版包管理器安装(如果可用,通常推荐)或通过以下 npm install 命令(它将全局安装)

npm install -g yaml-lint

感谢 Kyle VG 提供的 npm 命令

【讨论】:

对于 Ubuntu 用户 sudo apt-get update && sudo apt-get install yamllint -y. 对于 Centos7 用户,sudo yum check-update && sudo yum install yamllint Prettier vscode 扩展也可以验证。【参考方案3】:

我在使用 Helm 为 Ingress 创建 yaml 文件时遇到了这个错误。我有这样的东西作为我的 Ingress 规范

spec:
  tls:
  - hosts:
    -  .Values.ingress.host 

在 values.yaml 中

ingress:
  host: "[NAMESPACE]-example.com"

原来是括号导致错误。

可以通过使用 quote 函数在值上加上引号来解决此问题。

-  .Values.ingress.host | quote 

这也是Helm doc推荐的

避免类型转换错误的最简单方法是显式处理字符串,隐式处理其他所有内容。或者,简而言之,引用所有字符串

和here

在处理字符串数据时,引用字符串总是比将它们保留为空字更安全:

【讨论】:

【参考方案4】:

按照higuita 的回答,您可以在不使用npx 在您的机器中安装模块的情况下检查您的yaml 并检查错误。对于我不打算经常使用的命令,我更喜欢这种方法。 NPX 下载包,执行命令并在完成时删除包。

npx yaml-lint yamllint file_name

【讨论】:

对于 Ubuntu 用户 sudo apt-get update && sudo apt-get install yamllint -y.【参考方案5】:

虽然上面的 yaml 文件看起来不错,但缩进是问题所在(在查看文件时几乎看不到)。可能导致此错误的另一个问题是文件存在问题,例如缺少字段名称或冒号。

【讨论】:

【参考方案6】:

我遇到了同样的问题,但是我解决了复制 RAW Github 文件的链接并将其设置在 kubectl 上

kubectl create -f https://raw.githubusercontent.com/user/project/master/file.yml

【讨论】:

【参考方案7】:

确保您没有任何导致您问题的不可见字符。

这个错误:

error converting YAML to JSON: yaml: line 96: could not find expected '':''

是因为这一行中的 : 和 C 之间存在不可见的中断:

- name: CERT_ALIAS

【讨论】:

以上是关于将 YAML 转换为 JSON 时出错,未找到预期的密钥 kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 Helm 图表错误,例如“将 YAML 转换为 JSON 时出错:yaml:在此上下文中不允许映射值”?

Azure DevOps YAML 管道错误:解析块映射时未找到预期的密钥

在 ReactJS 应用程序中将字符串转换为 JSON 对象时出错

如何将php json数组转换为yaml

YamlDotNet 在 C# 中将 YAML 转换为 JSON

将 XML 响应转换为 Json 时出错