Kubernetes 升级后 ingress api 变化带来的问题

将 k8s 从 1.17.0 升级到 1.22.3 之后部署 ingress 时报错

error: unable to recognize "cnblogs-ingress.yaml": no matches for kind "Ingress" in version "extensions/v1beta1"

原来从 1.19 开始 ingress api 版本变成了 networking.k8s.io/v1,详见 https://github.com/kubernetes/kubernetes/issues/90077

改为 networking.k8s.io/v1 后出现新的报错

missing required field "pathType" in io.k8s.api.networking.v1.HTTPIngressPath

我们添加的 ingress 规则多数是基于域名的,之前正常使用的配置如下

rules:
- host: q.cnblogs.com
  http:
    paths:
      - backend:
          serviceName: q-web
          servicePort: 80

而 v1 版必须要指定 pathpathType,需要改成下面这样

rules:
- host: q.cnblogs.com
  http:
    paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: q-web
          servicePort: 80

我们添加了很多这样的规则,幸好可以通过替换的方式一次修改,不然还挺麻烦,将 - backend: 替换为

- path: /
          pathType: Prefix
          backend:

解决上面的问题后部署又出现新的报错

unknown field "serviceName" in io.k8s.api.networking.v1.IngressBackend
unknown field "servicePort" in io.k8s.api.networking.v1.IngressBackend

要将

backend:
  serviceName: q-web
  servicePort: 80

改为

backend:
  service:
    name: q-web
    port: 
      number: 80

继续通过替换进行批量修改,将 serviceName: 替换为

service:
              name:

servicePort: 替换为

  port: 
                number:

后来发现还需要在 spec 中添加 ingressClassName: nginx,不然 ingress 规则不会被添加到 nginx.conf 中。

apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: cnblogs-ingress
spec:
  ingressClassName: nginx 
  rules:
  - host: q.cnblogs.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: q-web
              port: 
                number: 80

搞定!

ingress.networking.k8s.io/cnblogs-ingress configured

补充:另外需要在 nginx-ingress 部署配置中

  • rbac.authorization.k8s.io/v1beta1 改为 rbac.authorization.k8s.io/v1
  • image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.29.0 改为 image: docker.io/bitnami/nginx-ingress-controller:latest
原文地址:https://www.cnblogs.com/dudu/p/15548461.html