当我的YAML似乎正确时,收到关于获取“数组”和期待“地图”的错误

时间:2018-08-30 12:35:24

标签: kubernetes yaml

我正在使用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/对其进行了验证。

为什么会出现此错误?

3 个答案:

答案 0 :(得分:6)

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

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

  

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

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

  

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

答案 1 :(得分:2)

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

您有:

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

您要

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

答案 2 :(得分:1)

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

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

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

获得的映射
apiVersion: v1
kind: Service
metadata:
    labels:
    - type: test

以及您的程序期望什么。

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