kubectl edit 或者 apply 报 SchemaError 错误

问题现象

kubectl edit 或 apply 资源报如下错误:

1
error: SchemaError(io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup_v2): invalid object doesn't have additional properties

集群版本:v1.10

该问题网上已经有人遇到并解决,文末附原文地址

排查过程

  1. 使用 kubectl apply -f tmp.yaml --dry-run -v8 发现请求 /openapi/v2 这个 api 之后,kubectl在 validate 过程报错。

  2. 换成 kubectl 1.12 之后没有再报错。

  3. kubectl get --raw '/openapi/v2' 发现返回的 json 内容与正常集群有差异,刚开始返回的 json title 为 Kubernetes metrics-server,正常的是 Kubernetes。

  4. 怀疑是 metrics-server 的问题,发现集群内确实安装了 k8s 官方的 metrics-server,询问得知之前是 0.3.1,后面升级为了 0.3.5。

  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/

-------------本文结束感谢您的阅读-------------