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

李向朋*_*李向朋 2 yaml kubernetes

我使用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
Run Code Online (Sandbox Code Playgroud)

服务

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
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

验证数据时出错:[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/网站进行了验证。

为什么会出现此错误?

fly*_*lyx 8

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

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

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

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

ValidationError(Service.metadata.labels):

快速查看kubernetes中的元数据标签会发现此文档该文档指出标签需要是映射,而不是数组。

因此,在您的输入中,最后一行是罪魁祸首:

metadata:
  name: nginx-test
  namespace: default
  labels:
  - type: test
Run Code Online (Sandbox Code Playgroud)

-是序列项的YAML指示符,用于创建序列作为key的值labels:。删除它会使其成为映射:

metadata:
  name: nginx-test
  namespace: default
  labels:
    type: test
Run Code Online (Sandbox Code Playgroud)

  • 您建议注意错误消息中给出的路径...然后您自己忽略了它:( (3认同)

小智 5

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

你有:

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test
Run Code Online (Sandbox Code Playgroud)

你要:

apiVersion: v1
kind: Service
metadata:
    labels:
      type:test
Run Code Online (Sandbox Code Playgroud)