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资源存在风险。关于该问题的触发原因详情,请参见问题根因。
- 获取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 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名称。
- 检查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纳管。
检查项二解决方案
- 如果安装插件时,在“默认404服务”配置项中指定了自定义的DefaultBackend Service,请您自行重新创建相同的Service。
- 如果安装插件时使用默认的DefaultBackend Service,则重新创建的YAML示例如下。
apiVersion: v1 kind: Service metadata: name: cceaddon-nginx-ingress-<controller-name>-default-backend # <controller-name>为控制器名称 namespace: kube-system labels: app: nginx-ingress-<controller-name> app.kubernetes.io/managed-by: Helm chart: nginx-ingress-<version> # <version>为插件版本 component: default-backend heritage: Helm release: cceaddon-nginx-ingress-<controller-name> annotations: meta.helm.sh/release-name: cceaddon-nginx-ingress-<controller-name> meta.helm.sh/release-namespace: kube-system # 插件安装的命名空间 spec: ports: - name: http protocol: TCP port: 80 targetPort: http selector: app: nginx-ingress-<controller-name> component: default-backend release: cceaddon-nginx-ingress-<controller-name> type: ClusterIP sessionAffinity: None ipFamilies: - IPv4 ipFamilyPolicy: SingleStack internalTrafficPolicy: Cluster