升级cert-manager至v1.8.2后查询CR资源报无效API版本错误
问题根因
这个报错不是集群中存在正在使用v1alpha2版本的CR实例,核心原因是卸载旧版本cert-manager时没有完全清理旧CRD资源,残留了旧API版本的存储标记、转换配置。cert-manager v1.6及以上版本已经完全移除了对acme.cert-manager.io/v1alpha2、cert-manager.io/v1alpha2两个旧API版本的转换支持,API Server读取CRD中残留的旧版本标记时找不到对应转换逻辑,就会抛出该错误。
注意:Helm安装/升级cert-manager时不会自动覆盖已存在的CRD资源,如果卸载旧版本时没有手动删除旧CRD,新版本安装过程不会更新原有CRD配置,是这类问题最常见的触发场景。
排查步骤
- 检查所有cert-manager相关CRD的存储版本标记,确认是否残留旧版本记录,执行命令:
kubectl get crd -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.storedVersions}{"\n"}{end}' | grep -E 'cert-manager|acme'
正常返回结果中,所有CRD的storedVersions字段应该仅包含v1,如果出现v1alpha2、v1beta1等值即为异常。
- 检查CRD的转换配置是否残留旧版本webhook规则,执行命令:
kubectl get crd orders.acme.cert-manager.io -o yaml | grep -A10 conversion
如果配置中存在指向旧版本webhook的地址、或者残留v1alpha2相关的转换版本声明,也会触发报错。
解决方法
- 先备份现有cert-manager所有自定义资源,避免操作失误导致配置丢失:
kubectl get clusterissuers,issuers,certificates,orders,challenges -A -o yaml > cert-manager-backup.yaml
- 给所有cert-manager相关CRD打补丁,清除残留的旧版本存储标记,以
orders.acme.cert-manager.io为例,执行补丁命令:
kubectl patch crd orders.acme.cert-manager.io --type='json' -p='[{"op": "replace", "path": "/status/storedVersions", "value":["v1"]}]'
需要执行相同补丁操作的CRD列表如下:
- challenges.acme.cert-manager.io
- orders.acme.cert-manager.io
- certificaterequests.cert-manager.io
- certificates.cert-manager.io
- clusterissuers.cert-manager.io
- issuers.cert-manager.io
如果补丁操作提示无法修改status字段,可以将对应CRD导出为本地yaml文件,手动修改
status.storedVersions字段值为["v1"]后,执行kubectl replace -f <修改后的CRD文件路径> --force强制替换即可。
- 逐个编辑上述CRD,清理残留的旧版本配置:
执行编辑命令:
kubectl edit crd <CRD名称>
需要修改两处配置:
- 找到
spec.versions配置段,仅保留name: v1的版本配置块,删除所有name为v1alpha2、v1alpha3、v1beta1的旧版本配置块 - 找到
spec.conversion配置段,将strategy字段值改为None,删除下方残留的webhook服务相关配置块
- 重启cert-manager命名空间下的所有工作负载,让配置生效:
kubectl rollout restart deployment -n cert-manager
- 执行原查询命令验证修复结果:
kubectl get orders,challenges,clusterissuers
命令正常返回资源列表即代表修复完成。
内容的提问来源于stack exchange,提问作者Lucas Borges
相关产品推荐
相关产品推荐

