更新时间:2024-06-26 GMT+08:00

nginx-ingress插件升级检查异常处理

检查项内容

  • 检查项一:检查集群中是否存在未指定Ingress类型(annotations中未添加kubernetes.io/ingress.class: nginx)的Nginx Ingress路由。
  • 检查项二:检查Nginx Ingress Controller后端指定的DefaultBackend Service是否存在。

问题自检

检查项一自检

针对Nginx类型的Ingress资源,查看对应Ingress的YAML,如Ingress的YAML中未指定Ingress类型,并确认该Ingress由Nginx Ingress Controller管理,则说明该Ingress资源存在风险。关于该问题的触发原因详情,请参见问题根因

  1. 获取Ingress类别。

    您可以通过如下命令获取Ingress类别:
    kubectl get ingress <ingress-name> -oyaml | grep -E ' kubernetes.io/ingress.class: | ingressClassName:'
    • 故障场景:如果上述命令输出为空,说明Ingress资源未指定类别。
    • 正常场景:Ingress已通过annotations或ingressClassName指定其类别,即存在输出。

  2. 确认该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. 在Nginx Ingress Controller部署的命名空间内查看对应的DefaultBackend Service。

    kubectl get pod cceaddon-nginx-ingress-<controller-name>-controller-*** -n <namespace> -oyaml | grep 'default-backend'

    其中cceaddon-nginx-ingress-<controller-name>-controller-***为Controller Pod名称,<controller-name>为安装插件时指定的控制器名称,<namespace>为Controller部署的命名空间。

    回显如下:

    - '--default-backend-service=<namespace>/<backend-svc-name>'

    其中<backend-svc-name>为Controller对应的DefaultBackend Service名称。

  2. 检查Nginx Ingress Controller对应的DefaultBackend Service是否存在。

    kubectl get svc <backend-svc-name> -n <namespace>

    如果无法查询到对应的Service,则无法通过该检查项。

解决方案

为Nginx类型的Ingress添加注解,方式如下:

kubectl annotate ingress <ingress-name> kubernetes.io/ingress.class=nginx

ELB类型的Ingress无需添加该注解,请确认该Ingress被Nginx Ingress Controller纳管。