3.2.9 nginx controller 最佳调度部署实践
Nginx Ingress Controller的性能和稳定性
使用合适的副本数和资源限制
默认情况下,通过集群创建或从组件中心安装的Nginx Ingress Controller的副本数为2,您可以根据业务的实际需要进行调整。
在部署Nginx Ingress Controller时,请确保Nginx Ingress Controller分布在不同的节点上,避免不同Nginx Ingress Controller之间资源的抢占和单点故障。您也可以为其使用独占节点来保证性能与稳定性,具体操作,请参见使用独占节点保证Nginx Ingress性能与稳定性。同时建议您不要为Nginx Ingress Controller设定资源限制,避免OOM所带来的流量中断。如果确实有限制的需要,建议资源限制CPU不低于1000 Milicore(YAML配置里格式为1000m)和内存不低于2 GiB。
通过Nginx Ingress Controller代理非HTTP请求
Nginx Ingress Controller 默认使用HTTP协议连接到后端服务,但同时提供了对多种后端协议的支持,其中比较常用的协议有WebSocket、HTTPS和gRPC。关于支持的后端协议具体类型,请参见Backend Protocol。
WebSocket:Nginx Ingress Controller提供了对WebSocket的原生支持,您不需要进行任何配置即可转发WebSocket连接。如果您有持续较长的WebSocket连接,可以通过Annotation适当地调整后端连接的超时时间,防止业务因为超时而断连。关于调整的具体操作,请参见Custom timeouts。
HTTPS:针对使用HTTPS的后端服务,您可以在Ingress中添加nginx.ingress.kubernetes.io/backend-protocol:"HTTPS"的Annotation切换为HTTPS连接。
gRPC:gRPC仅支持通过TLS端口访问。因此,请确保您的业务通过Nginx Ingress Controller访问gRPC服务时,使用的是加密的TLS端口。关于配置gRPC的具体操作,请参见通过Ingress Controller实现gRPC服务访问。
部署高负载场景的Ingress Controller
•硬件选型在高并发场景下,Ingress对CPU资源和网络连接数占用都非常高,所以可选增强型ECS实例
系统选择Aliyun操作系统
阿里云上的操作系统已经默认优化了一些常见参数,其他还需要调优的系统参数主要包括系统最大Backlog数和可用端口的最大范围。系统参数调优后可以保证Nginx处理高并发请求的能力,以及在连接后端时不会因为端口耗尽而失败。
•K8s配置
•设置Ingress Pod独占节点资源
•设置CPU Policy为static。
•推荐调整ingress-controller 1 service对应的SLB规格为超强型(slb.s3.large)。
•推荐集群使用Terway网络插件及配置独占ENI。
•Ingress配置
•设置Ingress Pod为Guaranteed类型。
•设置nginx-ingress-controller1container的资源限制requests和limits:15 Core 20 GiB。
•设置initContainer init-sysctl的资源限制requests和limits:100 m 70 MiB。
•删除Ingress Pod中的podAntiAffiffiffinity,使一个节点上可调度两个Pod。
•调整Deployment Replicas数为新增节点数的2倍。
•设置ConfifigMap的worker-processes数为15(预留部分给系统使用)。
•调整ConfifigMap的keepalive链接最大请求数。
•关闭日志访问记录。
按照负载配置HPA进行自动扩容
一般情况下,Nginx Ingress Controller已经有足够的能力应对业务的突发流量。如果在高负载情况下仍不满足您的要求,也可以配置HPA对Ingress Controller进行扩容。具体操作,请参见容器水平伸缩(HPA)。
提升Nginx Ingress Controller的可观测性
使用SLS和ARMS Prometheus服务提升可观测性
Nginx Ingress Controller提供了基于SLS日志以及Prometheus的监控大盘,帮助您更好地了解您的业务的流量情况。
•SLS日志:
•创建集群时,如果您已经选中了启用日志组件及Ingress Dashboard,您就可以直接通过容器服务管理控制台网络 > 路由页面的Ingress概览中查看到基于SLS日志服务提供的大盘服务,您也可以直接在运维管理 > 日志中心查看到Nginx Ingress Controller产生的相关日志。具体操作,请参见Ingress访问日志分析与监控。
•如果您在创建时没有选中日志以及Ingress的相关选项,也可以手动配置日志收集组件和规则。具体操作,请参见Ingress访问日志分析与监控。关于监控的更多信息,请参见Ingress Dashboard监控。
•ARMS Prometheus监控:ARMS Prometheus监控可以在创建集群时选择安装,或者在创建集群后通过运维管理 > Prometheus监控安装或查看。具体操作,请参见ARMS Prometheus监控。说明 使用ARMS Prometheus监控时,请为集群中的Ingress资源添加host字段,否则在默认情况下,该Ingress的部分metrics将会缺失。您也可以通过在Nginx Ingress Controller的Deployment中修改controller启动参数,加入--metrics-per-host=false来解决该问题。
使用AHAS流量防护实现流控
Nginx Ingress Controller整合了阿里云AHAS流量防护的产品功能,可以实现更加精细的流量控制。当有请求流量时,您可以在AHAS控制台中查看Nginx网关请求的实时QPS和RT等数据。具体开启的操作步骤,请参见使用Ingress-sentinel实现流控