NGINX Ingress控制器插件升级导致集群内Nginx类型的Ingress路由访问异常
问题现象
集群中存在未指定Ingress类型(annotations中未添加kubernetes.io/ingress.class: nginx)的Nginx Ingress路由,NGINX Ingress控制器插件从1.x版本升级至2.x版本后,服务中断。
问题自检
针对Nginx类型的Ingress资源,查看对应Ingress的YAML,如Ingress的YAML中未指定Ingress类型,并确认该Ingress由Nginx Ingress Controller管理,则说明该Ingress资源存在风险。
- 获取Ingress类别。
- 确认该Ingress被Nginx Ingress Controller纳管。如果使用ELB类型的Ingress则无此问题。
- 1.19集群可由通过managedFields机制确认。
kubectl get ingress <ingress-name> -oyaml | grep 'manager: nginx-ingress-controller'
- 其他版本集群可通过Nginx Ingress Controller Pod的日志确认。
kubectl logs -nkube-system cceaddon-nginx-ingress-controller-545db6b4f7-bv74t | grep 'updating Ingress status'
若通过上述两种方式仍然无法确认,请联系技术支持人员。
- 1.19集群可由通过managedFields机制确认。
解决方案
为Nginx类型的Ingress添加注解,方式如下:
kubectl annotate ingress <ingress-name> kubernetes.io/ingress.class=nginx
ELB类型的Ingress无需添加该注解,请确认该Ingress被Nginx Ingress Controller纳管。
问题根因
NGINX Ingress控制器插件基于开源社区Nginx Ingress Controller的模板与镜像。
对于社区较老版本的Nginx Ingress Controller来说(社区版本v0.49及以下,对应CCE插件版本v1.x.x),在创建Ingress时没有指定Ingress类别为nginx,即annotations中未添加kubernetes.io/ingress.class: nginx的情况,也可以被Nginx Ingress Controller纳管。详情请参见社区代码。
但对于较新版本的Nginx Ingress Controller来说(社区版本v1.0.0及以上,对应CCE插件版本2.x.x),如果在创建Ingress时没有显示指定Ingress类别为nginx,该资源将被Nginx Ingress Controller忽略,Ingress规则失效,导致服务中断。详情请参见请参见社区代码。
社区相关PR链接为:https://github.com/kubernetes/ingress-nginx/pull/7341
目前有两种方式指定Ingress类别:
- 通过annotations指定,为Ingress资源添加annotations(kubernetes.io/ingress.class: nginx)。
- 通过spec指定,.spec.ingressClassName字段配置为nginx。但需要配套具有IngressClass资源。
示例如下:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test namespace: default annotations: kubernetes.io/ingress.class: nginx spec: ingressClassName: nginx rules: … status: loadBalancer: {}
网络异常 所有常见问题
- 工作负载网络异常时,如何定位排查?
- 集群内部无法使用ELB地址访问负载
- 集群外部访问Ingress异常
- CCE集群中域名解析失败
- 为什么访问部署的应用时浏览器返回404错误码?
- 为什么容器无法连接互联网?
- VPC的子网无法删除,怎么办?
- 如何修复出现故障的容器网卡?
- 节点无法连接互联网(公网),如何排查定位?
- 如何解决VPC网段与容器网络冲突的问题?
- ELB四层健康检查导致java报错:Connection reset by peer
- Service事件:Have no node to bind,如何排查?
- 为什么登录虚拟机VNC界面会间歇性出现Dead loop on virtual device gw_11cbf51a, fix it urgently?
- 集群节点使用networkpolicy概率性出现panic问题
- 节点远程登录界面(VNC)打印较多source ip_type日志问题
- 使用IE浏览器访问nginx-ingress出现重定向308无法访问
- NGINX Ingress控制器插件升级导致集群内Nginx类型的Ingress路由访问异常
- 负载均衡型Service更新出现错误:Quota exceeded for resources: members_per_pool
more