在Kubernetes集群中,Ingress对集群服务(Service)中外部可访问的API对象进行管理,提供七层负载均衡能力。Nginx Ingress Controller负责实现Ingress的功能,根据规则配置负载均衡并提供访问入口。在高负载场景下,CPU资源和网络连接数的不足会影响应用的性能。本文介绍如何通过部署Nginx Ingress Controller来支撑高负载应用。
前提条件
- ACK集群中的Nginx Ingress Controller运行正常。
- 已安装kubectl命令行工具。
部署说明
部署高负载场景下的Nginx Ingress Controller需要考虑以下三个方面。- 硬件选型
在高并发场景下,Ingress对CPU资源和网络连接数占用都非常高,所以可选增强型ECS实例,例如:
- 计算型实例:ecs.c6e.8xlarge(32 Core 64 GB,600万PPS)
- 网络型实例:ecs.g6e.8xlarge(32 Core 128 GB,600万PPS)
- K8s配置
- 设置Ingress Pod独占节点资源,添加污点和节点标签:
kubectl label nodes $node_name ingress-pod="yes" kubectl taint nodes $node_name ingress-pod="yes":NoExecute
- 设置CPU Policy为
static
。 - 推荐调整ingress-controller service对应的SLB规格为超强型(slb.s3.large)。
- 推荐集群使用Terway网络插件及配置独占ENI。
- 设置Ingress Pod独占节点资源,添加污点和节点标签:
- Ingress配置
- 设置Ingress Pod为Guaranteed类型。
- 设置nginx-ingress-controller container的资源限制
requests
和limits
:15 Core 20 GiB。 - 设置initContainer init-sysctl的资源限制
requests
和limits
:100 m 70 MiB。
- 设置nginx-ingress-controller container的资源限制
- 删除Ingress Pod中的
podAntiAffinity
,使一个节点上可调度两个Pod。 - 调整Deployment Replicas数为新增节点数的2倍。
- 设置ConfigMap的
worker-processes
数为15(预留部分给系统使用)。 - 调整ConfigMap的
keepalive
链接最大请求数。 - 关闭日志访问记录。
- 设置Ingress Pod为Guaranteed类型。
步骤一:添加节点
选择指定集群,创建新的节点池并添加2台节点。
创建节点池需要配置的主要参数如下所示。具体操作,请参见管理节点池。
- 选择操作系统为Alibaba Cloud Linux 2.1903。
- 配置节点标签和污点(Taints)。
- 设置污点(Taints)的键为ingress-pod,值为yes,Effect为NoExecute。
- 设置节点标签的键为ingress-pod,值为yes。
- 选择CPU Policy为Static。

步骤二:配置Nginx Ingress Controller
执行kubectl edit deploy nginx-ingress-controller -n kube-system
命令打开Ingress Controller的配置文件,根据以下内容更新Ingress Controller的配置:
- 删除Pod反亲和性配置。
podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - ingress-nginx topologyKey: kubernetes.io/hostname
- 配置InitContainer的
requests
和limits
。resources: limits: cpu: 100m memory: 70Mi requests: cpu: 100m memory: 70Mi
- 修改nginx-ingress-controller container的
requests
和limits
都为15 Core 20 GiB。resources: limits: cpu: "15" memory: 20Gi requests: cpu: "15" memory: 20Gi
- 设置节点亲和性和容忍性。
nodeSelector: ingress-pod: "yes" tolerations: - effect: NoExecute key: ingress-pod operator: Equal value: "yes"
- 调整Replicas数为等于新增节点数的2倍。
- 关闭Metrics采集,修改启动参数,添加
--enable-metrics=false
。说明 如果不需要获取Metrics信息,推荐关闭Metrics采集。containers: - args: - /nginx-ingress-controller - --configmap=$(POD_NAMESPACE)/nginx-configuration - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --annotations-prefix=nginx.ingress.kubernetes.io - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb - --enable-metrics=false - --v=1