【问题标题】:error converting YAML to JSON, did not find expected key kubernetes将 YAML 转换为 JSON 时出错,未找到预期的密钥 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

【问题讨论】:

    标签: kubernetes yaml


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-10
            • 1970-01-01
            • 2019-12-13
            • 2020-05-02
            • 1970-01-01
            • 1970-01-01
            • 2021-12-08
            • 2021-10-03
            相关资源
            最近更新 更多