将 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 对象时出错