Kubernetes 1.20环境下Ingress从networking.k8s.io/v1beta升级至v1后出现注册错误的技术求助
首先咱们拆解下你遇到的错误核心:
ComparisonError: failed to convert *unstructured.Unstructured to *v1beta1.Ingress: no kind "Ingress" is registered for version "networking.k8s.io/v1" in scheme "pkg/runtime/scheme.go:101"
这个错误说明有组件(可能是Helm客户端、集群内的Ingress控制器,或是你本地的K8s工具链)仍在依赖旧的networking.k8s.io/v1beta1 API Schema,无法识别新的v1版本Ingress资源。再加上你只修改了配置文件但没执行helm upgrade,集群里实际运行的Ingress还是旧版本,这就加剧了版本不匹配的冲突。
结合你的Kubernetes 1.20版本(该版本中networking.k8s.io/v1已是Ingress的稳定版),咱们一步步解决问题:
1. 对齐客户端版本(Kubectl + Helm)
旧版本的Kubectl或Helm可能不支持networking.k8s.io/v1的Ingress类型,先检查并适配:
- 检查Kubectl版本:执行
kubectl version --short,确保客户端版本和集群的1.20.x差距不超过1个小版本(比如1.19.x到1.21.x之间都可),版本过旧则升级。 - 检查Helm版本:执行
helm version,建议使用Helm 3.3及以上版本(该版本开始全面支持K8s 1.20的v1 Ingress)。
2. 执行Helm Upgrade更新集群内Ingress资源
你已经修改了ingress.yaml的apiVersion,但没执行升级,集群里的Ingress资源仍停留在v1beta1版本,这是关键遗漏步骤。执行以下命令完成更新:
helm upgrade {{ .Release.Name }} <你的Chart路径> -f <你的Values文件路径>
将命令中的占位符替换为你实际的Release名称、Chart路径和Values文件路径。
3. 验证Ingress Controller版本(以NGINX为例)
你使用的是NGINX Ingress Controller,需要确保它的版本支持networking.k8s.io/v1。K8s 1.20对应的NGINX Ingress Controller至少需要**0.44.0+**版本(从该版本开始原生支持v1 API)。
- 检查控制器版本:
kubectl get pods -n <Ingress控制器所在命名空间> -o jsonpath='{.items[*].metadata.labels.app\.kubernetes\.io/version}'
如果版本低于0.44.0,需升级NGINX Ingress Controller到适配版本。
4. 确认Ingress资源已成功升级
执行完helm upgrade后,检查集群内的Ingress资源版本是否切换到v1:
kubectl get ingress {{ .Release.Name }}-ingress -o yaml | grep apiVersion
输出若显示networking.k8s.io/v1,说明资源已更新完成。
额外注意点
- 如果你有自定义Operator或业务控制器在处理Ingress资源,需确保这些组件的代码已导入
networking.k8s.io/v1的Ingress包,并且在Scheme中注册了该类型(否则会继续出现类似转换错误)。 - 你的
ingress.yaml配置完全符合v1规范(比如正确使用了pathType、backend.service的嵌套结构),这部分无需调整。
内容的提问来源于stack exchange,提问作者Mina Fawzy

