Kubernetes集群升级至1.22版本时Ingress资源更新方法问询
K8s集群升级至1.22版本的Ingress资源适配方案
第一步:升级前存量Ingress资源扫描与备份
- 先扫描所有命名空间下的旧API Ingress资源,执行命令:
kubectl get ingress -A -o jsonpath='{range .items[?(@.apiVersion=="extensions/v1beta1")]}{.metadata.namespace}{"/"}{.metadata.name}{"\n"}{end}' - 全量备份现有Ingress资源:
kubectl get ingress -A -o yaml > ingress-all-backup.yaml,备份文件本地留存,避免适配出错时回滚使用。
第二步:旧API Ingress资源字段适配
extensions/v1beta1 转 networking.k8s.io/v1 核心需要修改几个字段:
- apiVersion从
extensions/v1beta1替换为networking.k8s.io/v1 - 原
backend字段拆分为defaultBackend(全局默认后端)和rules[].http.paths[].backend(路径匹配后端) - 路径字段必须指定
pathType,可选值为Prefix/Exact/ImplementationSpecific - 原
serviceName/servicePort字段替换为service.name+service.port.number(或service.port.name)结构 - 存量资源较多的场景可以用
kubectl convert命令批量自动转换配置,转换完成后人工核对关键字段(路径、后端服务、pathType)即可,提高适配效率。
适配前后的参考示例:
旧版本extensions/v1beta1配置示例:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress spec: backend: serviceName: test-svc servicePort: 80 rules: - host: test.example.com http: paths: - path: /test backend: serviceName: test-svc servicePort: 80适配后networking.k8s.io/v1配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: defaultBackend: service: name: test-svc port: number: 80 rules: - host: test.example.com http: paths: - path: /test pathType: Prefix backend: service: name: test-svc port: number: 80
第三步:分集群版本执行适配操作
针对1.19版本集群
K8s 1.19已经原生支持networking.k8s.io/v1版本Ingress,可在集群升级前直接替换所有存量Ingress的配置:
- 批量修改后直接apply到集群,新旧API版本的Ingress在1.19集群中可以同时生效,不会影响业务访问
- 适配完成后验证所有Ingress规则是否正常,后端服务访问无异常后再执行集群升1.22的操作
针对1.16版本集群
K8s 1.16对networking.k8s.io/v1的支持不完善,建议先把集群升级到1.19版本,再按上述1.19集群的适配步骤处理Ingress资源,最后再升级到1.22版本,避免跨大版本升级导致Ingress规则失效。
第四步:升级后验证
集群升级到1.22版本后,执行以下检查:
- 执行
kubectl get ingress -A确认所有Ingress资源状态正常,没有报错 - 逐条验证业务域名的访问路径是否符合预期,没有404或转发到错误后端的情况
- 清理残留的旧版本配置文件和临时文件,避免后续误操作
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

