將 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 版必須要指定 path
與 pathType
,需要改成下面這樣
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