问题现象
kubectl edit 或 apply 资源报如下错误:
1 | error: SchemaError(io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup_v2): invalid object doesn't have additional properties |
集群版本:v1.10
该问题网上已经有人遇到并解决,文末附原文地址
排查过程
使用
kubectl apply -f tmp.yaml --dry-run -v8
发现请求/openapi/v2
这个 api 之后,kubectl在 validate 过程报错。换成 kubectl 1.12 之后没有再报错。
kubectl get --raw '/openapi/v2'
发现返回的 json 内容与正常集群有差异,刚开始返回的 json title 为Kubernetes metrics-server
,正常的是 Kubernetes。怀疑是
metrics-server
的问题,发现集群内确实安装了 k8s 官方的metrics-server
,询问得知之前是 0.3.1,后面升级为了 0.3.5。将 metrics-server 回滚之后恢复正常。
metrics-server使用的镜像是:k8s.gcr.io/metrics-server-amd64:v0.3.2,国内下载失败可以转储到dockerhub等公有或自己的私有镜像仓库,或者使用我这个转储的镜像:chenzz/metrics-server-amd64:v0.3.1
原因分析
初步怀疑,新版本的 metrics-server 使用了新的 openapi-generator,生成的 openapi 格式和之前 k8s 版本生成的有差异。导致旧版本的 kubectl 在解析 openapi 的 schema 时发生异常,查看代码发现1.10 和 1.12 版本在解析 openapi 的 schema 时,实现确实有差异。
原文地址:https://k8s.imroc.io/avoid/cases/schemaerror-when-using-kubectl-apply-or-edit/