
# 网关型应用配置最佳实践
#### 应用场景
NGINX、API Gateway等网关型应用通常作为系统的统一流量入口，承担着高并发请求的调度、转发、认证等核心功能。
当系统面临短时间内大量外部请求（如促销活动、系统切换、定时任务触发等高峰时段）时，网关所在节点会迅速建立大量连接，此时节点的连接跟踪表会迅速增长。为了避免连接跟踪表打满后新建连接请求被内核丢弃，导致请求访问失败，需要采取措施确保连接跟踪表的容量能够应对这些高峰流量。
本文将为您提供网关型应用的配置建议，具体优化项如下：
- [优化kube-proxy配置]
- [增加告警配置]
 
 #### 优化kube-proxy配置
建议网关型应用根据请求量调整节点的kube-proxy中的连接跟踪表和等待时间配置，确保连接跟踪表的容量能够满足高峰诉求，避免连接跟踪表打满导致请求访问失败。
调整节点kube-proxy参数的步骤如下：
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，在左侧选择"节点管理"，在右侧选择"节点池"页签。
3. 单击节点池名称后的"配置管理"。
4. 在侧边栏滑出的"配置管理"窗口中，修改kube-proxy参数。 
   
   | 名称                   | 参数                               | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 取值        | 修改说明                                                                                      | 配置方式    |
   |:---|:---|:---|:---|:---|:---|
   | 节点连接跟踪表中保留的最小连接跟踪条目数 | conntrack-min                    | 用于设置Linux连接跟踪表（conntrack table）中保留的最小连接跟踪条目数。该参数确保系统始终预留指定数量的连接跟踪记录，即使当前实际连接数较低，以避免因动态分配/释放资源带来的性能开销。 可通过以下命令查询： ``` sysctl net.nf_conntrack_max ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 默认：131072 | -                                                                                         | 控制台/API |
   | TCP连接在关闭状态下等待的时间     | conntrack-tcp-timeout-close-wait | 控制TCP连接在关闭状态下等待的时间。 可通过以下命令查询： ``` sysctl net.netfilter.nf_conntrack_tcp_timeout_close_wait ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 默认：1h0m0s | -                                                                                         | 控制台/API |
   | IPVS调度策略             | node-ipvs-scheduler              | 控制节点IPVS负载均衡算法，如果未配置，则默认为Round Robin（轮询）算法。 支持的算法取值如下： - rr：表示Round Robin（轮询）算法，即按顺序循环将请求分配给后端服务器，所有服务器权重相等时，请求会被平均分配。  - lc：表示Least Connections（最少连接）算法，即优先将新请求分配给当前活跃连接数最少的后端服务器。  - dh：表示Destination Hashing（目标地址哈希）算法，即根据请求的目标IP地址进行哈希计算，分配请求到后端服务器。  - sh：表示Source Hashing（源地址哈希）算法，即根据请求的源IP地址进行哈希计算，将同一源IP的请求固定分配到同一台后端服务器。  - sed：表示Shortest Expected Delay（最短预期延迟）算法，分配请求给权重高的服务器，能更早发挥高性能服务器的能力。  - nq：表示Never Queue（永不排队）算法，当存在后端服务器的活跃连接数为0时，直接将请求分配给该服务器，无需计算公式，减少调度延迟。   | 默认: "rr"  | v1.28.15-r60、v1.29.15-r20、v1.30.14-r20、v1.31.10-r20、v1.32.6-r20、v1.33.5-r10及以上版本的集群支持该参数。 | 控制台/API |
      
   更多参数说明请参见[修改节点池配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0652.html)。
   
   
5. 单击"确定"，完成配置操作。 
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/caution_3.0-zh-cn.png)
   如果集群中包含不同的节点池，您需要确保将网关型应用调度至调整kube-proxy参数后的节点池中。操作详情请参见[设置节点亲和调度（nodeAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)。
   
   
 
 #### 增加告警配置
**告警配置**
1. 在集群中安装CCE节点故障检测插件，该插件将会为您监控集群节点的异常事件，请关注**连接跟踪表耗尽** 的检查项指标，该指标的默认告警阈值为90%。详情请参见[CCE节点故障检测](https://support.huaweicloud.com/usermanual-cce/cce_10_0132.html#section5)。
2. 安装云原生监控插件，并设置监控数据上报至AOM服务。详情请参见[云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)。
3. 开启告警中心，告警中心默认规则中包含**节点链接跟踪表不足** 的告警。详情请参见[通过告警中心一键配置告警](https://support.huaweicloud.com/usermanual-cce/cce_10_0724.html)。
   
   
   | 告警项       | 告警说明          | 告警类型 | 依赖项                                                    | PromQL                                           |
   |:---|:---|:---|:---|:---|
   | 节点链接跟踪表不足 | 检查节点链接跟踪表是否充足 | 指标类  | 云原生监控插件 节点故障检测插件 | problem_gauge{type="ConntrackFullProblem"} \>= 1 |
      
   
   
**触发告警后排查建议**
触发上述告警后，建议您排查内核日志（dmesg）中出现conntrack full的报错日志，说明Conntrack数量已经达到conntrack_max数量限制。您需要提升Linux连接跟踪Conntrack数量限制。
执行以下命令，确认目前Conntrack中的各协议占用情况和数量。
- 查看表明细，可以配合grep管道查看状态，也可以使用cat /proc/net/nf_conntrack查看。
  ```
  conntrack -L
  ```
  
- 查看计数
  ```
  cat /proc/sys/net/netfilter/nf_conntrack_count
  ```
  
- 查看表当前最大值
  ```
  cat /proc/sys/net/netfilter/nf_conntrack_max
  ```
  
**告警解决建议**
- 如果出现大量TCP协议的占用，您需要确认具体业务，如果是短连接型应用可以考虑整改成长连接型。
- 建议您在业务上线前进行压测，并观察对应指标，确认应用是否存在连接未及时释放的情况。
- 您可以通过扩容节点或调整kube-proxy参数来避免连接跟踪表打满导致无法新建链接的问题。
 
