我使用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/网站进行了验证。
为什么会出现此错误?
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)
小智 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)
| 归档时间: |
|
| 查看次数: |
6889 次 |
| 最近记录: |