我正在使用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/对其进行了验证。
为什么会出现此错误?
答案 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,因此原始语法检查对您没有帮助。