
# NGINX Ingress控制器插件升级检查异常处理
#### 检查项内容
- 检查项一：检查集群中是否存在未指定Ingress类型（annotations中未添加kubernetes.io/ingress.class: nginx）的Nginx Ingress路由。
- 检查项二：检查Nginx Ingress Controller后端指定的DefaultBackend Service是否存在。
- 检查项三：检查Nginx Ingress Controller指定的默认服务器证书密钥长度是否安全。（检查提示：ee key too small）
 
 #### 问题自检
**检查项一自检**
针对Nginx类型的Ingress资源，查看对应Ingress的YAML，如Ingress的YAML中未指定Ingress类型，并确认该Ingress由Nginx Ingress Controller管理，则说明该Ingress资源存在风险。关于该问题的触发原因详情，请参见[问题根因](https://support.huaweicloud.com/cce_faq/cce_faq_00430.html#section3)。
1. 获取Ingress类别。 
   您可以通过如下命令获取Ingress类别：
   ```
   kubectl get ingress <ingress-name> -oyaml | grep -E ' kubernetes.io/ingress.class: | ingressClassName:' -B 1
   ```
   - 故障场景：如果上述命令输出为空，说明Ingress资源未指定类别。
   
   - 正常场景：Ingress已通过annotations或ingressClassName指定其类别，即存在输出。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001659509288.png "点击放大")
     
    
   
   
2. 确认该Ingress被Nginx Ingress Controller纳管。如果使用ELB类型的Ingress则无此问题。 
   - 1.19集群可通过managedFields机制确认。
     ```
     kubectl get ingress <ingress-name> -oyaml | grep 'manager: nginx-ingress-controller'
     ```
     如果回显信息中包含"manager: nginx-ingress-controller"，表示已被纳管。
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001707906733.png "点击放大")
     
   
   - 其他版本集群可通过Nginx Ingress Controller Pod的日志确认。
     ```
     kubectl logs -nkube-system cceaddon-nginx-ingress-controller-545db6b4f7-bv74t | grep 'updating Ingress status'
     ```
     其中，*cceaddon-nginx-ingress-controller-545db6b4f7-bv74t*为Nginx控制器Pod名称。如果回显中看到类似 "updating Ingress status" namespace="default" ingress="your-ingress-name"的信息，表示已被纳管。
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001659507340.png "点击放大")
     
   
   
   若通过上述两种方式仍然无法确认，请联系技术支持人员。
   
   
**检查项二自检**
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，则无法通过该检查项。
   
   
**检查项三自检**
1. 在Nginx Ingress Controller部署的命名空间内查看是否指定有默认服务器证书。
   
   ```
   kubectl get pod cceaddon-nginx-ingress-<controller-name>-controller-*** -n <namespace> -oyaml | grep 'default-ssl-certificate'
   ```
   其中cceaddon-nginx-ingress-\<controller-name\>-controller-\*\*\*为Controller Pod名称，\<controller-name\>为安装插件时指定的控制器名称，\<namespace\>为Controller部署的命名空间。
   回显如下：
   ```
   - '--default-ssl-certificate=<namespace>/<secret-name>'
   ```
   其中\<secret-name\>为Nginx对应的默认服务器证书所在Secret名称。
   
   
2. 检查Nginx Ingress Controller对应的默认证书是否存在加密长度不足的安全风险。 
   ```
   kubectl get secret <secret-name> -n <namespace> -o=custom-columns=:'data.tls\.key' | base64 -d | openssl <encryption-algorithm> -noout -text
   ```
   其中\<encryption-algorithm\>为证书使用的加密算法，常见加密算法有：rsa、dsa等。
   RSA密钥长度查看方式：
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002110179614.png "点击放大")
   DSA密钥长度查看方式：
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002110180998.png "点击放大")
   
   
 
#### 解决方案
**检查项一解决方案**
为Nginx类型的Ingress添加注解，方式如下：
```
kubectl annotate ingress <ingress-name> kubernetes.io/ingress.class=nginx
```
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
ELB类型的Ingress无需添加该注解，请[确认]该Ingress被Nginx Ingress Controller纳管。
**检查项二** **解决方案**
重新创建DefaultBackend Service。
- 如果安装插件时，在"默认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
  ```
  
 
**检查项三** **解决方案**
- 修改[1]中指定证书的Secret，重新配置符合OpenSSL SECLEVEL的密钥长度的证书。SECLEVEL等级与密钥长度关系详请参见[OpenSSL官方文档](https://docs.openssl.org/3.3/man3/SSL_CTX_set_security_level/#default-callback-behaviour)。
- 通过在ssl-ciphers参数中添加@SECLEVEL字段，以启用更低安全等级证书的支持，详细操作请参见[NGINX Ingress控制器插件升级后无法使用TLS v1.0和v1.1](https://support.huaweicloud.com/cce_faq/cce_faq_00442.html)。
 
