部署Kubernetes YAML文件时如何忽略错误?
问题分析与解决
你遇到的错误unknown field "spec.spec"根本原因是Deployment的YAML结构缩进错误:在Deployment的template字段下面,你把Pod的spec写成了和template同级,而不是嵌套在template内部,导致K8s API服务器解析时识别出非法的spec.spec字段。
K8s的API服务器采用严格解码模式,这种结构层面的错误是无法直接忽略的,必须先修正YAML的结构问题才能正常部署。
修正后的完整YAML文件
apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: mysqldb-1 labels: app.kubernetes.io: mysqldb-1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: mysqldb-2 labels: app.kubernetes.io: mysqldb-2 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi --- apiVersion: v1 kind: Service metadata: name: mysqldb-service labels: app.kubernetes.io: mysqldb spec: ports: - name: "5306" port: 5306 targetPort: 3306 selector: app.kubernetes.io: mysqldb status: loadBalancer: {} --- apiVersion: apps/v1 kind: Deployment metadata: name: mysqldb labels: app.kubernetes.io: mysqldb spec: replicas: 3 selector: matchLabels: app.kubernetes.io: mysqldb template: metadata: labels: app.kubernetes.io: mysqldb spec: # 注意此处缩进,需嵌套在template字段下 containers: - name: mysqldb # 修复原YAML的语法错误:-name需改为- name image: mysql:8.0 ports: - containerPort: 3306 volumeMounts: # volumeMounts属于容器字段,需缩进在containers下 - mountPath: /var/lib/mysql name: mysqldb-1 - mountPath: /docker-entrypoint-initdb.d/init.sql name: mysqldb-2 restartPolicy: Always volumes: - name: mysqldb-1 persistentVolumeClaim: claimName: mysqldb-1 - name: mysqldb-2 persistentVolumeClaim: claimName: mysqldb-2 status: {}
额外修正细节
除了核心的缩进问题,还修复了两个易导致部署失败的小错误:
- 容器定义中的
-name改为- name(缺少空格属于YAML语法错误) - 将
volumeMounts移至containers字段内部,原YAML中它处于Pod spec同级,会导致容器无法正常挂载卷
修正完成后,直接执行kubectl apply -f mysqldb.yaml即可部署,这类结构错误无法通过忽略绕过,必须修正才能通过K8s的API校验。
内容的提问来源于stack exchange,提问作者Trusha Mehta
相关产品推荐
相关产品推荐

