Kubernetes 1.19部署Nginx Ingress失败:IngressClass nginx未找到
问题:Kubernetes 1.19.16部署NGINX Ingress控制器失败
部署环境
- 裸金属Ubuntu 18.04 LTS服务器
- Kubernetes版本:1.19.16
- 采用NGINX官方kubernetes-ingress仓库main分支部署,控制器版本2.3.1
部署步骤
$ git clone https://github.com/nginxinc/kubernetes-ingress.git cd kubernetes-ingress/deployments kubernetes-ingress/deployments$ git branch * main $ kubectl apply -f common/ns-and-sa.yaml $ kubectl apply -f rbac/rbac.yaml $ kubectl apply -f rbac/ap-rbac.yaml $ kubectl apply -f common/default-server-secret.yaml $ kubectl apply -f common/nginx-config.yaml $ kubectl apply -f deployment/nginx-ingress.yaml deployment.apps/nginx-ingress created
Pod状态
$ kubectl get pods -n nginx-ingress -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-75c4bd64bd-mm52x 0/1 Error 2 21s 10.244.1.5 k8s-master <none> <none>
资源状态
$ kubectl -n nginx-ingress get all NAME READY STATUS RESTARTS AGE pod/nginx-ingress-75c4bd64bd-mm52x 0/1 CrashLoopBackOff 12 38m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-ingress 0/1 1 0 38m NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-ingress-75c4bd64bd 1 1 0 38m
Pod日志
$ kubectl logs nginx-ingress-75c4bd64bd-mm52x -n nginx-ingress W1003 04:53:02.833073 1 flags.go:273] Ignoring unhandled arguments: [] I1003 04:53:02.833154 1 flags.go:190] Starting NGINX Ingress Controller Version=2.3.1 PlusFlag=false I1003 04:53:02.833158 1 flags.go:191] Commit=a8742472b9ddf27433b6b1de49d250aa9a7cb47e Date=2022-09-16T08:09:31Z DirtyState=false Arch=linux/amd64 Go=go1.18.5 I1003 04:53:02.844374 1 main.go:210] Kubernetes version: 1.19.16 F1003 04:53:02.846604 1 main.go:225] Error when getting IngressClass nginx: ingressclasses.networking.k8s.io "nginx" not found
Pod事件
$ kubectl describe pods nginx-ingress-75c4bd64bd-mm52x -n nginx-ingress Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m6s default-scheduler Successfully assigned nginx-ingress/nginx-ingress-75c4bd64bd-mm52x to k8s-worker-1 Normal Pulled 87s (x5 over 3m5s) kubelet Container image "nginx/nginx-ingress:2.3.1" already present on machine Normal Created 87s (x5 over 3m5s) kubelet Created container nginx-ingress Normal Started 87s (x5 over 3m5s) kubelet Started container nginx-ingress Warning BackOff 75s (x10 over 3m3s) kubelet Back-off restarting failed container
解决思路
核心问题是控制器启动时找不到名为nginx的IngressClass资源,且当前使用的main分支2.3.1版本与Kubernetes 1.19.16存在兼容性差异,可通过以下方式解决:
1. 手动创建缺失的IngressClass资源
创建名为ingress-class.yaml的文件,内容如下:
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: nginx spec: controller: nginx.org/ingress-controller
执行命令部署:
kubectl apply -f ingress-class.yaml
2. 切换到兼容Kubernetes 1.19的控制器版本
NGINX Ingress控制器2.3.1版本对Kubernetes版本要求较高,建议切换到支持1.19的稳定版本分支,比如v2.2.x:
cd kubernetes-ingress git checkout v2.2.0 cd deployments # 重新执行所有部署命令 kubectl apply -f common/ns-and-sa.yaml kubectl apply -f rbac/rbac.yaml kubectl apply -f rbac/ap-rbac.yaml kubectl apply -f common/default-server-secret.yaml kubectl apply -f common/nginx-config.yaml kubectl apply -f deployment/nginx-ingress.yaml
3. 修改部署YAML调整控制器参数
编辑deployment/nginx-ingress.yaml,在容器的args列表中添加--watch-ingress-class=false,禁用IngressClass的自动检查:
containers: - name: nginx-ingress image: nginx/nginx-ingress:2.3.1 args: - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret - --watch-ingress-class=false # 添加这一行
然后重新部署:
kubectl apply -f deployment/nginx-ingress.yaml
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

