【问题标题】:Received error about getting "array" and expecting "map" while my YAML seems right在我的 YAML 似乎正确时收到有关获取“数组”并期待“地图”的错误
【发布时间】:2019-02-05 09:52:02
【问题描述】:

我正在使用 k8s 1.11.2 构建我的服务,YAML 文件如下所示:

部署

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-test
  namespace: default
  labels:
  - type: test 
spec:
  replicas: 1
  selector:
    matchLabels:
    - type: test 
  template:
    metadata:
      labels:
      - type: test 
    spec:
      containers:
      - image: nginx:1.14
        name: filebeat
        ports:
        - containerPort: 80

服务

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test
spec:
  type: ExternalName
  externalName: my.nginx.com
  externalIPs:
  - 192.168.125.123
  clusterIP: 10.240.20.1
  ports: 
  - port: 80
    name: tcp
  selector:
  - type: test

我得到这个错误:

错误验证数据:[ValidationError(Service.metadata.labels): 无效的类型 io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta.labels:得到“数组”, 预期的“地图”,ValidationError(Service.spec.selector):无效类型 对于 io.k8s.api.core.v1.ServiceSpec.selector:得到“数组”,预期 “地图”];

我确定我的 YAML 文件的格式是正确的,因为我使用了网站 http://www.yamllint.com/ 来验证它。

为什么会出现这个错误?

【问题讨论】:

  • 我的问题是:为什么不显示错误所在的哪一行?在一个大的 yaml 文件中,这个错误完全没有用,因为我不知道它在哪里。要求 kubectl 告诉我们它在哪里发现错误是不是太过分了?

标签: kubernetes yaml


【解决方案1】:

yamllint.com 是一个可疑的服务,因为它没有告诉我们它正在检查哪个 YAML 版本以及它正在使用哪个实现。避免它。

更重要的是,虽然您的输入可能是有效的 YAML,但这并不意味着它是 Kubernetes 的有效输入。 YAML 允许您创建任何类型的结构,而 kubernetes 期望您提供某种结构。这就是错误告诉您的内容:

得到“数组”,预期“地图”

这意味着在 kubernetes 需要 mapping 的地方,您提供了一个数组(sequence 用正确的 YAML 术语表示)。该错误消息还为您提供了发生此问题的路径:

ValidationError(Service.metadata.labels):

对 kubernetes 中元数据标签的快速检查发现 this documentation,其中指出标签需要是映射,而不是数组。

所以在你的输入中,这里的最后一行是罪魁祸首:

metadata:
  name: nginx-test
  namespace: default
  labels:
  - type: test

- 是序列项的 YAML 指示符,创建一个序列作为键 labels: 的值。删除它会使它变成一个映射:

metadata:
  name: nginx-test
  namespace: default
  labels:
    type: test

【讨论】:

  • 您建议注意错误消息中给出的路径...然后您自己忽略了它:(
  • 谢谢,即使知道这些东西与 yaml 一起工作也很无聊,以至于我需要启发每一个错误。很多时候,它甚至没有说哪个文件有问题
【解决方案2】:

在 yaml 格式中,字符“-”表示数组的开头。

你有:

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test

你想要:

apiVersion: v1
kind: Service
metadata:
    labels:
      type:test

【讨论】:

    【解决方案3】:

    问题出在您的第二个文件中:

    apiVersion: v1
    kind: Service
    metadata:
        labels:
        - type:test
            #  ^
    

    在插入符号 (^) 上方缺少一个空格,使 type:test 成为单个标量(字符串),而不是您使用的映射

    apiVersion: v1
    kind: Service
    metadata:
        labels:
        - type: test
    

    你的程序期望什么。

    两者都是有效的 YAML,因此原始语法检查对您没有帮助。

    【讨论】:

      【解决方案4】:

      将 values.yaml 中的值渲染到 config.yaml :

      values.yaml:


      sites:
        - dataprovider: abcd
        - dataprovider: xyzx
      

      config.yaml:


           sites:
       {{ toYaml .Values.sites | indent 10 }}
      

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 2019-03-19
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多